[转]android 获取视频帧
16lz
2021-01-25
本文转自:http://blog.csdn.net/heart_Moving/article/details/17414067
今天做Android视频文件解码,需求:从一个视频文件获取到一帧一帧的图片。
总结如下:
首先看代码:
MediaDecoder.java
[html] view plain copy print?- importandroid.graphics.Bitmap;
- importandroid.media.MediaMetadataRetriever;
- importandroid.util.Log;
- publicclassMediaDecoder{
- privatestaticfinalStringTAG="MediaDecoder";
- privateMediaMetadataRetrieverretriever=null;
- privateStringfileLength;
- publicMediaDecoder(Stringfile){
- if(CommonUtils.checkFile(file)){
- retriever=newMediaMetadataRetriever();
- retriever.setDataSource(file);
- fileLength=retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
- Log.i(TAG,"fileLength:"+fileLength);
- }
- }
- /**
- *获取视频某一帧
- *@paramtimeMs毫秒
- *@paramlistener
- */
- publicbooleandecodeFrame(longtimeMs,OnGetBitmapListenerlistener){
- if(retriever==null)returnfalse;
- Bitmapbitmap=retriever.getFrameAtTime(timeMs*1000,MediaMetadataRetriever.OPTION_CLOSEST);
- if(bitmap==null)returnfalse;
- listener.getBitmap(bitmap,timeMs);
- returntrue;
- }
- /**
- *取得视频文件播放长度
- *@return
- */
- publicStringgetVedioFileLength(){
- returnfileLength;
- }
- }
import android.graphics.Bitmap;import android.media.MediaMetadataRetriever;import android.util.Log;public class MediaDecoder {private static final String TAG = "MediaDecoder";private MediaMetadataRetriever retriever = null;private String fileLength;public MediaDecoder(String file) {if(CommonUtils.checkFile(file)){retriever = new MediaMetadataRetriever();retriever.setDataSource(file);fileLength = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);Log.i(TAG, "fileLength : "+fileLength);}}/** * 获取视频某一帧 * @param timeMs 毫秒 * @param listener */public boolean decodeFrame(long timeMs,OnGetBitmapListener listener){if(retriever == null) return false;Bitmap bitmap = retriever.getFrameAtTime(timeMs * 1000, MediaMetadataRetriever.OPTION_CLOSEST);if(bitmap == null) return false;listener.getBitmap(bitmap, timeMs);return true;}/** * 取得视频文件播放长度 * @return */public String getVedioFileLength(){return fileLength;}}
这里是获取视频帧工具,调试的时候遇到一些问题:
其中一个是getFrameAtTime参数的使用,先看方法原型:public Bitmap getFrameAtTime(long timeUs, int option) 第一个参数是传入时间,只能是us(微秒) ,当时我传入的ms,获取的总是第一帧,所以这个问题都弄了好久。
然后是第二个参数,先看看官方解释:
OPTION_CLOSEST 在给定的时间,检索最近一个帧,这个帧不一定是关键帧。
OPTION_CLOSEST_SYNC 在给定的时间,检索最近一个同步与数据源相关联的的帧(关键帧)。
OPTION_NEXT_SYNC 在给定时间之后检索一个同步与数据源相关联的关键帧。
OPTION_PREVIOUS_SYNC 顾名思义,同上
这里为了提取我们想要的帧,不使用关键帧,所以用 OPTION_CLOSEST .
更多相关文章
- 在android中用TimePicker和DatePicker或者TimePickerDialog和Dat
- Android(安卓)Processdialog 用法
- Android(安卓)OkHttp基本用法
- 2014.07.23(2) ——— android FragmentPagerAdapter的notifyDataS
- Android中简单的日期格式化
- Android中再按一次退出实现
- 【Android】ExpandableListView 默认展开
- Android启动流程简析(三)
- Android判断两个时间的间隔