2

これは私が使用している関数です:

public Bitmap getVideoFrame(String FD, long time) {
    MediaMetadataRetriever retriever = new MediaMetadataRetriever();
    try {
        retriever.setDataSource(FD);
        return retriever.getFrameAtTime(time * 1000, MediaMetadataRetriever.OPTION_CLOSEST);
    } catch (IllegalArgumentException ex) {
        ex.printStackTrace();
    } catch (RuntimeException ex) {
        ex.printStackTrace();
    } finally {
        try {
            retriever.release();
        } catch (RuntimeException ex) {
        }
    }
    return null;
}

ここで、FDはビデオ時間のパスです= videoview.getCurrentPosition();

問題は、この関数が取得する必要のある正確なフレームを取得しないことです。長いビデオ(20分)では、短いビデオ(10〜20秒)よりも正確になります。足りないものはありますか?そうでない場合は、レトリバーの代わりに何を使用できますか?

4

5 に答える 5

2

オプションなしで使用してみてください...

retriever.getFrameAtTime(time * 1000);

私は同じ問題を抱えていました、そして私がこの修正をした後、それは完璧に働きました。

于 2014-04-28T11:35:08.830 に答える
1

その機能にバグがあり、それは明らかに小さなサイズのビデオでは機能せず、信頼性が非常に低いです、私は最近ここでこの質問をしましたSOこの投稿を参照してください、しかし正しい答えが得られなかったので、私は多くの研究をして使用しましたFFMPEG代わりに、FFMPEGミリ秒単位で正確にビデオフレームを抽出できました。また、携帯電話でフレームを抽出するプロセスは遅く、50Mbを超える大きなビデオの場合、必要なものを抽出するのに2分かかることがよくあります。

于 2013-02-11T16:14:47.527 に答える
1
retriever.getFrameAtTime(second* 1000*1000);

マイクロ秒は必要ですが、ミリ秒は必要ありません。

于 2015-09-11T10:44:52.010 に答える
0

はい、retriever.getFrameAtTimeが正確ではないことに同意します。

getFrameAtAndroidの方法を置き換えるための代替ソリューションMediaMetadataRetrieverAV_FrameCaptureMediaCodec、ビデオフレームをデコードし、OpenGLビデオフレームをRGBビットマップとして変換するために使用します。AndroidMediaMetadataRetrieverは、呼び出し時に結果を返すことを保証しないためgetFrameAtTime、このAV_FrameCaptureを使用して、ビデオのフレームを正確に抽出できます。

https://stackoverflow.com/a/60633395/6676310

于 2020-03-11T10:09:27.823 に答える
-3
ImageView imageView1=(ImageView)findViewById(R.id.imageView1);

Bitmap bm=ThumbnailUtils.createVideoThumbnail(Environment.getExternalStorageDirectory() + "/videocapture.3gp",Thumbnails.MICRO_KIND);

imageView1.setImageBitmap(bm);
于 2014-11-24T06:40:59.170 に答える