JavaのWebアプリケーション開発フレームワークによる、Webサイト開発の顛末記です。

EclipseのMavenを使った、Spring-MVC、Thymeleaf、MyBatis 等のプログラミングテクニックを、
備忘録的に記録しています。実際に動くソースコードを多用して説明していますので、
これからEclipseや、Spring-MVCを始めたいと思っている人にとって、少しでも参考になれば幸いです。
Spring-MVCの散歩道 > 応用の森(Java編) > 動画ファイルから静止画を切り出すサンプル

package jp.dip.arimodoki.blogic;

import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;

import javax.imageio.ImageIO;

import org.apache.commons.codec.binary.Base64;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Java2DFrameConverter;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import jp.dip.arimodoki.common.CConst;
import jp.dip.arimodoki.model.FormVideoSlice;

/**
* 静止画切り出し処理するビジネスロジッククラスです。
*/
@Scope("singleton")    //singleton リソース保護
@Service
public class BlVideoSlice implements CConst {

    //動画情報フォームビーン(コントローラから継承される)
    private FormVideoSlice  formVideoSlice;

    /**
     * フォームBeanの継承
     * アクションコントローラで取得したFormBeanを継承する
     * @param form 動画情報フォームビーン
     */
    public void setForm(FormVideoSlice form) {
        this.formVideoSlice = form;
    }

    /**
     * 動画ファイルから、静止画を切り出す
    */
    public void getFrame() throws Exception {
        //送信された動画ファイル情報を取得
        MultipartFile[] files = this.formVideoSlice.getUploadfile();
        //送信されたファイルの個数分(ここでは1個のみ)処理を行います
        //viewから送信されたされた画像データストリームを取得する
        InputStream is = files[0].getInputStream();
        //FrameGrabber初期化
        FFmpegFrameGrabber frameGrabber= new FFmpegFrameGrabber(is);
        //フレームコンバータ初期化
        Java2DFrameConverter frameConverter = new Java2DFrameConverter();

        frameGrabber.start();    //スライス開始
        int count = 0;
        //アウトプットストリーム生成
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        // 現在のフレーム番号が動画ファイルの総フレーム数に到達するまでループ
        while (frameGrabber.getFrameNumber() < frameGrabber.getLengthInFrames()) {
            // カレントフレームを取りだす
            BufferedImage img = frameConverter.convert(frameGrabber.grab());
            if (img == null) {
                // BufferedImageが取得できないことがあるので、そのときはスキップ
                continue;
            }

            // 静止画像をoutputストリームに出力する
            ImageIO.write(img, "jpg", os);

            count++;
            break;    //最初の1frameのみでやめる
        }
        is.close();
        frameGrabber.stop();    //FrameGrabber停止
        frameGrabber.close();   //FrameGrabberクローズ

        //静止画ストリームをbase64エンコードする
        String base64 = new String(Base64.encodeBase64(os.toByteArray()), "ASCII");
        //base64返却情報を生成
        StringBuffer data = new StringBuffer();
        //返却画像タイプはJPEG固定
        data.append("data:image/jpeg;base64,");
        data.append(base64);
        //レスポンスデータをフォームビーンにセット
        this.formVideoSlice.setBase64Jpg(data.toString());
        os.close();
    }
}