語(yǔ)音文件的格式、字節(jié)計(jì)算、PCM頭信息 2019-04-26

語(yǔ)音文件

PCM

我們?cè)谝纛l處理的時(shí)候經(jīng)常會(huì)接觸到PCM數(shù)據(jù):它是模擬音頻信號(hào)經(jīng)模數(shù)轉(zhuǎn)換(A/D變換)直接形成的二進(jìn)制序列,該文件沒(méi)有附加的文件頭文件結(jié)束標(biāo)志。

聲音本身是模擬信號(hào),而計(jì)算機(jī)只能識(shí)別數(shù)字信號(hào),要在計(jì)算機(jī)中處理聲音,就需要將聲音數(shù)字化,這個(gè)過(guò)程叫經(jīng)模數(shù)轉(zhuǎn)換(A/D變換)。最常見(jiàn)的方式是透過(guò)脈沖編碼調(diào)制PCM (Pulse Code Modulation) 。

運(yùn)作原理如下:首先我們考慮聲音經(jīng)過(guò)麥克風(fēng),轉(zhuǎn)換成一連串電壓變化的信號(hào),如下圖所示。這張圖的橫座標(biāo)為秒,縱座標(biāo)為電壓大小。


要將這樣的信號(hào)轉(zhuǎn)為 PCM 時(shí),需要將聲音量化,我們一般從如下幾個(gè)維度描述一段聲音:

1.聲道數(shù)? 2.采樣位數(shù)? 3.采樣頻率? 4.時(shí)長(zhǎng)

采樣頻率:即取樣頻率,指每秒鐘取得聲音樣本的次數(shù)。采樣頻率越高,聲音的質(zhì)量也就越好,聲音的還原也就越真實(shí),但同時(shí)它占的資源比較多。由于人耳的分辨率很有限,太高的頻率并不能分辨出來(lái)。在16位聲卡中有22KHz、44KHz等幾級(jí),其中,22KHz相當(dāng)于普通FM廣播的音質(zhì),44KHz已相當(dāng)于CD音質(zhì)了,目前的常用采樣頻率都不超過(guò)48KHz。

采樣位數(shù):即采樣值或取樣值(就是將采樣樣本幅度量化)。它是用來(lái)衡量聲音波動(dòng)變化的一個(gè)參數(shù),也可以說(shuō)是聲卡的分辨率。它的數(shù)值越大,分辨率也就越高,所發(fā)出聲音的能力越強(qiáng)。

聲道數(shù):很好理解,有單聲道和立體聲之分,單聲道的聲音只能使用一個(gè)喇叭發(fā)聲(有的也處理成兩個(gè)喇叭輸出同一個(gè)聲道的聲音),立體聲的PCM?可以使兩個(gè)喇叭都發(fā)聲(一般左右聲道有分工) ,更能感受到空間效果。

時(shí)長(zhǎng):?采樣的時(shí)長(zhǎng)


下面再用圖解來(lái)看看采樣位數(shù)和采樣頻率的概念。讓我們來(lái)看看這幾幅圖。

圖中的黑色曲線(xiàn)表示的是PCM?文件錄制的自然界的聲波,

紅色曲線(xiàn)表示的是PCM?文件輸出的聲波,

這個(gè)圖中,采樣點(diǎn)是離散的,每一個(gè)點(diǎn)對(duì)應(yīng)pcm一個(gè)單元的數(shù)據(jù)。

采樣頻率越高,x軸采樣點(diǎn)就越密集,聲音越接近原始數(shù)據(jù)

采樣位數(shù)越高,y軸采樣點(diǎn)就越密集,聲音越接近原始數(shù)據(jù)


采樣頻率單位為Hz,表示每秒采樣的次數(shù):

一般有11025HZ(11KHz)、22050HZ(22KHz)、44100Hz(44KHz)三種。

采樣位數(shù)單位為bit(位),一般有 8bit 和 16bit 。8bit 表示用 8bit 空間量化某時(shí)刻的聲音,這一點(diǎn)基本是和圖片用r、g、b三單位共 24bit 量化顏色一樣。


綜上所述,我們可以得到pcm文件的體積計(jì)算公式(這里我們把 采樣位數(shù)/8 是因?yàn)殡娔X上是將bit轉(zhuǎn)化為byte):

存儲(chǔ)量

存儲(chǔ)量 = (采樣頻率?×?采樣位數(shù)/8) ×?聲道?×?時(shí)間.

每個(gè)采樣數(shù)據(jù)記錄的是振幅,采樣精度取決于儲(chǔ)存空間的大小。

1字節(jié)(8bit)只能記錄256個(gè)數(shù),也就是只能將振幅劃分到256個(gè)等級(jí)。

2字符(16bit)可以記錄256^2=65536個(gè)數(shù),將振幅劃分到65536個(gè)等級(jí),是CD的標(biāo)準(zhǔn)。

4字節(jié)(32bit)細(xì)分到256^4個(gè)數(shù),?沒(méi)有必要,太精細(xì)了。

以8k 16bit音頻為例、采樣率8k=8000個(gè)采樣點(diǎn)/秒。

16bit音頻是16位。每8位一個(gè)字節(jié),所以16bit是兩個(gè)字節(jié)。

上面的是單聲道(nomo),如果是雙聲道,所有信息全部×2

?時(shí)間是這個(gè)音頻的秒數(shù)

例如,數(shù)字激光唱盤(pán)(CD-DA,紅皮書(shū)標(biāo)準(zhǔn))的標(biāo)準(zhǔn)采樣頻率為44.l kHz,采樣數(shù)位為16 位,立體聲(2聲道),可以幾乎無(wú)失真地播出頻率高達(dá)22 kHz的聲音,這也是人類(lèi)所能聽(tīng)到的最高頻率聲音。激光唱盤(pán)一分鐘音樂(lè)需要的存儲(chǔ)量為:

(44.1*1000* l6 *2)*60/8=10,584,000(字節(jié))=10.584 M Bytes

這個(gè)數(shù)值就是 PCM 聲音文件在硬盤(pán)中所占磁盤(pán)空間的存儲(chǔ)量。


單雙聲道

?數(shù)據(jù)以二進(jìn)制序列儲(chǔ)存在文件里

?單聲道8bit (1字節(jié)):? ? ? ? 聲音

雙聲道8bit? (2字節(jié)):? ? ? ? 左聲道? 右聲道

單聲道8bit? (2字節(jié)):? ? ? ? 聲音低字節(jié)? 聲音高字節(jié)

單聲道16bit(4字節(jié)):?左音道低字節(jié)?左聲道高字節(jié)?右聲道低字節(jié)?右聲道高字節(jié)?


雙聲道音頻的存儲(chǔ)方式是LRLRLRLR,16bit音頻是每個(gè)聲道都是16bit(2字節(jié))么?PCM是interleaved的方式存儲(chǔ),具體存儲(chǔ)的時(shí)候還有小端(little?endian)和 (big?endian)的問(wèn)題,一般的存儲(chǔ)是小端的,也就是2字節(jié),低位在前,高位在后一個(gè)采樣點(diǎn)16位是0x 1234?存儲(chǔ)的時(shí)候是 0x34 和 0x12 ,?如果是大端就反過(guò)來(lái)。

一個(gè)單聲道的pcm無(wú)頭音頻1M ,轉(zhuǎn)成?雙聲道就變成2M了,就算是有一條聲道沒(méi)信息(或者微弱信號(hào)噪聲),但是?轉(zhuǎn)成雙聲道的時(shí)候就算是靜音,數(shù)據(jù)大小是0x0000他也是要占著位數(shù)的,所以不管怎樣,只要是雙聲道就會(huì)變成2倍大小。



WAV和PCM的關(guān)系

前面也介紹到了,PCM 數(shù)據(jù)本身只是一個(gè)裸碼流,它是由聲道、采樣位數(shù)、采樣頻率、時(shí)長(zhǎng)共同決定的,因此我們至少要知道其中的三個(gè)才能將 PCM 所代表的數(shù)據(jù)提取出來(lái)。

因此,純PCM數(shù)據(jù)是無(wú)法播放的,因此還需要一段描述數(shù)據(jù)。計(jì)算機(jī)系統(tǒng)中的一個(gè)比較常見(jiàn)的做法是將pcm碼流和描述信息封裝在一起,形成一個(gè)音頻文件。這樣就可以直接播放了。

一種常見(jiàn)的方式是使用wav格式定義的規(guī)范將pcm碼流和描述信息封裝起來(lái)。查看 pcm 和對(duì)應(yīng)wav文件的 hex(16進(jìn)制)文件,可以發(fā)現(xiàn),wav文件只是在pcm文件的開(kāi)頭多了44字節(jié) ,來(lái)表征其聲道數(shù)、采樣頻率和采樣位數(shù)等信息。這個(gè)其實(shí)和bmp非常類(lèi)似。


多種音頻格式

WAV、G729、G723 、MP3 等音頻格式都是8k 16bit?wav音頻經(jīng)過(guò)壓縮的格式。

由于廠商眾多、?很多音頻格式?應(yīng)運(yùn)而生,比如nice公司出品的 nmf 其實(shí)音頻,其實(shí)就是一個(gè)經(jīng)過(guò)多層再包裝的g729;vox 格式是華為公司出品的音頻。

VOX格式

vox 格式是華為的格式、他的后綴一種是 V3 的,直接把后綴改成vox就可以聽(tīng);還有一種后綴就是vox。

vox格式因?yàn)楸旧硎菦](méi)有頭信息的看不到,所以不知道采樣率不能轉(zhuǎn)碼、這時(shí)候用 cooledit 打開(kāi)聽(tīng)一下,選擇8k的采樣率打開(kāi)如果語(yǔ)速很快音頻實(shí)際是6k;如果選擇6k的采樣率打開(kāi)如果語(yǔ)速很快音頻實(shí)際是8k。現(xiàn)在?得知采樣率之后就可以用工具轉(zhuǎn)碼,下面會(huì)說(shuō)到工具ffmpeg以及他的輕量版sox。

G729

G729以10字節(jié)作為一個(gè)解碼單元,G729轉(zhuǎn)碼時(shí)先把頭去掉再轉(zhuǎn)。

G729是十六倍壓縮。8k 16bit 8kb/s (正常是128kb/s?壓縮16倍)

MP3

和g729一樣是16倍壓縮,但是由于壓縮算法不一樣,G729的頻譜是光滑的、而MP3音頻的損失很多。是最差的一種音頻格式。

Alaw

8k 8bit?stereo 128kb/s音頻格式,應(yīng)該是非壓縮的格式


音頻轉(zhuǎn)碼

首先音頻格式之間轉(zhuǎn)碼,比如g729?轉(zhuǎn)?mp3 流程是g729->8k、16bit wav -> mp3,都是要先經(jīng)過(guò)wav的。


抓碼工具

<1> 8k8bit nist --> 8k16bit pcm

sox -r 8000 -b 8 -c 1 -t nist 1.nist -s -r 8000 -b 16 1.wav dither

<2> wav->amr->wav

ffmpeg -i inFile1.wav -ab 12.2k outFile.amr

ffmpeg -i outFile.amr outFile.wav

or

ffmpeg -acodec libopencore_amrnb -i outFile.amr outFile.wav

<3> wav-alaw->wav

ffmpeg -i inFile1.wav -acodec pcm_alaw -ar 8000 outFile1.wav

ffmpeg -i outFile1.wav outFile.wav

<4> mulaw->wav

ffmpeg -i inFile.wav outFile.wav

<5> mp3->wav

ffmpeg -i inFile.mp3 outFile.wav

<6> alaw->wav

sox -e a-law alaw.wav -r 8000 -b 16 out.wav

<7> music.mp3 -> wav

ffmpeg -i music.mp3 -ar 8000 -ac 1 outFile.wav

<8> pcm add header -> wav

sox -s -t raw -r 8000 -c 1 -2 in.pcm out.wav

ffmpeg -acodec pcm_s16le -f s16le -ar 8000 -i in.pcm -ar 8000 -ac 1 -ab 128k out.wav

<9> sphere-->wav (wsj data)

sph2pipe 1.WV1 -f wav 1.wav

<10> vox-->wav

./ffmpeg -acodec adpcm_ima_oki -f s16le -ar 6000 -i 1211452.V3 12.wav

<11> two path->mono注:mono.wav -> 單聲道 stereo.wav -> 雙聲道(立體聲)

ffmpeg -i left.wav -i right.wav -filter_complex amix=inputs=2 mono.wav

ffmpeg -i left.wav -i right.wav -filter_complex "amovie=left.wav [l];amovie=right.wav [r]; [l] [r] amerge" stereo.wav

<12> stereo filter

ffmpeg -i fa.mp3 -map_channel 0.0.0 -ar 8000 -ab 128k left.wav -map_channel 0.0.1 -ar 8000 -ab 128k right.wav

<13> wav speed up #聲音加速

ffmpeg -i 16k.wav -filter:a "atempo=1.75" 16k_fast.wav

<14>g729 tranfer

removeHead xx.V3 58 xx.g729

ffmpeg -acodec g729 -f g729 -i xx.g729 xx.wav

<15> nmf->g729->wav

./nmf2g729 1.nmf 1.nmf.g729ffmpeg -acodec g729 -f g729 -i xx.g729 xx.wav


sox

一般會(huì)內(nèi)置的輕量級(jí)ffmpeg工具。

合并多個(gè)音頻

sox 1.wav 2.wav 3.wav 1_2_3.wav

hexdump查看音頻文件頭信息

hexdump -Cv?in.wav | less


音頻頭字節(jié)信息

標(biāo)準(zhǔn)音頻的頭字節(jié)是44位?

查看音頻字節(jié)信息是:hexdump -C in.wav

看紅色部分

其中音頻大小可以在第40-43位(從0位開(kāi)始)倒著看是音頻大小:0x 00 02 53 a0?

轉(zhuǎn)換成十進(jìn)制是152480 加上標(biāo)準(zhǔn)頭字節(jié)?44 是152524字節(jié)

查看音頻的文件大小152524字節(jié)?與計(jì)算結(jié)果吻合

其實(shí)看4-7位也行,4-7位查看下來(lái)是152516字節(jié)

152516+8=152524字節(jié)其實(shí)這個(gè)152516就是除了頭字節(jié)的八個(gè)字節(jié)后面的字節(jié)數(shù)

看藍(lán)色部分

24-25位是0x 40 1f? = 8k 這個(gè)位置標(biāo)記的是音頻的采樣率大小標(biāo)準(zhǔn)音頻的頭字節(jié)是44位?


PCM頭信息

一個(gè)裸的PCM格式音頻數(shù)據(jù),如果不帶頭信息,不知道其采樣率等相關(guān)信息,就無(wú)法用播放器播放出來(lái)。下面是默認(rèn)的頭信息格式:

//音頻頭部格式

struct wave_pcm_hdr

{

? ? char? ? ? ? ? ? ? ? ? ? ? riff[4];? ? ? ? ? ? ? ? ? ? ? ? ? ?// = "RIFF"

? ? SR_DWORD? ? ? ? size_8;? ? ? ? ? ? ? ? ? ? ? ? // = FileSize - 8

? ? char? ? ? ? ? ? ? ? ? ? ? wave[4];? ? ? ? ? ? ? ? ? ? ? // = "WAVE"

? ? char? ? ? ? ? ? ? ? ? ? ? ?fmt[4];? ? ? ? ? ? ? ? ? ? ? ? // = "fmt "

? ? SR_DWORD? ? ? ? dwFmtSize;? ? ? ? ? ? ? ? // = 下一個(gè)結(jié)構(gòu)體的大小 : 16

? ? SR_WORD? ? ? ? ? format_tag;? ? ? ? ? ? ? ? ? // = PCM : 1

? ? SR_WORD? ? ? ? ? channels;? ? ? ? ? ? ? ? ? ? // = 通道數(shù) : 1

? ? SR_DWORD? ? ? ?samples_per_sec;? ? ? // = 采樣率 : 8000 | 6000 | 11025 | 16000

? ? SR_DWORD? ? ? ?avg_bytes_per_sec;? ? // = 每秒字節(jié)數(shù) : dwSamplesPerSec *wBitsPerSample / 8

? ? SR_WORD? ? ? ? ? block_align;? ? ? ? ? ? ? ? // = 每采樣點(diǎn)字節(jié)數(shù) : wBitsPerSample / 8

? ? SR_WORD? ? ? ? ? bits_per_sample;? ? ? ? // = 量化比特?cái)?shù): 8 | 16

? ? char? ? ? ? ? ? ? ? ? ? ?data[4];? ? ? ? ? ? ? ? ? ? ? ?// = "data";

? ? SR_DWORD? ? ? ?data_size;? ? ? ? ? ? ? ? ?// = 純數(shù)據(jù)長(zhǎng)度 : FileSize - 44

} ;

//默認(rèn)音頻頭部數(shù)據(jù)

struct wave_pcm_hdr default_pcmwavhdr =

{

? ? { 'R', 'I', 'F', 'F' },

? ? 0,

? ? {'W', 'A', 'V', 'E'},

? ? {'f', 'm', 't', ' '},

? ? 16,

? ? 1,

? ? 1,

? ? 16000,

? ? 32000,

? ? 2,

? ? 16,

? ? {'d', 'a', 't', 'a'},

? ? 0?

};


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言: 記載資料多為網(wǎng)絡(luò)搜集,侵刪。 根據(jù)最近接觸的整機(jī)項(xiàng)目做了一些整機(jī)音頻相關(guān)基礎(chǔ)知識(shí)的總結(jié),如有不足或表述問(wèn)題...
    Gawain_Knowknow閱讀 8,667評(píng)論 0 4
  • 前言 本篇開(kāi)始講解在Android平臺(tái)上進(jìn)行的音頻編輯開(kāi)發(fā),首先需要對(duì)音頻相關(guān)概念有基礎(chǔ)的認(rèn)識(shí)。所以本篇要講解以下...
    Ihesong閱讀 8,042評(píng)論 2 18
  • 什么是 PCM 格式 聲音從模擬信號(hào)轉(zhuǎn)化為數(shù)字信號(hào)的技術(shù),經(jīng)過(guò)采樣、量化、編碼三個(gè)過(guò)程將模擬信號(hào)數(shù)字化。 采樣顧名...
    揚(yáng)州慢_閱讀 12,776評(píng)論 1 19
  • 接下來(lái)會(huì)分為一下幾點(diǎn)來(lái)介紹: 基礎(chǔ)知識(shí)準(zhǔn)備 音頻開(kāi)發(fā)經(jīng)常遇到的專(zhuān)業(yè)性詞語(yǔ) (1) 采樣率 “音頻采樣率” 是指錄音...
    張俊峰0613閱讀 3,300評(píng)論 2 2
  • #時(shí)光手帳# 我很喜歡記錄各種各樣的大事小事,我覺(jué)得手賬很滿(mǎn)足我的小興趣,學(xué)了一堆的排版啊、膠帶搭配啊等等,準(zhǔn)備大...
    小蜜轟的小姨姨閱讀 257評(píng)論 0 0

友情鏈接更多精彩內(nèi)容