溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

怎么在android中將獲取視頻的第一幀作為縮略圖

發(fā)布時(shí)間:2021-02-18 15:28:17 來(lái)源:億速云 閱讀:348 作者:Leah 欄目:移動(dòng)開(kāi)發(fā)

本篇文章為大家展示了怎么在android中將獲取視頻的第一幀作為縮略圖,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。

一.使用MediaMetadataRetriever獲取視頻的第一幀作為縮略圖

/** 
* 獲取視頻文件截圖 
* 
* @param path 視頻文件的路徑 
* @return Bitmap 返回獲取的Bitmap 
*/
 
public static Bitmap getVideoThumb(String path) { 
 
MediaMetadataRetriever media = new MediaMetadataRetriever(); 
 
media.setDataSource(path); 
 
return media.getFrameAtTime(); 
 
}

這里需要注意一點(diǎn),從API 10開(kāi)始新增一類(lèi)MediaMetadataRetriever可以用來(lái)獲取媒體文件的信息,可以獲取視頻任何一幀的縮略圖。所以使用MediaMetadataRetriever的API最小為10.

這里還列舉一下MediaMetadataRetriever獲取視頻的其他幾個(gè)函數(shù):

//獲取第一幀原尺寸圖片
mmrc.getFrameAtTime();
 
//獲取指定位置的原尺寸圖片 注意這里傳的timeUs是微秒
mmrc.getFrameAtTime(timeUs, option);
 
//獲取指定位置指定寬高的縮略圖
mmrc.getScaledFrameAtTime(timeUs, MediaMetadataRetrieverCompat.OPTION_CLOSEST, width, height);
 
//獲取指定位置指定寬高并且旋轉(zhuǎn)的縮略圖
mmrc.getScaledFrameAtTime(timeUs, MediaMetadataRetrieverCompat.OPTION_CLOSEST, width, height, rotate);

這里簡(jiǎn)單講講,media.getFrameAtTime()實(shí)際上也是調(diào)用mmrc.getFrameAtTime(-1, OPTION_CLOSEST_SYNC );即獲取從-1秒后最近位置的關(guān)鍵幀,其實(shí)就是第一幀數(shù)據(jù)。下面簡(jiǎn)單說(shuō)一下public Bitmap getFrameAtTime(long timeUs, int option):

public Bitmap getFrameAtTime(long timeUs, int option) 第一個(gè)參數(shù)是傳入時(shí)間,只能是us(微秒) ,當(dāng)時(shí)我傳入的ms,獲取的總是第一幀,所以這個(gè)問(wèn)題都弄了好久。

然后是第二個(gè)參數(shù),先看看官方解釋?zhuān)?/p>

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   顧名思義,同上

二.使用ThumbnailUtils獲取視頻的第一幀作為縮略圖

/**
   * 獲取視頻的縮略圖
   * 先通過(guò)ThumbnailUtils來(lái)創(chuàng)建一個(gè)視頻的縮略圖,然后再利用ThumbnailUtils來(lái)生成指定大小的縮略圖。
   * 如果想要的縮略圖的寬和高都小于MICRO_KIND,則類(lèi)型要使用MICRO_KIND作為kind的值,這樣會(huì)節(jié)省內(nèi)存。
   * @param videoPath 視頻的路徑
   * @param width 指定輸出視頻縮略圖的寬度
   * @param height 指定輸出視頻縮略圖的高度度
   * @param kind 參照MediaStore.Images(Video).Thumbnails類(lèi)中的常量MINI_KIND和MICRO_KIND。
   *      其中,MINI_KIND: 512 x 384,MICRO_KIND: 96 x 96
   * @return 指定大小的視頻縮略圖
   */
  public static Bitmap getVideoThumbnail(String videoPath, int width, int height,int kind) {
    Bitmap bitmap = null;
    // 獲取視頻的縮略圖
    bitmap = ThumbnailUtils.createVideoThumbnail(videoPath, kind); //調(diào)用ThumbnailUtils類(lèi)的靜態(tài)方法createVideoThumbnail獲取視頻的截圖;
    if(bitmap!= null){
      bitmap = ThumbnailUtils.extractThumbnail(bitmap, width, height,
          ThumbnailUtils.OPTIONS_RECYCLE_INPUT);//調(diào)用ThumbnailUtils類(lèi)的靜態(tài)方法extractThumbnail將原圖片(即上方截取的圖片)轉(zhuǎn)化為指定大?。?
    }
    return bitmap;
  }

簡(jiǎn)單講講,這個(gè)其實(shí)很簡(jiǎn)單,就是調(diào)用ThumbnailUtils.createVideoThumbnail(path, kind)獲取第一幀數(shù)據(jù),然后通過(guò)bitmap = ThumbnailUtils.extractThumbnail(bitmap, width, height, ThumbnailUtils.OPTIONS_RECYCLE_INPUT);將圖片轉(zhuǎn)成指定大小。

下面還列舉如何將bitmap保存到文件,因?yàn)楂@取到視頻的縮略圖后,可能需要保存到本地,下次進(jìn)入app時(shí)可以直接查看。

/** 
* Bitmap保存成File 
* 
* @param bitmap input bitmap 
* @param name output file's name 
* @return String output file's path 
*/
 
public static String bitmap2File(Bitmap bitmap, String name) { 
 
File f = new File(Environment.getExternalStorageDirectory() + name + ".jpg"); 
 
if (f.exists()) f.delete(); 
 
FileOutputStream fOut = null; 
 
try { 
 
fOut = new FileOutputStream(f); 
 
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fOut); 
 
fOut.flush(); 
 
fOut.close(); 
 
} catch (IOException e) { 
 
return null; 
 
} 
 
return f.getAbsolutePath(); 
 
}

上述內(nèi)容就是怎么在android中將獲取視頻的第一幀作為縮略圖,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI