Android MediaMetadataRetriever 从视频中截取某一帧图片
从视频中截取某一帧图片保存到本地
最近遇到一个问题,拍摄完视频后需要在视频中选择一帧当作视频封面
在Android中有这样一个类MediaMetadataRetriever
**官方API解释:MediaMetadataRetriever class provides a unified interface for retrieving frame and meta data from an input media file.
大概意思就是说:mediametadataretriever类提供了一个统一的接口用于从一个输入媒体文件中取得帧和元数据。**
对于官方的解释,这个类的用途我们大概已经知道了就是获取一个媒体文件的一些基本信息,比如视频文件或者音乐文件的总时长,或者视频文件的宽度和高度等基本信息
本文中使用的就是这个类MediaMetadataRetriever去从视频中获取某一帧
下面是效果图
下面是具体的代码实现
mMetadataRetriever = new MediaMetadataRetriever();
//mPath本地视频地址
mMetadataRetriever.setDataSource(mPath);
//这个时候就可以通过mMetadataRetriever来获取这个视频的一些视频信息了
String duration = mMetadataRetriever.extractMetadata(android.media.MediaMetadataRetriever.METADATA_KEY_DURATION);//时长(毫秒)
String width = mMetadataRetriever.extractMetadata(android.media.MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH);//宽
String height = mMetadataRetriever.extractMetadata(android.media.MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT);//高
//上面三行代码可以获取这个视频的宽高和播放总时长
//下面这行代码才是关键,用来获取当前视频某一时刻(毫秒*1000)的一帧
Bitmap bitmap = mMetadataRetriever.getFrameAtTime(mCovervideoview.getCurrentPosition()*1000, MediaMetadataRetriever.OPTION_CLOSEST);
//这时就可以获取这个视频的某一帧的bitmap了
虽然效果出来了,但是还有一个不小的问题
在下面的seekbar拖动的时候上面的VideoView并不是平滑滑动的,而是从一个画面突然蹦到另一个画面
于是就查了一下VideoView的seekto方法,最后找到原因了。
在使用Android中的VideoView或者是MediaPlayer的seekto的时候,它定位的不是具体时刻的某一帧,而是离当前时刻最近的关键帧
所以在滑动的时候就会造成画面的不连续。要怎么使滑动的时候视频连续呢,是不是把视频的每一帧都变成关键帧,具体的思路和实现方法还在思考中……
上一篇: CSS
下一篇: 窦建德率大军救援王世充,结果如何?