天天看點

Android 音視訊開發基礎(一):音頻基礎

  1. 音頻開發主要應用有

    1.1 音頻播放器,錄音機,語音電話,音視訊直播應用,音頻編輯處理軟體,藍牙耳機、音箱等。

  2. 音頻開發具體内容有

    2.1 音頻采集與播放

    2.2 音頻算法處理(去噪,靜音檢測,回事消除,音效處理,功放/增強,混音/分離)

    2.3 音頻編解碼和格式轉換

    2.4 音頻傳輸協定的開發(SIP,A2DP, AVRCP,RTP,RTCP)

  3. 音頻應用的難點

    3.1 延時敏感、卡頓明感、噪聲抑制、回聲消除、靜音檢測、混音算法等。

  4. 音頻開發基礎概念有

    4.1 采樣率,采樣是從模拟語音信号轉數字信号的過程,所有的模拟信号都需要通過采樣轉為可以表示的數字信号。目前44100Hz是唯一可以保證相容所有Android手機的采樣率。

    4.2 奈奎斯特理論:采樣頻率不低于音頻信号最高頻率的兩倍,就可以做到無誤還原原始的聲音。通常人耳能聽到的20HZ-20KHZ的聲音,為了保證不失真,采樣頻率應該在40KHZ以上。

    4.3 量化精度(位寬),每一個采樣點,都需要一個數值來表示大小,這個大小可以是4bit,8bit,16bit… 位數越多,表示越精細,聲音品質就越好,當然,資料量也成倍增大。ENCODING_PCM_16BIT是可以保證相容所有Android手機的。

    4.4 聲道數,音頻可以從不同的音頻源采集并輸出到不同的揚聲器,一般表示聲音錄制時的音源數量或者回放時相應的揚聲器數量。常見有單身道mono及雙聲道stereo。

    4.5 音頻幀,音頻資料和視訊幀不一樣,視訊幀就是一張圖像,音頻資料是流式結構,本身沒有明确的一幀的概念,隻是為了音頻算法處理傳輸友善,約定2.5ms~60ms為機關的資料量為一幀音頻。這個時間為采樣時間。AndioRecord内部的音頻緩沖區大小不能低于一幀音頻幀的大小。一幀音頻幀大小:int size = 采樣率x位寬x采樣時間x通道數。AudioRecord類提供了一個幫助我們确定緩沖區大小的函數,int getMinBufferSize(int sampleRateInHz, int channelConfig,int audioFormat)。假設某雙通道音頻信号采樣率為8k,位寬16bit,20ms一幀的采樣時間。則一幀資料的大小為:size = 8000x16x0.02x2 = 640byte(位元組)

  5. 常見音頻編碼方式

    5.1 A/D需要采樣和量化,對應上面提到的采樣率和量化寬度。量化的過程被稱為編碼,根據不同的量化政策,有不同的編碼方式,常見有PCM,ADPCM。這些資料代表了無損的原始數字音頻信号,添加一些檔案頭資訊,就可以存儲為wav檔案了。

    5.2 擷取不同手機終端的編解碼分辨率,可以通過adb工具擷取/system/etc/media_codecs.xml檔案。

  6. 常見音頻壓縮格式

    原理:因為有備援資訊,是以需要壓縮

    6.1 頻譜掩蔽效應:人耳能察覺到的頻率範圍為20hz-20khz,在這個頻率範圍之外的音頻信号屬于備援信号。

    6.2 時域掩蔽效應:當強音信号和弱音信号同時出現時,弱信号會聽不到,是以此時弱音信号也屬于備援信号。

  7. Android VoIP 相關的開源應用有

    7.1 Imsdroid,sipdroid,csipsimple,linephone,WebRTC等。

  8. 音頻算法處理的開源庫有

    8.1 Speex,ffmpeg,webrtc

  9. Android 提供音頻相關的API

    9.1 音頻采集:MediaRecoder,AudioRecord

    AudioTrack 提供了兩種播放模式,一種是static方式,一種是streaming方式,前者需要一次性将所有資料都寫入播放緩沖區,簡單高效,通常用于鈴聲播放,系統提醒的音頻片段,後者需要按照一定時間間隔不斷寫入音頻資料,理論上可以任何音頻播放的場景。

    9.2 音頻播放:SoundPool,MediaPlayer,AudioTrack

    9.3 音頻編解碼:MediaCodec

    9.4 NDK API:OpenSL ES

  10. 音頻開發的延時标準

    10.1 對于高品質語音可以接受延時為300ms,一般而言,如果時延在300~400ms,通話的互動性比較差,但還可以接受,時延大于400ms時,則互動通信非常困難。