動画の指定秒のフレームをBitmapとして取得する

動画の再生にはVideoViewMediaPlayerなどを使用することが多いと思います。

ファイルパスを渡すだけで手軽に再生できるので便利ですが、指定秒のフレームを画像として取得するAPIは存在しません。

なので、指定秒のフレームをBitmapとして取得するにはMediaMetadataRetrieverを使用します。

使用例

実際の使用例は次のようなコードです。

videoView = (VideoView) findViewById(R.id.videoView);
getFrameButton = (Button) findViewById(R.id.getFrameButton);

videoView.setVideoPath("ファイルパス");

long msec = videoView.setDataSource(filePath);

getFrameButton.setOnClickListener(new View.OnClickListener()
{    
    @Override
    public void onClick(View v)
    {
        MediaMetadataRetriever retriever = new MediaMetadataRetriever();
        retriever.setDataSource("ファイルパス");
        
        long msec = videoView.getCurrentPosition();
        Bitmap bitmap = retriever.getFrameAtTime(msec * 1000);
    }
});

MediaMetadataRetriever#getFrameAtTimeメソッドで指定マイクロ秒のBitmapを取得することができます。

ここで注意しなければならないのはVideoViewなどのgetCurrentPositionメソッドの返す時間はミリ秒だということです。

ミリ秒なのでgetFrameAtTimeで時間を指定するときはそれを1000倍してマイクロ秒に変換しなくてはいけません。

問題点

一応これでフレーム画像を取得できるのですが、1つ問題点があります。

それは現在VideoViewなどに表示されているフレームを正確に取得できるとは限らないという問題です。

なぜならVideoViewgetCurrentPositionはマイクロ秒ではなくそれよりも大きい単位のミリ秒で返されるからです。

この問題を解決するには自前で動画処理を実装するか、あるいはFFMPEGなどのフレームワークを使えば解決できるかもしれません。

FFMPEGの導入方法についてはhttps://trac.ffmpeg.org/wiki/Setup_Eclipse_IDE_for_FFmpeg_(Linux)に詳しく載っています。

関連項目
プライバシーポリシー