1. 程式人生 > >Android MediaMetadataRetriever 從視訊中擷取某一幀圖片

Android MediaMetadataRetriever 從視訊中擷取某一幀圖片

從視訊中擷取某一幀圖片儲存到本地

最近遇到一個問題,拍攝完視訊後需要在視訊中選擇一幀當作視訊封面

在Android中有這樣一個類MediaMetadataRetriever

**官方API解釋:MediaMetadataRetriever class provides a unified interface for retrieving frame and meta data from an input media file.
大概意思就是說:mediametadataretriever類提供了一個統一的介面用於從一個輸入媒體檔案中取得幀和元資料。**

對於官方的解釋,這個類的用途我們大概已經知道了就是獲取一個媒體檔案的一些基本資訊,比如視訊檔案或者音樂檔案的總時長,或者視訊檔案的寬度和高度等基本資訊

本文中使用的就是這個類MediaMetadataRetriever去從視訊中獲取某一幀

下面是效果圖

下面是具體的程式碼實現

        mMetadataRetriever = new MediaMetadataRetriever();
        //mPath本地視訊地址
        mMetadataRetriever.setDataSource(mPath);
        //這個時候就可以通過mMetadataRetriever來獲取這個視訊的一些視訊資訊了
        String duration = mMetadataRetriever.extractMetadata
(android.media.MediaMetadataRetriever.METADATA_KEY_DURATION);//時長(毫秒) String width = mMetadataRetriever.extractMetadata(android.media.MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH);//寬 String height = mMetadataRetriever.extractMetadata(android.media.MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT);//高
//上面三行程式碼可以獲取這個視訊的寬高和播放總時長 //下面這行程式碼才是關鍵,用來獲取當前視訊某一時刻(毫秒*1000)的一幀 Bitmap bitmap = mMetadataRetriever.getFrameAtTime(mCovervideoview.getCurrentPosition()*1000, MediaMetadataRetriever.OPTION_CLOSEST); //這時就可以獲取這個視訊的某一幀的bitmap了

雖然效果出來了,但是還有一個不小的問題
在下面的seekbar拖動的時候上面的VideoView並不是平滑滑動的,而是從一個畫面突然蹦到另一個畫面
於是就查了一下VideoView的seekto方法,最後找到原因了。

在使用Android中的VideoView或者是MediaPlayer的seekto的時候,它定位的不是具體時刻的某一幀,而是離當前時刻最近的關鍵幀
所以在滑動的時候就會造成畫面的不連續。要怎麼使滑動的時候視訊連續呢,是不是把視訊的每一幀都變成關鍵幀,具體的思路和實現方法還在思考中……