zoukankan      html  css  js  c++  java
  • [转]android 获取视频帧

    本文转自: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. }  
    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 .

  • 相关阅读:
    MySQL5.7的Linux安装shell脚本之二进制安装
    MySQL与Mongo简单的查询 1
    order by 与group by 之间排序问题
    说说左连接出现重复记录的问题
    MySQL5.6的Linux安装shell脚本之二进制安装(一)
    搭建简单FTP服务器以及过程中容易遇到的几个问题(一)
    jqurty
    jquery中的事件与动画
    SQL SERVER数据库设计与现实
    jquery2
  • 原文地址:https://www.cnblogs.com/freeliver54/p/5632138.html
Copyright © 2011-2022 走看看