[转]android 获取视频帧

摘要:
importandroid.graphics。位图;importandroid.media。媒体元数据检索器;importandroid.util。日志publicclassMediaDecoder{privatestaticfinalStringTAG=“MediaDecodeer”;privateMediaMetadataRetriever=null;privateStringfileLength;publicMediaDecoder{if{retriever=newMediaMetadataRetriever();retriever.setDataSource;fileLength=retriever.extractMetadata;Log.i;}}/**获取视频的帧*@paramtimeMs-ms*@paramlistener*/publicbookendecodeFrame{ifreturnfalse;Bitmapbitmap=retrier.getFrameAtTime;ifreturnfalse;listener.getBitmap;returntrue;}/**获取视频文件播放长度*@return*/publicStringgetVedioFileLength(){returnfileLength;}}importandroid.graphics。位图;importandroid.media。媒体元数据检索器;importandroid.util。日志publicclassMediaDecoder{privatestaticfinalStringTAG=“MediaDecodeer”;privateMediaMetadataRetriever=null;privateStringfileLength;publicMediaDecoder{if{retriever=newMediaMetadataRetriever();retriever.setDataSource;fileLength=retriever.extractMetadata;Log.i;}}/**获取视频的帧*@paramtimeMs-ms*@paramlistener*/publicbookendecodeFrame{ifreturnfalse;Bitmapbitmap=retrier.getFrameAtTime;ifreturnfalse;listener.getBitmap;returntrue;}/**获取视频文件播放长度*@return*/publicStringgetVedioFileLength(){returnfileLength;}}这是获取视频帧的工具。调试期间遇到了一些问题:一个是getFrameAtTime参数的使用。让我们先看看方法的原型:publicBitmapgetFrameAtTime。第一个参数是传入时间,它只能是我们(微秒)。当时,我传入的ms总是得到第一帧,所以这个问题已经解决了很长时间。OPTION_ NEXT_SYNC在给定时间后检索与数据源同步的关键帧。

本文转自: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.   
  5. public class MediaDecoder {  
  6.     private static final String TAG = "MediaDecoder";  
  7.     private MediaMetadataRetriever retriever = null;  
  8.     private String fileLength;  
  9.   
  10.     public MediaDecoder(String file) {  
  11.         if(CommonUtils.checkFile(file)){  
  12.             retriever = new MediaMetadataRetriever();  
  13.             retriever.setDataSource(file);  
  14.             fileLength = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);  
  15.             Log.i(TAG, "fileLength : "+fileLength);  
  16.         }  
  17.     }  
  18.     /**  
  19.      * 获取视频某一帧  
  20.      * @param timeMs 毫秒  
  21.      * @param listener   
  22.      */  
  23.     public boolean decodeFrame(long timeMs,OnGetBitmapListener listener){  
  24.         if(retriever == null) return false;  
  25.         Bitmap bitmap = retriever.getFrameAtTime(timeMs * 1000, MediaMetadataRetriever.OPTION_CLOSEST);  
  26.         if(bitmap == null) return false;  
  27.         listener.getBitmap(bitmap, timeMs);   
  28.         return true;  
  29.     }  
  30.     /**  
  31.      * 取得视频文件播放长度  
  32.      * @return  
  33.      */  
  34.     public String getVedioFileLength(){  
  35.         return fileLength;  
  36.     }  
  37.   
  38. }  
[转]android 获取视频帧第3张
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 获取视频帧》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Linux vim 常用命令css3控制div上下跳动下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

GdiPlus[57]: 图像(九) IGPBitmap 特有的属性与方法

这包括: //属性 IGPBitmap.Pixels; { 获取或设置指定像素的颜色 } //方法 IGPBitmap.SetResolution(); { 设置分辨率 } IGPBitmap.GetHBitmap(); { 创建 GDI 格式的 Bitmap 并返回句柄 } IGPBitmap.GetHIcon;...

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

最近做的项目要求既能播放视频(类似于视频播放器),又能每隔1s左右获取一帧视频画面,然后对图片进行处理,调查了一周,也被折磨了一周,总算找到了大致符合要求的方法。首先对调查过程中涉及到的方法进行简单介绍,再重点介绍最终所采用的方法,话不多说,进入正题。 一.MediaMetadataRetriever 播放视频并取得画面的一帧,大家最先想到应该都是这个,我...

[Android] 旋转照片/图片

今天比较闲(是任务做完了,不是偷懒),就多更新几篇,补一下之前做的东西。 原文地址请保留http://www.cnblogs.com/rossoneri/p/3995306.html 推荐阅读: Android图片处理:识别图像方向并显示实例教程 android中调用系统相机得到的相片的方向判断 做图片旋转前我考虑了一个问题,就是把android设备反着拿...

bitmap原理和redis bitmap应用

bitmap原理 bitmap是什么?在计算机中一个字节(byte)=8位(bit),这里的bit就是位,数据的最小表示单位,map一般是表示地图或者映射。 简单回顾一下二进制的一些知识: 1byte=8bit 1个bit有二种状态:0或1 所以1个byte可以表示00000000->11111111,也就是十进制0-255 其中十进制和二进制的对应...

图片的放大缩小

布局文件 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_par...

Android菜鸟成长记15 -- BitMap

BitMap简介 Bitmap是Android系统中的图像处理的最重要类之一。用它可以获取图像文件信息,进行图像剪切、旋转、缩放等操作,并可以指定格式保存图像文件。本文从应用的角度,着重介绍怎么用Bitmap来实现这些功能。 BitMap的常用属性 1. BitMap类public void recycle()——回收位图占用的内存空间,把位图标记为Dea...