AAC介紹
AAC(Advanced Audio Coding)是一種現(xiàn)代的音頻編碼技術(shù),用于數(shù)字音頻的傳輸和存儲領(lǐng)域。AAC是MPEG-2和MPEG-4標(biāo)準(zhǔn)中的一部分,可提供更高質(zhì)量的音頻數(shù)據(jù),并且相比于MP3等舊有音頻格式,AAC需要更少的比特率。
AAC通過使用一些高級的音頻編碼算法來實現(xiàn)更好的聲音質(zhì)量和更低的壓縮比。其中最重要的算法是信號掩蔽技術(shù)、短時頻譜分析和Psychoacoustic模型。這些算法使得AAC能夠在較低的比特率下保持更好的音質(zhì),并且減少了由于壓縮而引入的失真和噪音。
AAC支持多種采樣率、聲道數(shù)和比特率,以滿足不同應(yīng)用場景的需求。它可以實現(xiàn)從8 kbps到320 kbps的不同比特率的音頻壓縮,同時實現(xiàn)CD音質(zhì)甚至更高的音樂體驗。
AAC還具有很好的靈活性和可擴(kuò)展性,包括高級音頻編碼(High Efficiency AAC,HE-AAC)、帶有SBR的HE-AAC v2和LC-AAC(Low Complexity AAC)等變體。此外,AAC還支持與其他多媒體技術(shù)(如H.264或MPEG-4)集成使用,并且支持多種容器格式(如MP4、3GP、M4A和ADTS等)。
總之,AAC是一種現(xiàn)代的音頻編碼技術(shù),具有高質(zhì)量的音頻數(shù)據(jù)、較低的比特率、靈活性和可擴(kuò)展性等優(yōu)點。由于其廣泛應(yīng)用于數(shù)字音頻傳輸和存儲領(lǐng)域,它已經(jīng)成為音頻壓縮領(lǐng)域的標(biāo)準(zhǔn)之一。
AAC ADTS介紹
AAC(Advanced Audio Coding)是一種現(xiàn)代的音頻編碼技術(shù),被廣泛應(yīng)用于數(shù)字音頻傳輸和存儲領(lǐng)域。AAC可以提供更高質(zhì)量的音頻數(shù)據(jù),同時相比MP3等舊有音頻格式,AAC需要更少的比特率。
ADTS(Audio Data Transport Stream)是AAC音頻流的容器格式,它是一種通過網(wǎng)絡(luò)傳輸音頻流的標(biāo)準(zhǔn)格式之一。ADTS文件包含了AAC音頻流中的各個元素,并且在音頻數(shù)據(jù)中添加了額外的信息,如同步標(biāo)記、采樣率、通道數(shù)等。
ADTS文件由多個部分組成,其中最重要的是頭部信息。頭部信息通常占據(jù)了整個文件中的前7到9個字節(jié),其中包括了一個固定的同步標(biāo)記(syncword),該標(biāo)記用于確定音頻幀的邊界位置。進(jìn)一步的,頭部還包含了一些AAC音頻流的基礎(chǔ)信息,如聲道數(shù)、采樣率、比特率和編碼配置等。
在ADTS文件中,每個AAC音頻幀都以一個長度為7或9個字節(jié)的ADTS幀頭開始,其中包含了同步標(biāo)記、幀大小、采樣率、聲道數(shù)和其他元數(shù)據(jù)。接下來是AAC編碼的原始音頻數(shù)據(jù),這些數(shù)據(jù)會被添加到ADTS幀中,以形成完整的音頻幀。
總之,ADTS是AAC音頻流的容器格式,提供了一種便捷的方式來傳輸和存儲AAC音頻流。通過ADTS,可以輕松地對AAC音頻進(jìn)行封裝和解封,以滿足各種應(yīng)用場景的需求。
AAC ADTS Header介紹
AAC ADTS(Audio Data Transport Stream)文件是AAC音頻流的一種容器格式,其中最重要的部分之一就是ADTS頭部信息。ADTS頭部信息占據(jù)了整個文件中的前7或9個字節(jié),其中包括了一個固定的同步標(biāo)記(syncword),該標(biāo)記用于確定音頻幀的邊界位置。以下是對ADTS頭部信息中各個字段的詳細(xì)介紹:
-
同步字(syncword):2個字節(jié)(16位)
同步字是ADTS文件的標(biāo)志符,它用于確定音頻幀的開始位置和結(jié)束位置,通常為0xFFF。 -
ID (MPEG Version):1個字節(jié)(8位)
ID指示使用的MPEG版本。值為0表示MPEG-4,值為1表示MPEG-2。 -
Layer:2個比特
Layer定義了音頻流所屬的層級,對于AAC來說,其值為0。 -
Protection Absent:1個比特
Protection Absent指示是否啟用CRC錯誤校驗。當(dāng)該比特為0時,表明音頻數(shù)據(jù)經(jīng)過CRC校驗,否則未經(jīng)過CRC校驗。 -
Profile:2個比特
Profile指示編碼所使用的AAC規(guī)范類型,如AAC LC、AAC HE-AAC等。 -
Sampling Frequency Index (Sampling Rate):4個比特
Sampling Frequency Index表示采樣率的索引,它告訴解碼器當(dāng)前音頻數(shù)據(jù)的采樣率。這個值的范圍是0到15,每個值表示一個特定的采樣率。 -
Private Bit:1個比特
Private Bit為私有比特,通常被設(shè)置為0,沒有實際作用。 -
Channel Configuration:3個比特
Channel Configuration指示音頻的通道數(shù),如單聲道、立體聲或多聲道等。 -
Originality:1個比特
Originality指示編碼數(shù)據(jù)是否被原始產(chǎn)生,通常為0。 -
Home:1個比特
Home bit通常被設(shè)置為0,沒有實際作用。 -
Emphasis:2個比特
Emphasis指示對信號進(jìn)行強(qiáng)調(diào)處理的類型,一般不使用。
除了上述字段之外,ADTS頭部還包括文件長度和幀長度等信息。其中,文件長度指整個AAC ADTS文件的長度,而幀長度則指當(dāng)前ADTS幀所占的字節(jié)數(shù)。這些信息可以通過解析ADTS頭部來確定音頻幀的邊界,從而提取出原始的AAC音頻數(shù)據(jù)。
總之,AAC ADTS頭部信息包括同步字、ID、Layer、Protection Absent、Profile、Sampling Frequency Index、Private Bit、Channel Configuration、Originality、Home、Emphasis等各個字段,通過這些字段可以讀取AAC音頻流中的基礎(chǔ)信息,并確定音頻幀的邊界位置。
AAC ES介紹
AAC ES(AAC Elementary Stream)是AAC音頻編碼的一種基本數(shù)據(jù)格式,也是AAC音頻數(shù)據(jù)在流式傳輸和文件存儲中的常見格式之一。
AAC ES不同于其他容器格式(如MP4、M4A等),它不包含額外的元數(shù)據(jù)或結(jié)構(gòu)信息,僅包含未經(jīng)任何封裝或壓縮處理的原始音頻數(shù)據(jù)。這些原始數(shù)據(jù)可以作為音頻文件或流傳輸?shù)幕A(chǔ),同時也可以用于對AAC音頻進(jìn)行轉(zhuǎn)碼、編輯或重組。
AAC ES 通常由一系列連續(xù)的AAC音頻幀組成,每個幀以一個特定的標(biāo)志符開始,該標(biāo)志符表示這是一個AAC音頻幀。在AAC ES中,每個音頻幀擁有相同的長度,但是并不一定包含相同數(shù)量的采樣點,因為采樣率和聲道數(shù)量可能會發(fā)生變化。
AAC ES 的另一個關(guān)鍵特征是其比特流順序,即數(shù)字音頻數(shù)據(jù)的組織方式。AAC ES 采用大端字節(jié)順序,其中高位字節(jié)排在前面,低位字節(jié)排在后面。此外,在AAC ES中,音頻數(shù)據(jù)按照從左到右、自上而下的順序排列,與典型的文本文件不同。
總之,AAC ES 是AAC音頻編碼的一種基本數(shù)據(jù)格式,它通常由一系列AAC音頻幀組成,并且不包含任何附加的元數(shù)據(jù)或結(jié)構(gòu)信息。AAC ES 可以作為音頻文件或流傳輸?shù)幕A(chǔ),同時也可以用于對AAC音頻進(jìn)行轉(zhuǎn)碼、編輯或重組。由于其簡單性和靈活性,AAC ES 受到了廣泛的應(yīng)用,并且成為了數(shù)字音頻編碼領(lǐng)域的標(biāo)準(zhǔn)之一。
AAC ADTS格式分析
AAC?頻格式:Advanced Audio Coding(?級?頻解碼),是?種由MPEG-4標(biāo)準(zhǔn)定義的有損?頻壓縮格式,由Fraunhofer發(fā)展,Dolby, Sony和AT&T是主要的貢獻(xiàn)者。
ADIF:Audio Data Interchange Format ?頻數(shù)據(jù)交換格式。這種格式的特征是可以確定的找到這個?頻數(shù)據(jù)的開始,不需進(jìn)?在?頻數(shù)據(jù)流中間開始的解碼,即它的解碼必須在明確定義的開始處進(jìn)?。故這種格式常?在磁盤?件中。
ADTS的全稱是Audio Data Transport Stream。是AAC?頻的傳輸流格式。AAC?頻格式在MPEG-2(ISO-13318-7 2003)中有定義。AAC后來?被采?到MPEG-4標(biāo)準(zhǔn)中。這種格式的特征是它是?個有同步字的?特流,解碼可以在這個流中任何位置開始。它的特征類似于mp3數(shù)據(jù)流格式。
簡單說,ADTS可以在任意幀解碼,也就是說它每?幀都有頭信息。ADIF只有?個統(tǒng)?的頭,所以必須得到所有的數(shù)據(jù)后解碼。
且這兩種的header的格式也是不同的,?前?般編碼后的和抽取出的都是ADTS格式的?頻流。兩者具體的組織結(jié)構(gòu)如下所示:
AAC的ADIF格式?下圖:
AAC的ADTS的?般格式?下圖:
空?處表示前后幀
有的時候當(dāng)你編碼AAC裸流的時候,會遇到寫出來的AAC?件并不能在PC和?機(jī)上播放,很?的可能就是AAC?件的每?幀?缺少了ADTS頭信息?件的包裝拼接。
只需要加?頭?件ADTS即可。?個AAC原始數(shù)據(jù)塊?度是可變的,對原始幀加上ADTS頭進(jìn)?ADTS的封裝,就形成了ADTS幀。
AAC?頻?件的每?幀由ADTS Header和AAC Audio Data組成。結(jié)構(gòu)體如下:
每?幀的ADTS的頭?件都包含了?頻的采樣率,聲道,幀?度等信息,這樣解碼器才能解析讀取。
?般情況下ADTS的頭信息都是7個字節(jié),分為2部分:
adts_fixed_header();
adts_variable_header();
其?為固定頭信息,緊接著是可變頭信息。固定頭信息中的數(shù)據(jù)每?幀都相同,?可變頭信息則在幀與幀之間可變。
syncword :同步頭 總是0xFFF, all bits must be 1,代表著?個ADTS幀的開始
ID:MPEG標(biāo)識符,0標(biāo)識MPEG-4,1標(biāo)識MPEG-2
Layer:always: ‘00’
protection_absent:表示是否誤碼校驗。Warning, set to 1 if there is no CRC and 0 if there is CRC
profile:表示使?哪個級別的AAC,如01 Low Complexity(LC)— AAC LC。有些芯?只?持AAC LC 。
在MPEG-2 AAC中定義了3種:
profile的值等于 Audio Object Type的值減1
profile = MPEG-4 Audio Object Type - 1
sampling_frequency_index:表示使?的采樣率下標(biāo),通過這個下標(biāo)在Sampling Frequencies[ ]數(shù)組中查找得知采樣率的值。
channel_configuration: 表示聲道數(shù),?如2表示?體聲雙聲道
0: Defined in AOT Specifc Config
1: 1 channel: front-center
2: 2 channels: front-left, front-right
3: 3 channels: front-center, front-left, front-right
4: 4 channels: front-center, front-left, front-right, back-center
5: 5 channels: front-center, front-left, front-right, back-left, back right
6: 6 channels: front-center, front-left, front-right, back-left, back right, LFE-channel
7: 8 channels: front-center, front-left, front-right, side-left, side-right,back-left, back-right, LFE-channel
8-15: Reserved
接下來看下adts_variable_header();
frame_length : ?個ADTS幀的?度包括ADTS頭和AAC原始流.
frame length, this value must include 7 or 9 bytes of header length:
aac_frame_length = (protection_absent = = 1 ? 7 : 9) + size(AACFrame)
protection_absent=0時, header length=9bytes
protection_absent=1時, header length=7bytes
adts_buffer_fullness:0x7FF 說明是碼率可變的碼流。
number_of_raw_data_blocks_in_frame:表示ADTS幀中有number_of_raw_data_blocks_in_frame + 1個AAC原始幀。
所以說number_of_raw_data_blocks_in_frame == 0 表示說ADTS幀中有?個AAC數(shù)據(jù)塊。
下?是ADTS的AAC?件部分:
?字節(jié)開始
第?幀的幀頭7個字節(jié)為:0xFF 0xF1 0x4C 0x40 0x20 0xFF 0xFC
分析各個關(guān)鍵數(shù)值:
111111111111
0
00
1
01
0011
0
001
0
0
0
0
0000100000111(幀?度)
11111111111
00
計算幀?度:將?進(jìn)制 0000100000111 轉(zhuǎn)換成?進(jìn)制為263。觀察第?幀的?
度確實為263個字節(jié)。
計算?法:(幀?度為13位,使?unsigned int來存儲幀?數(shù)值)
unsigned int getFrameLength(unsigned char* str)
{
if ( !str )
{
return 0;
}
unsigned int len = 0;
int f_bit = str[3];
int m_bit = str[4];
int b_bit = str[5];
len += (b_bit>>5);
len += (m_bit<<3);
len += ((f_bit&3)<<11);
return len;
}
總結(jié):AAC sequence三層
第一層:AAC sequence:多個AAC Frame。
第二層:AAC Frame:AAC header+AAC ES。
第三層:AAC ES。音頻數(shù)據(jù),不包含header;flv,mp4的音頻數(shù)據(jù)來自這一層,也就是說不包含header。文章來源:http://www.zghlxwxcb.cn/news/detail-457972.html
注意:第2層的AAC Frame,一般下只有1個AAC ES,但也有可能有兩個AAC ES。這取決于number_of_raw_data_blocks_in_frame的值,如果是0,代表1個AAC ES;如果死1,代表代表2個AAC ES。文章來源地址http://www.zghlxwxcb.cn/news/detail-457972.html
到了這里,關(guān)于音視頻八股文(7)-- 音頻aac adts三層結(jié)構(gòu)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!