音頻混音能實(shí)現(xiàn)什么
提取一個(gè)視頻文件的音頻軌道滥搭,和另一個(gè)事先準(zhǔn)備好的 mp3 文件混音
場(chǎng)景類似于視頻剪輯軟件的混音操作,將原視頻文件和配樂混音捣鲸,生成新的音頻
& 0xff 的意義
- & 與運(yùn)算瑟匆,只有兩者相同時(shí),該位與的結(jié)果才為 1
- 0x 表示 16 進(jìn)制栽惶,0xff 的二進(jìn)制表示為 1111 1111
- & 0xff 剛好是取當(dāng)前字節(jié)的數(shù)值轉(zhuǎn)為二進(jìn)制愁溜,通常搭配移位運(yùn)算一同服用
混音是怎么實(shí)現(xiàn)的
- 獲取兩個(gè)待混音的文件
- 使用 MediaExtractor 提取音頻軌道
- 使用 MediaCodec 解碼成 PCM 裸數(shù)據(jù)
- 對(duì) PCM 的字節(jié)數(shù)據(jù)進(jìn)行相加
- 生成新的音頻文件
混音是基于 PCM 的基礎(chǔ)上,在封裝格式的文件無法直接進(jìn)行音頻剪輯外厂、混音等操作
使用三個(gè)字節(jié)數(shù)組作為數(shù)據(jù)暫存區(qū)冕象,分別對(duì)應(yīng)著素材1,素材2和待合成的文件汁蝶,這里又涉及到了不同聲道數(shù)渐扮,量化位數(shù)的素材音頻混音的兼容問題,需要重采樣
取素材 1 和素材 2 對(duì)應(yīng)的 pcm 數(shù)據(jù)進(jìn)行相加,需要考慮到兩個(gè) short 類型的數(shù)相加后可能會(huì)超過 short 的范圍墓律,遇到這種情況時(shí)我們直接取 short 的邊界
調(diào)整素材音頻的音量大小時(shí)意荤,可能會(huì)遇到丟失精度的問題
獲取音頻軌道后,怎樣將數(shù)據(jù)送去解碼
我們使用 MediaExtractor 獲取軌道所在的位置后只锻,通過遍歷獲取到指定的軌道玖像,然后通過 MediaExtractor.readSampleData() 將軌道數(shù)據(jù)放到 Buffer 中,此時(shí)就需要 MediaCodec 解碼了齐饮,當(dāng)拿到空閑的 ByteBuffer 后捐寥,將 Buffer 中的數(shù)據(jù)放到 輸入緩沖區(qū)中,然后 MediaExtractor 釋放上一幀的壓縮數(shù)據(jù)( MediaExtractor.advance() )
重采樣
- 什么是重采樣:改變音頻文件原本的采樣率的過程叫做重采樣
- Android 中什么時(shí)候需要音頻重采樣
在幾個(gè)不同采樣率的音頻文件時(shí)祖驱,一次只能設(shè)置一個(gè)采樣率握恳,需要統(tǒng)一個(gè)值,并且可能不讓其他音頻失真
ANDROID音頻系統(tǒng)散記之五:如何繞開多媒體音軌的重采樣
- android 著名的 src 問題