簡介
我在之前文章《Android 音視頻之音頻AAC編碼》中介紹過,如何將音頻原始pcm數(shù)據(jù)進(jìn)行AAC編碼。本章儒恋,我簡單介紹一下善绎,Android對(duì)音頻文件進(jìn)行編碼轉(zhuǎn)換。編碼轉(zhuǎn)換诫尽,俗稱轉(zhuǎn)碼禀酱,就是將音頻文件的編碼進(jìn)行轉(zhuǎn)換。我們需要先將音頻文件解碼成原始數(shù)據(jù),再對(duì)原始數(shù)據(jù)編碼成想要的音頻文件磺陡。
MediaExtractor
MediaExtractor類叮称,可以用來分離視頻文件中的音頻,字幕和視頻軌道曹洽。
/**
* 初始化解碼器
*/
private void initMediaDecode() {
try {
mediaExtractor = new MediaExtractor();//此類可分離視頻文件的音軌和視頻軌道
mediaExtractor.setDataSource(srcPath);//媒體文件的位置
for (int i = 0; i < mediaExtractor.getTrackCount(); i++) {//遍歷媒體軌道
//此處我們傳入的是音頻文件,所以也就只有一條軌道
MediaFormat format = mediaExtractor.getTrackFormat(i);
String mime = format.getString(MediaFormat.KEY_MIME);
//此處注意前綴 音頻前綴為audio辽剧,視頻為video送淆,字幕為text
//我們可用此區(qū)別區(qū)分媒體文件內(nèi)的音頻軌道和視頻軌道
//mime的各種類型定義在MediaFormat靜態(tài)常量中
if (mime.startsWith("audio")) {//獲取音頻軌道
mediaExtractor.selectTrack(i);//選擇此音頻軌道
mediaDecode = MediaCodec.createDecoderByType(mime);//創(chuàng)建對(duì)應(yīng)格式的Decode解碼器
mediaDecode.configure(format, null, null, 0);
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}
if (mediaDecode == null) {
Log.e(TAG, "create mediaDecode failed");
return;
}
mediaDecode.start();//啟動(dòng)MediaCodec ,等待傳入數(shù)據(jù)
decodeInputBuffers = mediaDecode.getInputBuffers();//MediaCodec在此ByteBuffer[]中獲取輸入數(shù)據(jù)
decodeOutputBuffers = mediaDecode.getOutputBuffers();//MediaCodec將解碼后的數(shù)據(jù)放到此ByteBuffer[]中 我們可以直接在這里面得到PCM數(shù)據(jù)
decodeBufferInfo = new MediaCodec.BufferInfo();//用于描述解碼得到的byte[]數(shù)據(jù)的相關(guān)信息
}
案例
因?yàn)闆]有mp3的資源怕轿,所以我就隨便去qq音樂的排行榜下載了一首歌偷崩,G.E.M鄧紫棋的《光年之外》,挺好聽的撞羽。通過ffmpeg查看了這首mp3的信息阐斜。
可以從打印的內(nèi)容中看到這首mp3重要的信息。44.1khz诀紊,(stereo)多聲道谒出,碼率128kb/s,LAME編碼渡紫。不知道為什么qq音樂沒有使用aac編碼到推,不過正好,我們可以將他轉(zhuǎn)碼成aac編碼文件惕澎。
轉(zhuǎn)碼成功后莉测,我們把他pull到電腦上。
可以看到唧喉,下載的mp3文件捣卤,3769367個(gè)字節(jié),大概3.6MB八孝,而我們進(jìn)行轉(zhuǎn)碼過的aac文件董朝,只有1.3MB的大小。但是音質(zhì)上干跛,基本聽不出有任何的區(qū)別子姜。
最近雙十一臨近,沒太多時(shí)間更新楼入,請(qǐng)大家原諒哥捕。
未完待更新...
上一篇:Android 音視頻之音頻編碼
有問題的地方請(qǐng)大家?guī)兔χ赋瞿脸椋x謝。
持續(xù)更新中...