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

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

总结如下:

首先看代码:

MediaDecoder.java

  1. import android.graphics.Bitmap;
  2. import android.media.MediaMetadataRetriever;
  3. import android.util.Log;
  4. public class MediaDecoder {
  5. private static final String TAG = "MediaDecoder";
  6. private MediaMetadataRetriever retriever = null;
  7. private String fileLength;
  8. public MediaDecoder(String file) {
  9. if(CommonUtils.checkFile(file)){
  10. retriever = new MediaMetadataRetriever();
  11. retriever.setDataSource(file);
  12. fileLength = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
  13. Log.i(TAG, "fileLength : "+fileLength);
  14. }
  15. }
  16. /**
  17. * 获取视频某一帧
  18. * @param timeMs 毫秒
  19. * @param listener
  20. */
  21. public boolean decodeFrame(long timeMs,OnGetBitmapListener listener){
  22. if(retriever == null) return false;
  23. Bitmap bitmap = retriever.getFrameAtTime(timeMs * 1000, MediaMetadataRetriever.OPTION_CLOSEST);
  24. if(bitmap == null) return false;
  25. listener.getBitmap(bitmap, timeMs);
  26. return true;
  27. }
  28. /**
  29. * 取得视频文件播放长度
  30. * @return
  31. */
  32. public String getVedioFileLength(){
  33. return fileLength;
  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 .

[转]android 获取视频帧的更多相关文章

  1. Android CameraX ImageAnalysis 获取视频帧

    CameraX使用ImageAnalysis分析器,可以访问缓冲区中的图像,获取视频帧数据. 准备工作 准备工作包括gradle,layout,动态申请相机权限,外部存储权限等等,大部分设置与Came ...

  2. Android -- 获取视频第一帧缩略图

    干货 从API 8开始,新增了一个类: android.media.ThumbnailUtils这个类提供了3个静态方法一个用来获取视频第一帧得到的Bitmap,2个对图片进行缩略处理. public ...

  3. android 获取视频缩略图终极解决方案(ffmpeg)

    http://blog.csdn.net/u010499721/article/details/50338623 前些天有个师弟(在做一个仿LinkInEyes行车记录仪的app)问我怎么获取视频缩略 ...

  4. 利用ffmpeg获取视频帧

    如果要对视频帧进行处理,可以先把视频帧读取出来. sh文件代码如下: #!/usr/bin/env sh VIDEO=/home/xxx/video/ FRAMES=/home/xxx/frame/ ...

  5. Android 获取视频照片与刷新媒体库

    1.获取本地所有视频 public void getLoadMedia() { Cursor cursor = UILApplication.instance.getApplicationContex ...

  6. Android -- 获取摄像头帧数据解码

    由于Android下摄像头预览数据只能  ImageFormat.NV21 格式的,所以解码时要经过一翻周折. Camera mCamera = Camera.open(); Camera.Param ...

  7. Android 播放视频并获取指定时间的帧画面

    最近做的项目要求既能播放视频(类似于视频播放器),又能每隔1s左右获取一帧视频画面,然后对图片进行处理,调查了一周,也被折磨了一周,总算找到了大致符合要求的方法.首先对调查过程中涉及到的方法进行简单介 ...

  8. FFmpeg进行视频帧提取&音频重采样-Process.waitFor()引发的阻塞超时

    由于产品需要对视频做一系列的解析操作,利用FFmpeg命令来完成视频的音频提取.第一帧提取作为封面图片.音频重采样.字幕压缩等功能: 前一篇文章已经记录了FFmpeg在JAVA中的使用-音频提取&am ...

  9. Android之使用MediaMetadataRetriever类获取视频第一帧

    一.首先,来介绍一下MediaMetadataRetriever类,此类位于android.media包下,这里,先附上可查看此类的API地址:MediaMetadataRetriever类.大家能够 ...

随机推荐

  1. Stickup – 轻松实现元素固定效果的 jQuery 插件

    粘贴是一个简单的 jQuery 插件,在页面滚动的时候固定一个元素到浏览器窗口的顶部,让其总是保持在视图中可见.这个插件作用于多页的网站,但是对于单页的布局有额外的功能.借助 CSS,还可以实现当前视 ...

  2. 20个免费的 AngularJS 资源和开发教程

    曾经,jQuery 无疑是最受欢迎的开源的 JavaScript 库,如今它有了很多的竞争对手,像 AngularJS.React.KnockoutJS 等等.在这里,我想重点关注一下 Angular ...

  3. CSS中!important的作用

    提升指定样式规则的应用优先权. IE6及以下浏览器有个比较显式的支持问题存在,!important在同一条规则集里不生效.请看下述代码: 示例代码: div { color: #f00 !import ...

  4. 如何查找SAP的事务代码清单

    SAP系统中,为了省去输入程序名称等繁琐步骤,SAP提供一种命令,称作‘事务代码’,通过执行事务代码达到快速进入相应程序的目的.那么在系统中如何去查找事务代码,事务代码和程序的对应关系如何呢?我们可以 ...

  5. BP神经网络实现

    # -*- coding: utf-8 -*- # -------------------------------------------------------------------------- ...

  6. SharePoint 2013 在母版页中插入WebPart

    最近QQ群里有朋友问,如何在母版页里插入自己开发的WebPart.其实很简单,母版页中虽然不允许插入WebPartZone,但是Designer就可以插入WebPart:或者手动注册,然后插入WebP ...

  7. Kotlin语法(基础)

    一.基础语法: 1. 定义包名: 包名应该在源文件的最开头,包名不必和文件夹路径一致:源文件可以放在任意位置. package my.demo 2. 定义函数: fun sum(a: Int , b: ...

  8. Android优秀学习资料(高手博客

    任玉刚, 博客 : http://blog.csdn.net/singwhatiwanna, github : https://github.com/singwhatiwanna Trinea, 博客 ...

  9. UIScrollView之轮转图片

    在iOS开发中,经常会在APP首页看到多张图片进行轮换.刚开始做的时候,感觉很麻烦,不是很好做,查阅资料后,我总结了一下,自己封装了一个简单的轮转图片库: UIScrollView无限滑动 ,只需要三 ...

  10. GitHub Top 100 的项目(iOS)

    主要对当前 GitHub 排名前 100 的项目做一个简单的简介, 方便初学者快速了解到当前 Objective-C 在 GitHub 的情况. Android 版本的在此: https://gith ...