音訊開發基本知識總結
一、音訊的基本概念
1.取樣率:(也稱為取樣速度或者取樣頻率)定義了每秒從連續訊號中提取並組成離散訊號的取樣個數,單位用赫茲(Hz)來表示。取樣頻率的倒數是取樣週期(也稱為取樣時間),它表示取樣之間的時間間隔。
常用的取樣率有:
* 8,000 Hz - 電話所用取樣率, 對於人的說話已經足夠;; * 11,025 Hz; * 22,050 Hz - 無線電廣播所用取樣率; * 32,000 Hz - miniDV 數碼視訊 camcorder、DAT (LP mode)所用取樣率; * 44,100 Hz - 音訊 CD, 也常用於 MPEG-1 音訊(VCD, SVCD, MP3)所用取樣率; * 47,250 Hz - Nippon Columbia (Denon)開發的世界上第一個商用 PCM* 48,000 Hz - miniDV、數字電視、DVD、DAT、電影和專業音訊所用的數字聲音所用取樣率;
2.位元率:每秒傳輸的位元數,單位時間內傳輸或處理的位元數量。位元率越高,傳送的資料越大。
3.位元速率:單位時間內傳送的資料位數,位元速率越高,被壓縮的比例越小,音質損失越小,與音源的音質越接近。
4.幀速率:每秒重新整理圖片的幀數,幀速率越高,可以得到更流暢,更逼真的動畫。
5.解析度:單位長度內包含的畫素點的數量。
6.位寬:也叫取樣位數和取樣深度,用來衡量聲音波動變化的一個引數。
7.聲道數:聲音通道的數目。
二、常見音訊格式
有失真壓縮:MP3、AAC、WMA、OGG、MPC
無失真壓縮格式:WAV、FLAC、APE、WV、TAK、TTA。
三、Android中 java 層三種音訊播放方式
SoundPool適合短促且對反應速度比較高的情況(遊戲音效或按鍵聲等),
MediaPlayer適合比較長且時間要求不高的情況,比如播放mp3、aac等檔案,而AudioTrack可播放解碼後pcm的裸流。
使用方式
1. 先計算最小緩衝區大小
int bufferSize = AudioTrack.getMinBufferSize(16000,AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT);//函式原型為static public int getMinBufferSize(int sampleRateInHz, int channelConfig, int audioFormat)
getMinBufferSize函式的第一個引數為音訊取樣率、第二個引數為聲道數、第三個引數表示每個取樣點的位數。
2. 新建AudioTrack物件
AduioTrack audioTrack= new AudioTrack(AudioManager.STREAM_MUSIC, 16000, AudioFormat.CHANNEL_OUT_MONO,AudioFormat.ENCODING_PCM_16BIT, bufferSize, AudioTrack.MODE_STREAM);//函式原型為: public AudioTrack(int streamType, int sampleRateInHz, int channelConfig, int audioFormat,int bufferSizeInBytes, int mode)
引數說明:
streamType:音訊型別,如STREAM_ALARM、STREAM_MUSCI、STREAM_RING、STREAM_SYSTEM等;目的是可對不同型別的音訊分別管理。
sampleRateInHz:取樣率;
channelConfig: 聲道數;
audioFormat: 取樣點位數;
bufferSizeInBytes: 緩衝區大小,利用getMinBufferSize得到的值;
mode:包括MODE_STATIC和MODE_STREAM。其中MODE_STATIC表示一次性將所有音訊資料傳送給AudioTrack,適用於資料量小、延時要求高的音訊;MODE_STREAM模式下將會通過write分多次將音訊資料寫到AudioTrack中,有一定的延時。
3. 開始播放
audioTrack.play();
4. 寫入資料
audioTrack.write(buffer, 0, buffer.length);
5. 結束播放
audioTrack.stop();
audioTrack.release();