視頻畫中畫效果,拖動進度條能夠seek到相應視頻幀顯示

在視頻開發中,咱們經常看到這樣的效果,拖動進度條時,或是在進度條上方或是在屏幕中間,顯示拖動進度條位置時刻的某一幀畫面。 git

這個需求,若是是你,你會如何作?github

一般一個需求,不只要考慮實現,還有考慮一些是否有性能上影響。bash

下面我想到的4個方案:微信

一、在拖動過程當中,能夠經過TextureView來顯示預覽圖,拖動進度條到某個position後,經過textureView.getBitmap()拿到對應的截圖,用於展現。框架

二、經過MediaMetadataRetriever 只能獲取你指定時間的附近的關鍵幀(Key frame) MediaMetadataRetriever mmr = new MediaMetadataRetriever(); mmr.setDataSource(renderOutputFilePath); mmr.getFrameAtTime(1x1000x1000,OPTION_CLOSEST_SYNC );//獲取1秒附近的關鍵幀,注意,只是附近,獲取不到精確位置的圖片。可是用於預覽也夠了源碼分析

三、經過GLSurfaceView,拖到到某個事件點後,來onDrawFrame,這種方式比較高效。性能

四、FFmpeg實現,獲取某個位置的picture,github上有封裝好的實現此功能的庫,相似和MediaMetadataRetriever同樣的用法,能夠更精準,高效。 連接:github.com/wseemann/FF… 原理就是取某個timebase的關鍵幀。而後回調出去展現。學習

須要注意的是,取幀是個耗時的操做,須要放到子線程中編碼

FFmpegMediaMetadataRetriever mmr = new FFmpegMediaMetadataRetriever();
mmr.setDataSource(mUri);

//獲取第一幀原尺寸圖片
mmrc.getFrameAtTime();

//獲取指定位置的原尺寸圖片 注意這裏傳的timeUs是微秒
mmrc.getFrameAtTime(timeUs, option);

//獲取指定位置指定寬高的縮略圖
mmrc.getScaledFrameAtTime(timeUs, MediaMetadataRetrieverCompat.OPTION_CLOSEST, width, height);

//獲取指定位置指定寬高而且旋轉的縮略圖
mmrc.getScaledFrameAtTime(timeUs, MediaMetadataRetrieverCompat.OPTION_CLOSEST, width, height, rotate);
複製代碼

Demo效果圖: spa

推薦書籍(亞馬遜、京東、天貓、噹噹均有售):

image.png

內容簡介:近年來,直播、短視頻行業的相關業務發展迅猛,本書主要介紹其中涉及的Android音視頻開發相關技術。本書一共有11章,分別介紹了音視頻基礎知識、MediaPlayer、MediaPlayerService、StagefrightPlayer、NuPlayer、OpenMAX框架、FFmpeg項目、FFmpeg源碼分析及實戰、直播技術、H.264編碼及H.265編碼、視頻格式分析內容。但願本書能幫助讀者系統學習、化繁爲簡,在Android音視頻開發的道路上不斷進步。

歡迎關注個人微信公衆號「何俊林」,音視頻、多媒體技術乾貨
相關文章
相關標籤/搜索