1. 程式人生 > >音訊開發基本知識總結

音訊開發基本知識總結

一、音訊的基本概念

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適合比較長且時間要求不高的情況,比如播放mp3aac等檔案,而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_ALARMSTREAM_MUSCISTREAM_RINGSTREAM_SYSTEM等;目的是可對不同型別的音訊分別管理。

sampleRateInHz:取樣率;

channelConfig: 聲道數;

audioFormat: 取樣點位數;

bufferSizeInBytes: 緩衝區大小,利用getMinBufferSize得到的值;

mode:包括MODE_STATICMODE_STREAM。其中MODE_STATIC表示一次性將所有音訊資料傳送給AudioTrack,適用於資料量小、延時要求高的音訊;MODE_STREAM模式下將會通過write分多次將音訊資料寫到AudioTrack中,有一定的延時。

3. 開始播放

audioTrack.play()

4. 寫入資料

audioTrack.write(buffer, 0, buffer.length);

5. 結束播放

audioTrack.stop();

audioTrack.release();