本文转自:http://blog.csdn.net/heart_Moving/article/details/17414067

今天做Android视频文件解码,需求:从一个视频文件获取到一帧一帧的图片。

总结如下:

首先看代码:

MediaDecoder.java

[html] view plain copy print?
  1. importandroid.graphics.Bitmap;
  2. importandroid.media.MediaMetadataRetriever;
  3. importandroid.util.Log;
  4. publicclassMediaDecoder{
  5. privatestaticfinalStringTAG="MediaDecoder";
  6. privateMediaMetadataRetrieverretriever=null;
  7. privateStringfileLength;
  8. publicMediaDecoder(Stringfile){
  9. if(CommonUtils.checkFile(file)){
  10. retriever=newMediaMetadataRetriever();
  11. retriever.setDataSource(file);
  12. fileLength=retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
  13. Log.i(TAG,"fileLength:"+fileLength);
  14. }
  15. }
  16. /**
  17. *获取视频某一帧
  18. *@paramtimeMs毫秒
  19. *@paramlistener
  20. */
  21. publicbooleandecodeFrame(longtimeMs,OnGetBitmapListenerlistener){
  22. if(retriever==null)returnfalse;
  23. Bitmapbitmap=retriever.getFrameAtTime(timeMs*1000,MediaMetadataRetriever.OPTION_CLOSEST);
  24. if(bitmap==null)returnfalse;
  25. listener.getBitmap(bitmap,timeMs);
  26. returntrue;
  27. }
  28. /**
  29. *取得视频文件播放长度
  30. *@return
  31. */
  32. publicStringgetVedioFileLength(){
  33. returnfileLength;
  34. }
  35. }
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 .

更多相关文章

  1. 在android中用TimePicker和DatePicker或者TimePickerDialog和Dat
  2. Android(安卓)Processdialog 用法
  3. Android(安卓)OkHttp基本用法
  4. 2014.07.23(2) ——— android FragmentPagerAdapter的notifyDataS
  5. Android中简单的日期格式化
  6. Android中再按一次退出实现
  7. 【Android】ExpandableListView 默认展开
  8. Android启动流程简析(三)
  9. Android判断两个时间的间隔

随机推荐

  1. 哪里可以下载Android的源代码
  2. Android入门教程(三十)------之XML解析与
  3. android中TextView图文混排
  4. Android源码下载断线
  5. Android相对布局RelativeLayout详解
  6. Android-FrameLayout(帧布局)
  7. [转]Android DNS 代码分析
  8. Android通过ADB命令获取当前运行的Activi
  9. Windows下NDK开发环境搭建,Eclipse+ADT+CD
  10. android 简单快速 倒计时动画