12

MediaMetadataRetriever.getFrameAtTime()は、呼び出すたびに常に同じフレームを返します。私のコードを見てください

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;

    }
}

このメソッドは常に同じフレームを返します

4

3 に答える 3

11

あなたのビデオの長さはわかりませんが、時間として長い変数で使用する時間はマイクロgetTimeAtFrameで表す必要があります

例:1秒のビデオには1000000 USecondsがあります。非常に短い期間を使用する場合(あなたのように)、ビデオが持っている最初のフレームのみを取得するには非常に幸運である必要があります!!!

于 2013-04-23T15:06:49.300 に答える
4

フレームをフェッチするには、FFMPEGなどを使用する必要があります。

NDKを使用し、Android用にFFMPEGをコンパイルする必要があります。残念ながら、それは非常に簡単なことではありません。

いくつかの出発点:

http://ffmpeg.org/

androidのffmpeg(チュートリアル: "ffmpeg and Android.mk"を使用)

幸運を!

于 2012-05-12T17:49:04.360 に答える
2

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

于 2017-08-24T09:32:26.340 に答える