MediaMetadataRetriever

MediaMetadataRetriever

我有一些H264视频流需要在我的Android应用中显示。如果我将MediaCodec与表面一起使用,则视频可以毫无问题地解码到我的应用程序,并且可以在此表面上看到它。

但是我还需要在特定时刻获取视频的位图(即在SD卡上存储某些帧)。是否可以将MediaCodec库配置为返回字节数组,而不是直接向表面工作?

另一个选择是直接从表面获取位图,但是我在SDK上也找不到该选项。

最佳答案

您可以使用MediaMetadataRetriever

MediaMetadataRetriever mediaMetadataRetriever=new MediaMetadataRetriever(); //should be stored as an instance variable
mediaMetadataRetriever.setDataSource(mVideo.getVideoUrl(Video.SD));
int time = videoView.getCurrentPosition()* 1000; //micro-to-milliseconds
Bitmap bmFrame = mediaMetadataRetriever.getFrameAtTime(time);


编辑:

要在不涉及UI的情况下检索原始字节数据,可以逐帧提前时间,获取位图并将其转换为字节数组。

为了提高效率,请考虑分叉FFmpegMediaMetadataRetriever,其FFmpegMediaMetadataRetriever.java的方法private native byte [] _getFrameAtTime(long timeUs, int option);跳过了整个位图转换过程。

09-28 09:43