在說這個話題之前需要知道幾個重點:
1.mediaRecorder/audioRecord區別
mediaRecorder是系統提供常用的錄音類,該類可以實現音頻錄音組建檔案。audioRecord也是系統提供的錄音類,但是他可以直接捕獲音頻流,開發人員可以即時隨意處理其內容。常見的情境比如語音交談/tom貓/k歌。
2.riff/wav/pcm/raw/mp3
riff是一種檔案描述格式,wav檔案就採用了riff描述,其前44位元組就是riff描述內容。pcm就是媒體資料的中繼資料,直接記錄聲音內容的。wav = riff + pcm,raw = pcm,而mp3是一種壓縮編碼,大概的意思就是將pcm通過演算法壓縮。
3.採樣率,位元速率,通道數,採樣值
採樣率是類比訊號採集頻率(每秒樣本數),採樣率越高聲音還原越真實;位元速率是類比訊號轉為數字訊號後的採樣率;採樣值又稱每樣本資料位元數,常見8位與16位;通道常見有單通道和雙通道,單通道每樣本佔用8/16位,雙通道每樣本佔用16/32位,且高8/16位是左聲道,低8/16位是右聲道;
然後我們再來討論如何?音頻合成:
1.首先我們需要獲得使用者聲音就需要錄音類,需要同步處理資料就只能用audioRecord了
2.錄製的聲音是pcm即中繼資料,我們需要與另外一個音效檔合并,這樣就必須將另外一個檔案解碼為pcm資料
3.獲得錄音與伴奏的pcm資料之後進行混合,混合演算法後面再說,簡單的來說就是算每位位元組的平均值
4.得到混合後的音頻pcm之後進行再編碼,比如以最終產生wav格式為例,只需要在pcm資料前加入44位元組的riff描述即可。
實現過程中遇到的問題:
1.錄音失真:在測試的過程中發現錄音檔案播放速度非常快,經分析發現是wav檔案頭描述與檔案實際內容不匹配導致,比如我採用44100採樣率,單聲道,16位採樣值錄音,但是riff中寫的是雙聲道,因此算出來的播放時間比實際時間少了一半,所以播放速度加倍。得出來的結論就是riff描述內容一定要與pcm實際內容匹配,否則就會導致播放聲音異常。----由此也可以推斷只要檔案能播,但是播放效果異常就說明多半是riff與pcm類型不符導致的.
2.部分檔案不支援:出現機率很小,可能是檔案本身編碼問題。
3.錄音過程耗時:audioRecord.read的時候會阻塞耗時,所以會出現mediaPlayer播放完了,錄音只錄到一半。
4.混合演算法:理論上混合演算法就是每位位元組相加除以位元求平均數即可,但前提條件是兩個檔案的通道數&採樣值必須一樣。之前也解釋過通道數與採樣值的作用,所以很好推斷如果採樣值之前是8bit要合16bit,就先要byte轉short再疊加求均數;如果是單通道要合雙通道就寫演算法加在前半位或後半位;雙通道轉單通道就前半位與後半位疊加後算平均數之後再與單通道疊加算平均數.
5.Android裝置只能以單聲道的形式錄製,即使傳入雙聲道的參數運行不報錯,也只能將產生的PCM當作單聲道檔案處理。
========================福利============源碼========================
Android audioRecord錄音Demo
http://download.csdn.net/detail/h3c4lenovo/4684011
Android音訊混合 -- K歌合成
http://download.csdn.net/detail/h3c4lenovo/4684013