最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

android提取視頻多張圖片和視頻信息實(shí)例

 更新時(shí)間:2017年05月26日 09:36:16   作者:顧修忠  
本篇文章主要介紹了android提取視頻多張圖片和視頻信息實(shí)例,具有一定的參考價(jià)值,有興趣的可以了解一下

話說2016年的直播比較火,2017年短視頻又火了。但對(duì)于開發(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-也可以做到哈?。ê笳卟徽归_介紹),

最后會(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è)對(duì)象借助handler更新到UI線程中去,然后展示到recycleview上去,具體代碼可以參考demo。這里保存的圖片沒有進(jìn)行壓縮,第二篇文章會(huì)具體講到。

demo地址:https://github.com/ta893115871/MediaMetadataRetrieverDemo

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

丽水市| 博兴县| 上蔡县| 东宁县| 沂南县| 鲁甸县| 辛集市| 沧州市| 深州市| 沁水县| 海兴县| 都安| 碌曲县| 昌宁县| 奉节县| 醴陵市| 宿州市| 长治县| 高雄县| 德保县| 汝阳县| 呼和浩特市| 醴陵市| 七台河市| 公主岭市| 新疆| 澜沧| 双峰县| 杭州市| 福贡县| 肇源县| 思茅市| 内丘县| 阳朔县| 城市| 大悟县| 涞源县| 尤溪县| 蒙自县| 武安市| 休宁县|