AAC概述
AAC是高級音頻編碼(Advanced Audio Coding)的縮寫,出現(xiàn)于1997年嫩海,最初是基于MPEG-2的音頻編碼技術(shù)。由Fraunhofer IIS、Dolby Laboratories鲫竞、AT&T、Sony等公司共同開發(fā)逼蒙,目的是取代MP3格式从绘。2000年,MPEG-4標(biāo)準(zhǔn)出臺是牢,AAC重新集成了其它技術(shù)(PS,SBR)僵井,為區(qū)別于傳統(tǒng)的MPEG-2 AAC,故含有SBR或PS特性的AAC又稱為MPEG-4 AAC驳棱。
AAC是新一代的音頻有損壓縮技術(shù)批什,它通過一些附加的編碼技術(shù)(比如PS,SBR等),衍生出了LC-AAC,HE-AAC,HE-AACv2三種主要的編碼社搅,LC-AAC就是比較傳統(tǒng)的AAC驻债,相對而言,主要用于中高碼率(>=80Kbps)形葬,HE-AAC(相當(dāng)于AAC+SBR)主要用于中低碼(<=80Kbps)却汉,而新近推出的HE-AACv2(相當(dāng)于AAC+SBR+PS)主要用于低碼率(<=48Kbps),事實(shí)上大部分編碼器設(shè)成<=48Kbps自動啟用PS技術(shù),而>48Kbps就不加PS,就相當(dāng)于普通的HE-AAC荷并。
AAC特點(diǎn)
- AAC是一種高壓縮比的音頻壓縮算法合砂,但它的壓縮比要遠(yuǎn)超過較老的音頻壓縮算法,如AC-3、MP3等翩伪。并且其質(zhì)量可以同未壓縮的CD音質(zhì)相媲美
- AAC也是采用了變換編碼算法微猖,但AAC使用了分辨率更高的濾波器組,因此它可以達(dá)到更高的壓縮比
- AAC使用了臨時噪聲重整缘屹、后向自適應(yīng)線性預(yù)測凛剥、聯(lián)合立體聲技術(shù)和量化哈夫曼編碼等最新技術(shù),這些新技術(shù)的使用都使壓縮比得到進(jìn)一步的提高
- AAC支持更多種采樣率和比特率轻姿、支持1個到48個音軌犁珠、支持多達(dá)15個低頻音軌、具有多種語言的兼容能力互亮、還有多達(dá)15個內(nèi)嵌數(shù)據(jù)流
- AAC支持更寬的聲音頻率范圍犁享,最高可達(dá)到96kHz,最低可達(dá)8KHz豹休,遠(yuǎn)寬于MP3的16KHz-48kHz的范圍
- 不同于MP3及WMA炊昆,AAC幾乎不損失聲音頻率中的甚高、甚低頻率成分威根,并且比WMA在頻譜結(jié)構(gòu)上更接近于原始音頻凤巨,因而聲音的保真度更好
ACC的規(guī)格
- MPEG-2 AAC LC:低復(fù)雜度規(guī)格(Low Complexity)
- MPEG-2 AAC Main:主規(guī)格
- MPEG-2 AAC SSR:可變采樣率規(guī)格(Scaleable Sample Rate)
- MPEG-4 AAC LC:低復(fù)雜度規(guī)格(Low Complexity)
- MPEG-4 AAC Main:主規(guī)格
- MPEG-4 AAC SSR:可變采樣率規(guī)格(Scaleable Sample Rate)
- MPEG-4 AAC LTP:長時期預(yù)測規(guī)格(Long Term Predicition)
- MPEG-4 AAC LD:低延遲規(guī)格(Low Delay)
- MPEG-4 AAC HE:高效率規(guī)格(High Efficiency)
LC到HE發(fā)展歷程圖
LC 適合中等比特率,比如96kbps ~ 192kbps之間
從圖中可以了解到MPEG-4 AAC LC 相當(dāng)于MPEG-2 AAC LC + PNS(PNS 可以提高AAC的編碼效率)
PNS(Perceptual Noise Substitution)
HE 存在v1和v2 兩個版本洛搀,適合低比特率
v1:適合48kbps ~ 64kbps
v2:適合低于32kbps敢茁,可在低至32kbps的比特率下提供接近CD品質(zhì)的聲音
MPEG-4 AAC HE v1 相當(dāng)于MPEG-4 AAC LC + SBR(是一種增強(qiáng)的壓縮技術(shù)、可以將高頻信號存儲在少量的SBR data中留美、解碼器可以根據(jù)SBR data恢復(fù)出高頻信號)
MPEG-4 AAC HE v2 相當(dāng)于MPEG-4 AAC HE v1 + PS(是一種有損的音頻壓縮算法卷要,可以進(jìn)一步提高壓縮率、以將左右聲道信號組合成單聲道信號独榴,聲道之間的差異信息存儲到少量的PS data中(大概占2 ~ 3kbps)、解碼器可以根據(jù)PS data中恢復(fù)出立體聲信號)
SBR Spectral Band Replication
PS(Parametric Stereo)
AAC音頻文件格式
首先需要了解的是AAC文件格式有ADIF和ADTS兩種
- ADIF:Audio Data Interchange Format 音頻數(shù)據(jù)交換格式奕枝。這種格式的特征是可以確定的找到這個音頻數(shù)據(jù)的開始棺榔,不需進(jìn)行在音頻數(shù)據(jù)流中間開始的解碼,即它的解碼必須在明確定義的開始處進(jìn)行隘道。故這種格式常用在磁盤文件中症歇。
- ADTS:Audio Data Transport Stream 音頻數(shù)據(jù)傳輸流。這種格式的特征是它是一個有同步字的比特流谭梗,解碼可以在這個流中任何位置開始忘晤。它的特征類似于mp3數(shù)據(jù)流格式。
簡單說激捏,ADTS可以在任意幀解碼设塔,也就是說它每一幀都有頭信息。ADIF只有一個統(tǒng)一的頭远舅,所以必須得到所有的數(shù)據(jù)后解碼闰蛔。且這兩種的header的格式也是不同的痕钢,目前一般編碼后的和抽取出的都是ADTS格式的音頻,。
目前主流使用的都是ADTS格式,所以這里只介紹ADTS ACC文件格式
AAC音頻文件的每一幀都由一個ADTS頭和AAC ES(AAC音頻數(shù)據(jù))組成序六。
AAC ADTS.png
ADTS頭包含了AAC文件的采樣率任连、通道數(shù)、幀數(shù)據(jù)長度等信息例诀。ADTS頭分為固定頭信息和可變頭信息兩個部分随抠,固定頭信息在每個幀中的是一樣的,可變頭信息在各個幀中并不是固定值繁涂。ADTS頭一般是7個字節(jié)((28+28)/ 8)長度拱她,如果需要對數(shù)據(jù)進(jìn)行CRC校驗(yàn),則會有2個Byte的校驗(yàn)碼爆土,所以ADTS頭的實(shí)際長度是7個字節(jié)或9個字節(jié)
固定頭部信息:adts_fixed_header
/* adts_fixed_header */
put_bits(&pb, 12, 0xfff); /* syncword */
put_bits(&pb, 1, 0); /* ID */
put_bits(&pb, 2, 0); /* layer */
put_bits(&pb, 1, 1); /* protection_absent */
put_bits(&pb, 2, ctx->objecttype); /* profile_objecttype */
put_bits(&pb, 4, ctx->sample_rate_index);
put_bits(&pb, 1, 0); /* private_bit */
put_bits(&pb, 3, ctx->channel_conf); /* channel_configuration */
put_bits(&pb, 1, 0); /* original_copy */
put_bits(&pb, 1, 0); /* home */
- syncword:幀同步標(biāo)識一個幀的開始椭懊,固定為0xFFF
- ID:MPEG 標(biāo)示符。0表示MPEG-4步势,1表示MPEG-2
- layer:固定為’00’
- protection_absent:標(biāo)識是否進(jìn)行誤碼校驗(yàn)氧猬。0表示有CRC校驗(yàn),1表示沒有CRC校驗(yàn)
- profile:標(biāo)識使用哪個級別的AAC坏瘩。1: AAC Main 2:AAC LC (Low Complexity) 3:AAC SSR (Scalable Sample Rate) 4:AAC LTP (Long Term Prediction)
- sampling_frequency_index:標(biāo)識使用的采樣率的下標(biāo)
- private_bit:私有位盅抚,編碼時設(shè)置為0,解碼時忽略
- channel_configuration:標(biāo)識聲道數(shù)
- original_copy:編碼時設(shè)置為0倔矾,解碼時忽略
- home:編碼時設(shè)置為0妄均,解碼時忽略
sampling_frequency_index
index | Hz |
---|---|
0 | 96000 Hz |
1 | 88200 Hz |
2 | 64000 Hz |
3 | 48000 Hz |
4 | 44100 Hz |
5 | 32000 Hz |
6 | 24000 Hz |
7 | 22050 Hz |
8 | 16000 Hz |
9 | 12000 Hz |
10 | 11025 Hz |
11 | 8000 Hz |
12 | 7350 Hz |
13 | Reserved |
14 | Reserved |
15 | frequency is written explictly |
profile
PROFILE | SAMPLES |
---|---|
HE-AAC v1/v2 | 2048 |
AAC-LC | 1024 |
AAC-LD/AAC-ELD | 480/512 |
Channel Configuration
- 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()
/* adts_variable_header */
put_bits(&pb, 1, 0); /* copyright_identification_bit */
put_bits(&pb, 1, 0); /* copyright_identification_start */
put_bits(&pb, 13, full_frame_size); /* aac_frame_length */
put_bits(&pb, 11, 0x7ff); /* adts_buffer_fullness */
put_bits(&pb, 2, 0); /* number_of_raw_data_blocks_in_frame */
- copyrighted_id_bit:編碼時設(shè)置為0,解碼時忽略
- copyrighted_id_start:編碼時設(shè)置為0哪自,解碼時忽略
- aac_frame_length:ADTS幀長度包括ADTS長度和AAC聲音數(shù)據(jù)長度的和。即 aac_frame_length = (protection_absent == 0 ? 9 : 7) + audio_data_length
- adts_buffer_fullness:固定為0x7FF壤巷。表示是碼率可變的碼流
- number_of_raw_data_blocks_in_frame:表示當(dāng)前幀有- number_of_raw_data_blocks_in_frame + 1 個原始幀(一個AAC原始幀包含一段時間內(nèi)1024個采樣及相關(guān)數(shù)據(jù))邑彪。
AAC編解碼器
之前說到個音頻的一些文件格式胧华,包括WAV寄症,AAC等,如果現(xiàn)在想對PCM數(shù)據(jù)進(jìn)行ACC編碼壓縮的話矩动,我們需要用到ACC編碼器有巧,相反如果想對ACC編碼后的數(shù)據(jù)解壓出PCM數(shù)據(jù),那么久需要用到ACC解碼器悲没;
集中常用的ACC編解碼器
支持LC/HE 規(guī)格篮迎,目前已經(jīng)停止維護(hù)
- FFmpeg AAC
FFmpeg 官方內(nèi)置的AAC編解碼器,在libavcodec
庫中,編解碼器名字叫做aac
- 支持LC規(guī)格
- 可以集成到FFmpeg的libavcodec 中柑潦,編解碼器名字叫做libfaac享言,2016年后ffmpeg已經(jīng)移除了對FAAC的支持
- 支持LC/HE規(guī)格
- 目前質(zhì)量最高AAC編解碼器https://trac.ffmpeg.org/wiki/Encode/AAC
FDK AAC的學(xué)習(xí)
mac下通過brew 安裝的FFmpeg通常是沒有集成libfdk_aac的,這個可以在終端通過命令行下檢查
songlin@feng-sl /usr/local/Cellar/ffmpeg/4.3.2_4/bin master ± ./ffmpeg -codecs | grep aac
ffmpeg version 4.3.2 Copyright (c) 2000-2021 the FFmpeg developers
built with Apple clang version 12.0.0 (clang-1200.0.32.29)
configuration: --prefix=/usr/local/Cellar/ffmpeg/4.3.2_4 --enable-shared --enable-pthreads --enable-version3 --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-videotoolbox
libavutil 56. 51.100 / 56. 51.100
libavcodec 58. 91.100 / 58. 91.100
libavformat 58. 45.100 / 58. 45.100
libavdevice 58. 10.100 / 58. 10.100
libavfilter 7. 85.100 / 7. 85.100
libavresample 4. 0. 0 / 4. 0. 0
libswscale 5. 7.100 / 5. 7.100
libswresample 3. 7.100 / 3. 7.100
libpostproc 55. 7.100 / 55. 7.100
DEAIL. aac AAC (Advanced Audio Coding) (decoders: aac aac_fixed aac_at ) (encoders: aac aac_at )
D.AIL. aac_latm AAC LATM (Advanced Audio Coding LATM syntax)
從終端的輸出結(jié)果中渗鬼,可以發(fā)現(xiàn)是沒有l(wèi)ibfdk_aac的览露,所以我們需要手動編譯FFmpeg源碼,讓編譯后的ffmpeg集成我們需要的功能譬胎,至于如何手動編譯FFmpeg差牛,可以參考這篇文章