2

我刚刚开始进行android开发。

我一直在尝试从手机上的视频文件中提取帧,如下所示:

MediaMetadataRetriever retriever = new MediaMetadataRetriever();
retriever.setDataSource(getApplicationContext(),linkToVideo); // linkToVideo is Uri
ImageView frameView = (ImageView) findViewById(R.id.video_frame);
frameView.setImageBitmap(retriever.getFrameAtTime(frameTime,MediaMetadataRetriever.OPTION_CLOSEST)); // frameTime in microseconds

这适用于 640x480 .mp4 视频,但不适用于我的相机录制的 1280x720 .3gp 文件。这只需要很长时间,最终应用程序停止响应。当我使用 OPTION_CLOSEST_SYNC 时,一切运行顺利,但是我对获得的不仅仅是同步帧感兴趣。

关于如何解决这个问题的任何想法?我试图避免视频编码,但如果没有其他选择,我会求助于它。

提前感谢您花时间帮助我。

4

2 回答 2

1

尝试FFmpegMediaMetadataRetriever

import wseemann.media.FFmpegMediaMetadataRetriever;

...

FFmpegMediaMetadataRetriever retriever = new FFmpegMediaMetadataRetriever();
retriever.setDataSource(getApplicationContext(),linkToVideo); // linkToVideo is  Uri
ImageView frameView = (ImageView) findViewById(R.id.video_frame);
frameView.setImageBitmap(retriever.getFrameAtTime(frameTime,MediaMetadataRetriever.OPTION_CLOSEST)); // frameTime in microseconds
于 2015-03-17T15:05:15.793 回答
0

将 MediaPlayer.currentPosition 乘以 1000

SNAPSHOT_DURATION_IN_MILLIS * 1000

例子

    val mediaMetadataRetriever = MediaMetadataRetriever()

    return try {

        println("mediaPlayer.currentPosition.toLong(): ${mediaPlayer?.currentPosition?.toLong()}")

        mediaMetadataRetriever.setDataSource(context, uri)

        val bitmap = mediaPlayer?.let { mediaMetadataRetriever.getFrameAtTime(it.currentPosition.toLong()*1000, MediaMetadataRetriever.OPTION_CLOSEST) }

        bitmap

    } catch (t: Throwable) {

        // TODO log

        null

    } finally {

        try {

            mediaMetadataRetriever.release()

        } catch (e: RuntimeException) {

            //

        }

    }
于 2021-09-17T11:16:53.913 回答