歡迎訪問個人博客:https://glumes.com
在做多媒體應(yīng)用開發(fā)時有滑,往往需要獲取到多媒體文件的相關(guān)信息。
Android 提供了 MediaMetadataRetriever
類來獲取輸入媒體文件的幀(Frame)和元數(shù)據(jù)(Meta data)睹耐。
使用起來比較簡單刑然,所以使用范圍也有限制缔刹,步驟如下:
1、聲明并初始化 MediaMetadataRetriever 類杀迹。
2亡脸、設(shè)置數(shù)據(jù)源
3、獲取想要的信息
MediaMetadataRetriever metadataRetriever = new MediaMetadataRetriever();
metadataRetriever.setDataSource(AUDIO_FILE);
// 獲得時長
metadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION)
// 獲得名稱
metadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE)
// 獲得媒體類型
metadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_MIMETYPE)
// 獲得碼率
metadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_BITRATE)
使用 extractMetadata 方法就能獲得很多相關(guān)信息了佛南,具體到哪些內(nèi)容可以參考源碼里面列舉的常量梗掰。
除此之外,對于音頻和視頻文件還能獲取其他的一些內(nèi)容嗅回。
獲取音頻相關(guān)信息
對于音頻文件及穗,比如 MP3 文件,我們還可以獲取到 MP3 的專輯圖像绵载。
byte[] imageData = metadataRetriever.getEmbeddedPicture();
try {
mBinding.audioCover.setImageBitmap(BitmapFactory.decodeByteArray(imageData, 0, imageData.length));
} catch (Exception e) {
}
使用 getEmbeddedPicture
方法可以獲取到圖像的字節(jié)數(shù)組埂陆,再解碼到圖像就好了。
獲取視頻的幀圖像
對于視頻文件娃豹,比如 MP4 文件焚虱,還可以獲取到 MP4 文件的某個時刻的一幀圖像。
videoFrame.setImageBitmap(metadataRetriever.getFrameAtTime(1*1000*1000, MediaMetadataRetriever.OPTION_NEXT_SYNC))
使用 getFrameAtTime
方法即可懂版,傳入具體的某個時刻的參數(shù)鹃栽,第二個參數(shù)是獲取幀的選項。
對于時刻參數(shù)要注意的是:單位是微秒
躯畴,而不是我們常用的毫秒民鼓。而通過 extractMetadata 方法得到的多媒體文件時間長度 duration 單位卻是毫秒。
對于第二個參數(shù)獲取幀的選項蓬抄,有如下幾種:
- OPTION_PREVIOUS_SYNC
- OPTION_NEXT_SYNC
- OPTION_CLOSEST_SYNC
- OPTION_CLOSEST (性能較差)
主要差別就是在獲取指定時間點前還是后丰嘉。因為在指定時間點不一定有對應(yīng)的幀。
用了這個方法嚷缭, 就可以做到獲取 MP4 文件任意時間點的幀圖像了饮亏。
代碼參考 Github 地址
限制
原生的 MediaMetadataRetriever
還是有不少限制的耍贾,比如支持的多媒體文件格式少,而且還不能支持網(wǎng)絡(luò)鏈接的多媒體文件路幸。
這個時候荐开,就可以推薦使用了開源的 FFmpegMediaMetadataRetriever
庫,基于 FFmpeg 開發(fā)的劝赔。使用的接口如安卓原生一致誓焦,但功能更強大了。
對于視頻幀的補充
1着帽、視頻幀率
每秒顯示的幀數(shù) FPS。
2移层、幀數(shù)
一秒鐘時間里傳輸?shù)膱D片的量仍翰,也可以理解為圖形處理器每秒鐘能夠刷新幾次。
每一幀都是靜止的圖像观话∮杞瑁快速連續(xù)地顯示幀便形成了運動的假象。
3频蛔、碼率
在壓縮視頻時給這個視頻指定一個參數(shù)灵迫,用以告訴壓縮軟件期望的壓縮后的視頻的大小。
比特率是指每秒傳送的比特數(shù)晦溪。單位為 bps瀑粥,比特率越高,傳送的數(shù)據(jù)速度越快三圆。
一起交流學(xué)習(xí)狞换,答疑解惑,有問題舟肉,我們星球見~~~
覺得文章還不錯修噪,可以關(guān)注一下微信公眾號【紙上淺談】