2012-04-17 18 views
11

MediaMetadataRetriever.getFrameAtTime()はいつでも同じフレームを返します。 は私のコードandroidのビデオファイルからフレームを取得する方法

private ArrayList<Bitmap> getFrames(String path){ 
    try { 
     ArrayList<Bitmap> bArray = new ArrayList<Bitmap>(); 
     bArray.clear(); 
     MediaMetadataRetriever mRetriever = new MediaMetadataRetriever(); 
     mRetriever.setDataSource(getDataSource(path)); 

     for (int i = 3000; i <60000; i=i+5000) { 
      bArray.add(mRetriever.getFrameAtTime(i, MediaMetadataRetriever.OPTION_CLOSEST_SYNC)); 

     } 

     return bArray; 
    } catch (Exception e) { 
     // TODO: handle exception 

     return null; 

    } 
} 

この方法を見て、常にあなたはフレームをフェッチするFFMPEGのようなものを使用する必要があるとしている

+1

これはドキュメントごとに期待できる動作です:*「このメソッドは、可能であれば**指定されたオプションを考慮して、指定された時間位置に近い代表フレームを見つけ出し**、ビットマップとして返​​します。このようなフレームを取得できない場合は、nullでもかまいません。* –

+0

@MH。私はビデオファイルからフレームを取得することができますどのように返信いただきありがとうございます。私の[質問]を見てください(http://stackoverflow.com/questions/10071408/how-to-get-frames-of-video-file-in-android) –

+2

3年後、まだそれを見つけるのが難しいm解決策のために...誰もが解決策について知っていますか? –

答えて

9

私はあなたのビデオがどのくらいあるかわからないが、getTimeAtFrameのための時間として長いVARに使用する時間がMICRO

EXで表現しなければならない:1秒のビデオが1000000を持っていますUSeconds、非常に短い期間(あなたのような)を使用する場合は、あなたがビデオを持っている最初のフレームだけを取得することは非常にラッキーです!

+0

forループの値は何ですか?コードを示して説明してください。 – Nepster

+1

この問題がありました私は間違いなく使用されている時間間隔とは関係がないと確信しています。そして、OPの例はマイクロ秒を使用しています。 –

0

レオンペレティエが正しいです。問題は、MediaMetadataRetriever.getFrameAtTime()は、第2レベルでビデオからキーフレームのみを抽出できることです。たとえば、動画の再生時間が約4秒の場合は、 または5つの異なるフレームしか取得できません。すべてのビデオフレームを取得するには、MediaCodecを参照してください。

+0

これは回答として投稿してはいけないと思います。コメントとして投稿する必要があります。 – Jaimesh

+0

私の元の答えは同じフレームの質問に反応し、タイトルにも反応するように修正しました。 – DeTac

関連する問題