1. 程式人生 > >Android音訊開發(1):基礎知識

Android音訊開發(1):基礎知識

Android音訊開發(1):基礎知識

導讀

人的說話頻率基本上為300Hz~3400Hz,但是人耳朵聽覺頻率基本上為20Hz~20000Hz。

對於人類的語音訊號而言,實際處理一般經過以下步驟:

人嘴說話——>聲電轉換——>抽樣(模數轉換)——>量化(將數字訊號用適當的數值表示)——>編碼(資料壓縮)——>

傳輸(網路或者其他方式)

——> 解碼(資料還原)——>反抽樣(數模轉換)——>電聲轉換——>人耳聽聲。

  • 抽樣率

實際中,人發出的聲音訊號為模擬訊號,想要在實際中處理必須為數字訊號,即採用抽樣、量化、編碼的處理方案。

處理的第一步為抽樣,即模數轉換。

簡單地說就是通過波形取樣的方法記錄1秒鐘長度的聲音,需要多少個數據。

根據奈魁斯特(NYQUIST)取樣定理,用兩倍於一個正弦波的頻繁率進行取樣就能完全真實地還原該波形。

所以,對於聲音訊號而言,要想對離散訊號進行還原,必須將抽樣頻率定為40KHz以上。實際中,一般定為44.1KHz。

44.1KHz取樣率的聲音就是要花費44000個數據來描述1秒鐘的聲音波形。

原則上取樣率越高,聲音的質量越好,取樣頻率一般共分為22.05KHz、44.1KHz、48KHz三個等級。

22.05 KHz只能達到FM廣播的聲音品質,44.1KHz則是理論上的CD音質界限,48KHz則已達到DVD音質了。

  • 位元速率

對於音訊訊號而言,實際上必須進行編碼。在這裡,編碼指信源編碼,即資料壓縮。如果,未經過資料壓縮,直接量化進行傳輸則被稱為PCM(脈衝編碼調製)。
要算一個PCM音訊流的位元速率是一件很輕鬆的事情,取樣率值×取樣大小值×聲道數 bps。
一個取樣率為44.1KHz,取樣大小為16bit,雙聲道的PCM編碼的WAV檔案,它的資料速率則為 44.1K×16×2 =1411.2 Kbps。
我們常說128K的MP3,對應的WAV的引數,就是這個1411.2 Kbps,這個引數也被稱為資料頻寬,它和ADSL中的頻寬是一個概念。將位元速率除以8,就可以得到這個WAV的資料速率,即176.4KB/s。

這表示儲存一秒鐘取樣率為44.1KHz,取樣大小為16bit,雙聲道的PCM編碼的音訊訊號,需要176.4KB的空間,1分鐘則約為10.34M,這對大部分使用者是不可接受的,尤其是喜歡在電腦上聽音樂的朋友,要降低磁碟佔用

只有2種方法,降低取樣指標或者壓縮。降低指標是不可取的,因此專家們研發了各種壓縮方案。最原始的有DPCM、ADPCM,其中最出名的為MP3。

所以,採用了資料壓縮以後的位元速率遠小於原始位元速率。

一、發的主要應用有哪些?

音訊播放器,錄音機,語音電話,音視訊監控應用,音視訊直播應用,音訊編輯/處理軟體,藍芽耳機/音箱,等等。

二、頻開發的具體內容有哪些?

(1)音訊採集/播放

(2)音訊演算法處理(去噪、靜音檢測、回聲消除、音效處理、功放/增強、混音/分離,等等)

(3)音訊的編解碼和格式轉換

(4)音訊傳輸協議的開發(SIP,A2DP、AVRCP,等等)

三、 音訊應用的難點在哪?

延時敏感、卡頓敏感、噪聲抑制(Denoise)、回聲消除(AEC)、靜音檢測(VAD)、混音演算法,等等。

四、 音訊開發基礎概念有哪些?

在音訊開發中,下面的這幾個概念經常會遇到。

1. 取樣率(samplerate)

取樣就是把模擬訊號數字化的過程,不僅僅是音訊需要取樣,所有的模擬訊號都需要通過取樣轉換為可以用0101來表示的數字訊號,示意圖如下所示:

藍色代表模擬音訊訊號,紅色的點代表取樣得到的量化數值。

取樣頻率越高,紅色的間隔就越密集,記錄這一段音訊訊號所用的資料量就越大,同時音訊質量也就越高。

根據奈奎斯特理論,取樣頻率只要不低於音訊訊號最高頻率的兩倍,就可以無損失地還原原始的聲音。

通常人耳能聽到頻率範圍大約在20Hz~20kHz之間的聲音,為了保證聲音不失真,取樣頻率應在40kHz以上。常用的音訊取樣頻率有:8kHz、11.025kHz、22.05kHz、16kHz、37.8kHz、44.1kHz、48kHz、96kHz、192kHz等。

對取樣率為44.1kHz的AAC音訊進行解碼時,一幀的解碼時間須控制在23.22毫秒內。

通常是按1024個取樣點一幀

分析:

1. AAC

一個AAC原始幀包含某段時間內1024個取樣點相關資料。

用1024主要是因為AAC是用的1024點的mdct。

音訊幀的播放時間=一個AAC幀對應的取樣樣本的個數/取樣頻率(單位為s)

取樣率(samplerate)為 44100Hz,表示每秒 44100個取樣點,

所以,根據公式,

音訊幀的播放時長 = 一個AAC幀對應的取樣點個數 / 取樣頻率

則,當前一幀的播放時間 = 1024 * 1000/44100= 23.22 ms(單位為ms)

48kHz取樣率,

則,當前一幀的播放時間 = 1024 * 1000/48000= 21.333ms(單位為ms)

22.05kHz取樣率,

則,當前一幀的播放時間 = 1024 * 1000/22050= 46.439ms(單位為ms)

2. MP3

mp3 每幀均為1152個位元組,

則:

每幀播放時長 = 1152 * 1000 / sample_rate

例如:sample_rate = 44100HZ時,

計算出的時長為26.122ms,

這就是經常聽到的mp3每幀播放時間固定為26ms的由來。

2. 量化精度(位寬)

上圖中,每一個紅色的取樣點,都需要用一個數值來表示大小,這個數值的資料型別大小可以是:4bit、8bit、16bit、32bit等等,位數越多,表示得就越精細,聲音質量自然就越好,當然,資料量也會成倍增大。

常見的位寬是:8bit 或者 16bit

3. 聲道數(channels)

由於音訊的採集和播放是可以疊加的,因此,可以同時從多個音訊源採集聲音,並分別輸出到不同的揚聲器,故聲道數一般表示聲音錄製時的音源數量或回放時相應的揚聲器數量。

單聲道(Mono)和雙聲道(Stereo)比較常見,顧名思義,前者的聲道數為1,後者為2

4. 音訊幀(frame)

是用於測量顯示幀數的量度。所謂的測量單位為每秒顯示幀數(Frames per Second,簡稱:FPS)或“赫茲”(Hz)。

音訊跟視訊很不一樣,視訊每一幀就是一張影象,而從上面的正玄波可以看出,音訊資料是流式的,本身沒有明確的一幀幀的概念,在實際的應用中,為了音訊演算法處理/傳輸的方便,一般約定俗成取2.5ms~60ms為單位的資料量為一幀音訊。

這個時間被稱之為“取樣時間”,其長度沒有特別的標準,它是根據編×××和具體應用的需求來決定的,我們可以計算一下一幀音訊幀的大小:

假設某通道的音訊訊號是取樣率為8kHz,位寬為16bit,20ms一幀,雙通道,則一幀音訊資料的大小為:

int size = 8000 x 16bit x 0.02s x 2 = 5120 bit = 640 byte

五、常見的音訊編碼方式有哪些?

上面提到過,模擬的音訊訊號轉換為數字訊號需要經過取樣和量化,量化的過程被稱之為編碼,根據不同的量化策略,產生了許多不同的編碼方式,常見的編碼方式有:PCM 和 ADPCM,這些資料代表著無損的原始數字音訊訊號,新增一些檔案頭資訊,就可以儲存為WAV檔案了,它是一種由微軟和IBM聯合開發的用於音訊數字儲存的標準,可以很容易地被解析和播放。

我們在音訊開發過程中,會經常涉及到WAV檔案的讀寫,以驗證採集、傳輸、接收的音訊資料的正確性。

六、常見的音訊壓縮格式有哪些?

首先簡單介紹一下音訊資料壓縮的最基本的原理:因為有冗餘資訊,所以可以壓縮。

(1) 頻譜掩蔽效應: 人耳所能察覺的聲音訊號的頻率範圍為20Hz~20KHz,在這個頻率範圍以外的音訊訊號屬於冗餘訊號。

(2) 時域掩蔽效應: 當強音訊號和弱音訊號同時出現時,弱訊號會聽不到,因此,弱音訊號也屬於冗餘訊號。

下面簡單列出常見的音訊壓縮格式:

MP3,AAC,OGG,WMA,Opus,FLAC,APE,m4a,AMR,等等

七、Adndroid VoIP相關的開源應用有哪些 ?

imsdroid,sipdroid,csipsimple,linphone,WebRTC 等等

八、音訊演算法處理的開源庫有哪些 ?

speex、ffmpeg,webrtc audio module(NS、VAD、AECM、AGC),等等

九、Android提供了哪些音訊開發相關的API?

音訊採集: MediaRecoder,AudioRecord

音訊播放: SoundPool,MediaPlayer,AudioTrack

音訊編解碼: MediaCodec

NDK API: OpenSL ES

十、音訊開發的延時標準是什麼?

ITU-TG.114規定,對於高質量語音可接受的時延是300ms。一般來說,如果時延在300~400ms,通話的互動性比較差,但還可以接受。時延大於400ms時,則互動通訊非常困難。

有問題請在下方留言或者加入星