我有一些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);
跳过了整个位图转换过程。