前言
音頻的相關(guān)知識(shí)我們從AudioRecord的構(gòu)造傳參看起:
RecorderHelper.getInstance().initRecoder(
this,
MediaRecorder.AudioSource.MIC, //麥克風(fēng)數(shù)據(jù)
16000, //采樣率16k
AudioFormat.CHANNEL_CONFIGURATION_MONO, //單聲道
AudioFormat.ENCODING_PCM_16BIT);// 16bit的采樣精度
上面一個(gè)初始化麥克風(fēng)的調(diào)用转捕,涉及到了很多知識(shí)五芝,大概是大學(xué)時(shí)數(shù)字信號(hào)處理課程或者是信號(hào)與系統(tǒng)學(xué)的。相關(guān)覺得有必要科普一下沉删,不然大家永遠(yuǎn)是在復(fù)制代碼醉途,遇到相關(guān)問題的時(shí)候如果不了解會(huì)一頭霧水隘擎,優(yōu)化效果更提不上了。
這篇文章不是用來介紹API的推正,介紹AndroidRecord API很簡(jiǎn)單植榕,無非初始化然后讀取尼夺。如果只是這么簡(jiǎn)單的需求,甚至這個(gè)類都用不到淤堵,直接用MediaRecorder
即可錄音等寝衫。本文主要介紹相關(guān)的參數(shù)是什么意思。比如什么是16Bit采樣拐邪,什么是44100采樣率慰毅。
簡(jiǎn)介
Google API地址
https://developer.android.google.cn/reference/android/media/AudioRecord.html
從網(wǎng)頁的右上角我們可以看到,這是從API3等級(jí)開始就有的類扎阶。AndroidRecord
是一個(gè)比MediaRecorder
更加底層的類汹胃,根據(jù)谷歌介紹婶芭,有點(diǎn)相當(dāng)于是直接從音頻設(shè)備拉數(shù)據(jù)的意思,并且我們拿到的也直接是PCM流着饥。
從API23開始 多了個(gè)AudioRecord.Builder
類來幫助我們初始化AndroidRecord
,可惜這個(gè)類還不如不用宰掉,用了我23以下的還得用老方法初始化呵哨,這不僅沒優(yōu)化代碼,還冗余了代碼轨奄。
構(gòu)造方法
AudioRecord(int audioSource, int sampleRateInHz, int channelConfig, int audioFormat, int bufferSizeInBytes)
參數(shù) | 介紹 |
---|---|
audioSource |
MediaRecorder.AudioSource類里面的各種類型孟害,有MIC 、VOICE_CALL 等 |
sampleRateInHz | 采樣率戚绕,44100Hz是唯一可以工作于所有手機(jī)上的采樣率纹坐,22050, 16000, and 11025 可能只有部分機(jī)型能工作,我之前就因?yàn)樵O(shè)置的采樣率為16000導(dǎo)致在我的手機(jī)上工作正常枝冀,而在努比亞手機(jī)上Buffer滿的時(shí)間變短導(dǎo)致了些問題舞丛。 |
channelConfig | CHANNEL_IN_MONO 和 CHANNEL_IN_STEREO.即單聲道和立體聲也叫雙聲道,雙聲道可以有保證的作于所有手機(jī)上 |
audioFormat | ENCODING_PCM_8BIT, ENCODING_PCM_16BIT, and ENCODING_PCM_FLOAT. 有8bit果漾,16bit球切,32bit的采樣精度 |
bufferSizeInBytes | Record的內(nèi)部記錄緩沖區(qū)大小,可以通過getMinBufferSize(int, int, int) 方法得到绒障。 |
什么是PCM
脈沖編碼調(diào)制(Pulse Code Modulation,PCM)吨凑,這是在信號(hào)與系統(tǒng)里面接觸過的編碼格式,脈沖編碼調(diào)制是數(shù)字通信的編碼方式之一户辱。主要過程是將話音鸵钝、圖像等模擬信號(hào)每隔一定時(shí)間進(jìn)行取樣,使其離散化庐镐,同時(shí)將抽樣值按分層單位四舍五入取整量化恩商,同時(shí)將抽樣值按一組二進(jìn)制碼來表示抽樣脈沖的幅值。
PCM通過抽樣必逆、量化怠堪、編碼三個(gè)步驟將連續(xù)變化的模擬信號(hào)轉(zhuǎn)換為數(shù)字編碼
什么是采樣率?
采樣率又叫抽樣名眉,由于聲音其實(shí)是一種能量波粟矿,因此也有頻率和振幅的特征,頻率對(duì)應(yīng)于時(shí)間軸線损拢,振幅對(duì)應(yīng)于電平軸線陌粹。波是無限光滑的,弦線可以看成由無數(shù)點(diǎn)組成福压,由于存儲(chǔ)空間是相對(duì)有限的掏秩,數(shù)字編碼過程中绘证,必須對(duì)弦線的點(diǎn)進(jìn)行采樣。采樣的過程就是抽取某點(diǎn)的頻率值哗讥,很顯然嚷那,在一秒中內(nèi)抽取的點(diǎn)越多,獲取得頻率信息更豐富杆煞,為了復(fù)原波形魏宽,一次振動(dòng)中,必須有2個(gè)點(diǎn)的采樣决乎,人耳能夠感覺到的最高頻率為20kHz队询,因此要滿足人耳的聽覺要求,則需要至少每秒進(jìn)行40k次采樣构诚,用40kHz表達(dá)蚌斩,這個(gè)40kHz就是采樣率。我們常見的CD范嘱,采樣率為44.1kHz送膳。
44.1kHz意味著什么呢?假設(shè)我們有2段正弦波信號(hào)丑蛤,分別為20Hz和20KHz叠聋,長(zhǎng)度均為一秒鐘,以對(duì)應(yīng)我們能聽到的最低頻和最高頻受裹,分別對(duì)這兩段信號(hào)進(jìn)行 40KHz的采樣碌补,我們可以得到一個(gè)什么樣的結(jié)果呢?結(jié)果是:20Hz的信號(hào)每次振動(dòng)被采樣了40K/20=2000次棉饶,而20K的信號(hào)每次振動(dòng)只有2次采樣厦章。顯然,在相同的采樣率下照藻,記錄低頻的信息遠(yuǎn)比高頻的詳細(xì)袜啃。這也是為什么有些音響發(fā)燒友指責(zé)CD有數(shù)碼聲不夠真實(shí)的原因,CD的44.1KHz采樣也無法保證高頻信號(hào)被較好記錄岩梳。要較好的記錄高頻信號(hào)囊骤,看來需要更高的采樣率,于是有些朋友在捕捉CD音軌的時(shí)候使用48KHz的采樣率冀值,這是不可取的也物!這其實(shí)對(duì)音質(zhì)沒有任何好處,對(duì)抓軌軟件來說列疗,保持和CD提供的44.1KHz一樣的采樣率才是最佳音質(zhì)的保證之一滑蚯,而不是去提高它。較高的采樣率只有相對(duì)模擬信號(hào)的時(shí)候才有用,如果被采樣的信號(hào)是數(shù)字的告材,請(qǐng)不要去嘗試提高采樣率坤次。
常用的采樣率為:44.1KHz與48KHz
什么是采樣精度?
1 字節(jié)(也就是8bit) 只能記錄 256 個(gè)數(shù), 也就是只能將振幅劃分成 256 個(gè)等級(jí);
2 字節(jié)(也就是16bit) 可以細(xì)到 65536 個(gè)數(shù), 這已是 CD 標(biāo)準(zhǔn)了;
4 字節(jié)(也就是32bit) 能把振幅細(xì)分到 4294967296 個(gè)等級(jí), 實(shí)在是沒必要了.
如果是雙聲道(stereo), 采樣就是雙份的, 文件也差不多要大一倍.
我們來看一張圖就能明白:
上述的模擬數(shù)據(jù)模擬就好比人的聲音是有振幅有頻率的波斥赋,假設(shè)上面的模擬數(shù)據(jù)時(shí)長(zhǎng)為1秒缰猴。
那么采樣,可以看到我們采樣了10根線疤剑,那采樣率就是10Hz滑绒。(44100Hz是多高自己體會(huì))
再看量化,分為了8個(gè)等級(jí)隘膘,也就是采樣進(jìn)度是3bit疑故。(可以想象16bit是多么精確了)
最后1秒鐘的數(shù)據(jù),被編碼成了3bit×10 即30個(gè)二進(jìn)制數(shù)據(jù)弯菊。
單聲道和立體聲
如果是8bit的采樣纵势,對(duì)于單聲道聲音文件,采樣數(shù)據(jù)為八位的短整數(shù)(short int 00H-FFH)管钳;
而對(duì)于雙聲道立體聲聲音文件钦铁,每次采樣數(shù)據(jù)為一個(gè)16位的整數(shù)(int),高八位(左聲道)和低八位(右聲道)分別代表兩個(gè)聲道蹋嵌。
碼率計(jì)算
算一個(gè)PCM音頻流的碼率是一件很輕松的事情育瓜,采樣率值×采樣大小值×聲道數(shù)bps。一個(gè)采樣率為44.1KHz栽烂,采樣大小為16bit,雙聲道的PCM編碼的WAV文件恋脚,它的數(shù)據(jù)速率則為 44.1K×16×2 =1411.2 Kbps腺办。我們常說128K的MP3,對(duì)應(yīng)的WAV的參數(shù)糟描,就是這個(gè)1411.2 Kbps怀喉,這個(gè)參數(shù)也被稱為數(shù)據(jù)帶寬,它和ADSL中的帶寬是一個(gè)概念船响。將碼率除以8,就可以得到這個(gè)WAV的數(shù)據(jù)速率躬拢,即176.4KB/s。這表示存儲(chǔ)一秒鐘采樣率為44.1KHz见间,采樣大小為16bit聊闯,雙聲道的PCM編碼的音頻信號(hào),需要176.4KB的空間米诉,1分鐘則約為10.34M菱蔬,這對(duì)大部分用戶是不可接受的,尤其是喜歡在電腦上聽音樂的朋友,要降低磁盤占用拴泌,只有2種方法魏身,降低采樣指標(biāo)或者壓縮。降低指標(biāo)是不可取的蚪腐,因此專家們研發(fā)了各種壓縮方案箭昵。
碼率的不同帶來的是音頻品質(zhì)的不同,我們的音樂軟件里面有音樂的品質(zhì)其實(shí)就是這些回季,正常我們聽的當(dāng)然是有損壓縮的歌曲宙枷,比如QQ音樂里面聽歌有SQ無損品質(zhì),就是無損壓縮的音頻茧跋。
WAV文件介紹
PCM流我們可以直接保存為文件慰丛,但是這就是PCM格式了,正常播放器都沒有播放pcm的功能瘾杭,我們可以把PCM轉(zhuǎn)成WAV诅病。WAV文件是一種一種無損的音頻文件格式,里面還是PCM的編碼粥烁,只不過是在我們?cè)械膒cm文件上加上一個(gè)WAV規(guī)定的協(xié)議頭而已贤笆。這個(gè)頭是44個(gè)byte大小。所以一個(gè)0bit的pcm文件轉(zhuǎn)成wav大小是44B讨阻。
因?yàn)閃AV并沒有進(jìn)行壓縮芥永,所以WAV占用的空間是最大的。因此為了傳輸以及存儲(chǔ)的需求后來人們?cè)O(shè)計(jì)了很多的音頻壓縮格式钝吮,mp3就是一種有損的壓縮音頻埋涧,至于怎么壓縮的那是各種壓縮算法的事情了。
本文作者:Anderson/Jerey_Jobs
博客地址 : http://jerey.cn/
簡(jiǎn)書地址 : Anderson大碼渣
github地址 : https://github.com/Jerey-Jobs