android 獲取視頻第一幀作為縮略圖的方法
今天,簡單講講android里如何獲取一個視頻文件的第一幀作為縮略圖顯示在界面上。
之前,我說個最近需要從服務(wù)器下載視頻文件,但是下載后肯定需要顯示視頻的縮略圖在界面上給用戶看,于是想到顯示視頻的第一幀作為縮略圖。但是我不知道具體怎么寫,于是在網(wǎng)上查找資料,最終是解決了問題。這里記錄一下。
一.使用MediaMetadataRetriever獲取視頻的第一幀作為縮略圖
/**
* 獲取視頻文件截圖
*
* @param path 視頻文件的路徑
* @return Bitmap 返回獲取的Bitmap
*/
public static Bitmap getVideoThumb(String path) {
MediaMetadataRetriever media = new MediaMetadataRetriever();
media.setDataSource(path);
return media.getFrameAtTime();
}
這里需要注意一點,從API 10開始新增一類MediaMetadataRetriever可以用來獲取媒體文件的信息,可以獲取視頻任何一幀的縮略圖。所以使用MediaMetadataRetriever的API最小為10.
這里還列舉一下MediaMetadataRetriever獲取視頻的其他幾個函數(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);
這里簡單講講,media.getFrameAtTime()實際上也是調(diào)用mmrc.getFrameAtTime(-1, OPTION_CLOSEST_SYNC );即獲取從-1秒后最近位置的關(guān)鍵幀,其實就是第一幀數(shù)據(jù)。下面簡單說一下public Bitmap getFrameAtTime(long timeUs, int option):
public Bitmap getFrameAtTime(long timeUs, int option) 第一個參數(shù)是傳入時間,只能是us(微秒) ,當(dāng)時我傳入的ms,獲取的總是第一幀,所以這個問題都弄了好久。
然后是第二個參數(shù),先看看官方解釋:
OPTION_CLOSEST 在給定的時間,檢索最近一個幀,這個幀不一定是關(guān)鍵幀。
OPTION_CLOSEST_SYNC 在給定的時間,檢索最近一個同步與數(shù)據(jù)源相關(guān)聯(lián)的的幀(關(guān)鍵幀)。
OPTION_NEXT_SYNC 在給定時間之后檢索一個同步與數(shù)據(jù)源相關(guān)聯(lián)的關(guān)鍵幀。
OPTION_PREVIOUS_SYNC 顧名思義,同上
二.使用ThumbnailUtils獲取視頻的第一幀作為縮略圖
/**
* 獲取視頻的縮略圖
* 先通過ThumbnailUtils來創(chuàng)建一個視頻的縮略圖,然后再利用ThumbnailUtils來生成指定大小的縮略圖。
* 如果想要的縮略圖的寬和高都小于MICRO_KIND,則類型要使用MICRO_KIND作為kind的值,這樣會節(jié)省內(nèi)存。
* @param videoPath 視頻的路徑
* @param width 指定輸出視頻縮略圖的寬度
* @param height 指定輸出視頻縮略圖的高度度
* @param kind 參照MediaStore.Images(Video).Thumbnails類中的常量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類的靜態(tài)方法createVideoThumbnail獲取視頻的截圖;
if(bitmap!= null){
bitmap = ThumbnailUtils.extractThumbnail(bitmap, width, height,
ThumbnailUtils.OPTIONS_RECYCLE_INPUT);//調(diào)用ThumbnailUtils類的靜態(tài)方法extractThumbnail將原圖片(即上方截取的圖片)轉(zhuǎn)化為指定大?。?
}
return bitmap;
}
簡單講講,這個其實很簡單,就是調(diào)用ThumbnailUtils.createVideoThumbnail(path, kind)獲取第一幀數(shù)據(jù),然后通過bitmap = ThumbnailUtils.extractThumbnail(bitmap, width, height, ThumbnailUtils.OPTIONS_RECYCLE_INPUT);將圖片轉(zhuǎn)成指定大小。
下面還列舉如何將bitmap保存到文件,因為獲取到視頻的縮略圖后,可能需要保存到本地,下次進(jìn)入app時可以直接查看。
/**
* 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();
}
android 獲取視頻第一幀作為縮略圖就講完了。
就這么簡單。以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android EditText實現(xiàn)分割輸入內(nèi)容
這篇文章主要為大家詳細(xì)介紹了Android EditText實現(xiàn)分割輸入內(nèi)容的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04
Flutter學(xué)習(xí)之SliverList和SliverGird的使用詳解
Sliver的組件一般都用在CustomScrollView中,除了SliverAppBar之外,我們還可以為CustomScrollView添加List或者Grid來實現(xiàn)更加復(fù)雜的組合效果。本文就來聊聊SliverList和SliverGird的使用吧2023-02-02
Android中捕獲TTextView文本中的鏈接點擊事件方法
這篇文章主要介紹了Android中捕獲TTextView文本中的鏈接點擊事件方法,本文給出了實現(xiàn)代碼和使用方法以及實現(xiàn)自己控制的方法,需要的朋友可以參考下2015-01-01
Android仿拉手網(wǎng)團(tuán)購App產(chǎn)品詳情界面效果
這篇文章主要介紹了Android仿拉手網(wǎng)團(tuán)購App產(chǎn)品詳情界面效果,代碼簡單易懂,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-05-05
Android SharePreferences與數(shù)據(jù)庫SQLite存儲實現(xiàn)方法介紹
這篇文章主要介紹了Android SharePreferences與數(shù)據(jù)庫SQLite用于存儲的具體實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-09-09

