android提取視頻多張圖片和視頻信息

android提取視頻多張圖片和視頻信息

話說2016年的直播比較火歇攻,2017年短視頻又火了。但對于開發(fā)者來說隱藏在這背后的技術(shù)才是我們所關(guān)心的,畢竟我們是靠技術(shù)吃飯的赡磅。
現(xiàn)在在安卓中多媒體服務(wù)比較強(qiáng)大,而與視頻有關(guān)的視頻基本處理技術(shù)有必要學(xué)習(xí)一下宝与。我前段時(shí)間也在做有關(guān)視頻的一些需求焚廊,當(dāng)然也涉及本文的標(biāo)題內(nèi)容。
經(jīng)測試和研究發(fā)現(xiàn)在android中提取視頻圖片的方法只有MediaMetadataRetriever這個(gè)類比較靠譜簡單實(shí)用习劫。當(dāng)然OpenGL-也可以做到哈E匚痢(后者不展開介紹),
最后會(huì)把完整的demo獻(xiàn)上榜聂。

效果圖

技術(shù)需求

  1. 需求一:給你一個(gè)視頻提取第一個(gè)關(guān)鍵幀圖片作為視頻的封面搞疗,好處呢!须肆?就是當(dāng)沒有播放的時(shí)候顯示視頻的首幀圖片匿乃,當(dāng)點(diǎn)擊播放按鈕時(shí)(或者自動(dòng)播放)視頻和首幀圖片能連慣起來,是個(gè)很不錯(cuò)的體驗(yàn)豌汇。
  2. 需求二:提取多張圖片幢炸,用戶可以滑動(dòng)這些縮略圖來查看視頻的大體內(nèi)容,然后截取指定的視頻區(qū)域進(jìn)行編輯拒贱,這個(gè)需求類似:微信的小視頻編輯界面宛徊。這個(gè)會(huì)在第二篇文章中實(shí)現(xiàn)。實(shí)現(xiàn)高速度提取視頻圖片逻澳。
  3. 需求三:提取視頻的基本信息闸天,比如寬高,視頻的時(shí)長斜做。這個(gè)主要用于上傳視頻文件時(shí)的參數(shù)提交苞氮,然后展示的時(shí)候用視頻寬高做UI特效,比如不規(guī)則之美-瀑布流

調(diào)研

先看第3個(gè)問題瓤逼,這個(gè)比較簡單笼吟。主要是MediaMetadataRetriever這個(gè)系統(tǒng)API類库物。


類介紹

大體意思就是:給定一個(gè)媒體文件,它能檢索/輸出一些元數(shù)據(jù)和幀贷帮。有點(diǎn)意思哈戚揭,它加載了動(dòng)態(tài)庫media_jni,可見它是一個(gè)十分接近底層的一個(gè)類撵枢。

技術(shù)實(shí)現(xiàn)-視頻基本信息的獲取

看一下類結(jié)構(gòu)民晒,有一些常量,作為一線碼農(nóng)诲侮,我懂你哦镀虐。


//1.初始化
      mMetadataRetriever = new MediaMetadataRetriever();
        
//2.設(shè)置視頻源文件mMetadataRetriever.setDataSource(file.getAbsolutePath());
//3.獲取視頻的寬
String w = mMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH);
 //獲取視頻的高
String h = mMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT);
 //獲取視頻的時(shí)長,ms
mMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);

// 等等...一些其它屬性沟绪,比如媒體類型(3gp,mp4) ,視頻旋轉(zhuǎn)角度
//4.釋放資源刮便,防止內(nèi)存泄漏,養(yǎng)成好習(xí)慣
 mMetadataRetrieve.release();

我自己簡單了寫了一個(gè)util類绽慈,最后會(huì)獻(xiàn)上恨旱。

技術(shù)實(shí)現(xiàn)-獲取視頻關(guān)鍵幀

直接上代碼-我懂你

 public Bitmap extractFrame(long timeMs) {
        //第一個(gè)參數(shù)是傳入時(shí)間,只能是us(微秒)
        //OPTION_CLOSEST ,在給定的時(shí)間坝疼,檢索最近一個(gè)幀,這個(gè)幀不一定是關(guān)鍵幀搜贤。
        //OPTION_CLOSEST_SYNC   在給定的時(shí)間,檢索最近一個(gè)同步與數(shù)據(jù)源相關(guān)聯(lián)的的幀(關(guān)鍵幀)
        //OPTION_NEXT_SYNC 在給定時(shí)間之后檢索一個(gè)同步與數(shù)據(jù)源相關(guān)聯(lián)的關(guān)鍵幀钝凶。
        //OPTION_PREVIOUS_SYNC 在給定時(shí)間之前檢索一個(gè)同步與數(shù)據(jù)源相關(guān)聯(lián)的關(guān)鍵幀仪芒。

// Bitmap bitmap = mMetadataRetriever.getFrameAtTime(timeMs * 1000, MediaMetadataRetriever.OPTION_CLOSEST_SYNC);
        Bitmap bitmap = null;
        for (long i = timeMs; i < fileLength; i += 1000) {
            bitmap = mMetadataRetriever.getFrameAtTime(i * 1000, MediaMetadataRetriever.OPTION_CLOSEST_SYNC);
            if (bitmap != null) {
                break;
            }
        }
        return bitmap;
    }

實(shí)用的時(shí)候直接: Bitmap bitmap = extractFrame(0); fileLength為視頻的時(shí)長( 毫秒數(shù)),返回bitmap 耕陷,然后你用可以操作bitmap了掂名,比如保存到sd卡上,看你愛好了哟沫。有人問:咿饺蔑,怎么for循環(huán)啊嗜诀?是這樣的猾警,我遇到過有時(shí)候你傳入的0,它有時(shí)候返回的bitmap為null隆敢,找不到關(guān)鍵幀发皿,因此你需要多次遞增1秒獲取。
那么需求一的實(shí)現(xiàn)也OK了拂蝎,但是有一點(diǎn)需要注意就是展示視頻的控件的寬和高和蓋在上面的圖片的控件的寬和高一樣才有你播放的時(shí)候就連貫了雳窟。

技術(shù)實(shí)現(xiàn)-獲取視頻多張圖片

我相信大家都能想到需求一的for循環(huán)一下不就可以了嗎,是的,沒錯(cuò)封救。
首先提取圖片遇到高清視頻可能耗時(shí),我經(jīng)過測試用vivo-xplay-5a ,1080高清視頻捣作,提取一張圖片也就是mMetadataRetriever.getFrameAtTime()方法大概90-120ms之間誉结。

  1. 方案:因此你需要一個(gè)工作線程+handler,每提取一張保存到sd卡中,然后用handeler發(fā)送保存圖片的路徑展示到UI上券躁。demo中會(huì)展示到recycleview上惩坑,然后用glide圖片加載框架一張一張的顯示出來。當(dāng)然你也可以自己緩存mMetadataRetriever.getFrameAtTime 返回的bitmap也拜,不過不建議這么做以舒。
  2. 怎么循環(huán)提取,假設(shè)視頻文件長度是60s慢哈,需要提取10張圖片蔓钟,也就是1張圖片代表了6s,60/10卵贱,
for (int i = 0; i < thumbnailsCount; i++) {
            if (stop) {
                metadataRetriever.release();
                break;
            }
            long time = startPosition + interval * i;
            if (i == thumbnailsCount - 1) {
                if (interval > 1000) {
                    String path = extractFrame(metadataRetriever, endPosition - 800, OutPutFileDirPath);
                    sendAPic(path, endPosition - 800);
                } else {
                    String path = extractFrame(metadataRetriever, endPosition, OutPutFileDirPath);
                    sendAPic(path, endPosition);
                }
            } else {
                String path = extractFrame(metadataRetriever, time, OutPutFileDirPath);
                sendAPic(path, time);
            }
        }

stop是停止提取圖片的標(biāo)志滥沫,extractFrame方法就是metadataRetriever.getFrameAtTime()返回bitmap然后 bitmap.compress()返回保存到sd卡上的圖片路徑,最后sendAPic將提取的圖片路徑和時(shí)間加工為一個(gè)對象借助handler更新到UI線程中去键俱,然后展示到recycleview上去兰绣,具體代碼可以參考demo。這里保存的圖片沒有進(jìn)行壓縮编振,第二篇文章會(huì)具體講到缀辩。
demo地址:
https://github.com/ta893115871/MediaMetadataRetrieverDemo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市踪央,隨后出現(xiàn)的幾起案子臀玄,更是在濱河造成了極大的恐慌,老刑警劉巖杯瞻,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件镐牺,死亡現(xiàn)場離奇詭異,居然都是意外死亡魁莉,警方通過查閱死者的電腦和手機(jī)睬涧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來旗唁,“玉大人畦浓,你說我怎么就攤上這事〖煲撸” “怎么了讶请?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我夺溢,道長论巍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任风响,我火速辦了婚禮嘉汰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘状勤。我一直安慰自己鞋怀,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布持搜。 她就那樣靜靜地躺著密似,像睡著了一般。 火紅的嫁衣襯著肌膚如雪葫盼。 梳的紋絲不亂的頭發(fā)上残腌,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機(jī)與錄音剪返,去河邊找鬼废累。 笑死,一個(gè)胖子當(dāng)著我的面吹牛脱盲,可吹牛的內(nèi)容都是我干的邑滨。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼钱反,長吁一口氣:“原來是場噩夢啊……” “哼掖看!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起面哥,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤哎壳,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后尚卫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體归榕,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年吱涉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了刹泄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡怎爵,死狀恐怖特石,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鳖链,我是刑警寧澤姆蘸,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響逞敷,放射性物質(zhì)發(fā)生泄漏狂秦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一推捐、第九天 我趴在偏房一處隱蔽的房頂上張望故痊。 院中可真熱鬧,春花似錦玖姑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至符喝,卻和暖如春闪彼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背协饲。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工畏腕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人茉稠。 一個(gè)月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親沟娱。 傳聞我的和親對象是個(gè)殘疾皇子嗡官,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,527評論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件膀篮、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,033評論 4 62
  • springboot 搭建 web 框架很是方便,但是搭建的過程中會(huì)遇到很多問題.過程中我遇到了這樣一個(gè)問題 如下...
    PrimaryKeyEnoch閱讀 36,041評論 10 5
  • 幾天前誓竿,我跟導(dǎo)師談起了我定的論文題目磅网,然后導(dǎo)師就斃掉了我的想法。 現(xiàn)在筷屡,就來談?wù)劚粩赖舻念}目涧偷,貨幣的未來形式是什么...
    半山徐風(fēng)霧自清閱讀 176評論 0 0
  • 風(fēng)擺微微雨寂孤, 雷至夜垂倦已無速蕊。 時(shí)節(jié)這般遮月貌嫂丙, 落款權(quán)且書秋初。 舉目望外嘗淚苦规哲, 長久如此思?xì)w屬跟啤。 來時(shí)花...
    曲習(xí)閱讀 147評論 0 0