android 從檔案獲取視訊幀
阿新 • • 發佈:2019-01-06
轉自: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);
}