1. 程式人生 > >android 從檔案獲取視訊幀

android 從檔案獲取視訊幀

轉自:https://blog.csdn.net/heart_Moving/article/details/17414067

MediaDecoder.java

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 .

OnGetBitmapListener.java

import android.graphics.Bitmap;

 
public interface OnGetBitmapListener {
     void getBitmap(Bitmap bitmap, long timeMs);
}