1. 程式人生 > >Android AudioRecord介紹與Android 6.0後的改變

Android AudioRecord介紹與Android 6.0後的改變

AudioRecord介紹

在android中採集音訊的api是android.media.AudioRecord類

其中構造器的幾個引數就是標準的聲音採集引數

以下是引數的含義解釋

public AudioRecord (int audioSource, int sampleRateInHz, int channelConfig, int audioFormat, int bufferSizeInBytes)

先給大家分析一下這幾個引數具體的含義:

AUDIOSOURCE

官方:
the recording source. See MediaRecorder.AudioSource for recording source definitions.

我的理解:
音訊源:指的是從哪裡採集音訊。這裡我們當然是從麥克風採集音訊,所以此引數的值為MIC

SAMPLERATEINHZ

官方:
the sample rate expressed in Hertz. Examples of rates are (but not limited to) 44100, 22050 and 11025.

我的理解:
取樣率:音訊的取樣頻率,每秒鐘能夠取樣的次數,取樣率越高,音質越高。給出的例項是44100、22050、11025但不限於這幾個引數。例如要採集低質量的音訊就可以使用4000、8000等低取樣率。
取樣人聲音一般用44100,也就是我們平時錄音時採用的取樣率

CHANNELCONFIG

官方:
describes the configuration of the audio channels. See CHANNEL_IN_MONO and CHANNEL_IN_STEREO

我的理解:
聲道設定:android支援雙聲道立體聲和單聲道。MONO單聲道,STEREO立體聲

AUDIOFORMAT

官方:
the format in which the audio data is represented. See ENCODING_PCM_16BIT and ENCODING_PCM_8BIT

我的理解:
編碼制式和取樣大小:採集來的資料當然使用PCM編碼(脈衝程式碼調製編碼,即PCM編碼。PCM通過抽樣、量化、編碼三個步驟將連續變化的模擬訊號轉換為數字編碼。) android支援的取樣大小16bit 或者8bit

。當然取樣大小越大,那麼資訊量越多,音質也越高,現在主流的取樣大小都是16bit,在低質量的語音傳輸的時候8bit足夠了。

BUFFERSIZEINBYTES

官方:
the total size (in bytes) of the buffer where audio data is written to during the recording. New audio data can be read from this buffer in smaller chunks than this size. SeegetMinBufferSize(int, int, int) to determine the minimum required buffer size for the successful creation of an AudioRecord instance. Using values smaller than getMinBufferSize() will result in an initialization failure.

我的理解:
採集資料需要的緩衝區的大小,如果不知道最小需要的大小可以在getMinBufferSize()檢視。

Android6.0發現的改變點:

1、許可權改變

Android 6.0以前安裝應用時就會彈出許可權對話方塊給使用者,而Android6.0以後再安裝或開啟應用時並不會彈出許可權對話方塊,而是在你使用到當前功能(這裡指的是錄音功能時才會彈出)

2、系統不再支援8bit的編位元速率

上面已經說了,再低質量語音傳輸時8bit已經夠了,再我們6.0以前使用8bit編位元速率對大部分的手機錄音已經足矣,這裡需要解釋一下編位元速率到底是啥:

要算一個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,這對大部分使用者是不可接受的。

所以有很多人為了再頻寬上優化,增加取樣率肯定是不可取的,所以就把16bit改成8bit,而對Andorid 6.0以前的影響並不會很大,但是在6.0以後,你再使用8bit就會出現異常了,這點一定要注意。