AAC編碼

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ā)展歷程圖

AAC發(fā)展歷程圖.png

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

PS.png

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差牛,可以參考這篇文章

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市堰乔,隨后出現(xiàn)的幾起案子偏化,更是在濱河造成了極大的恐慌,老刑警劉巖镐侯,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件侦讨,死亡現(xiàn)場離奇詭異,居然都是意外死亡苟翻,警方通過查閱死者的電腦和手機(jī)韵卤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來崇猫,“玉大人沈条,你說我怎么就攤上這事∽缏” “怎么了蜡歹?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長涕烧。 經(jīng)常有香客問我月而,道長,這世上最難降的妖魔是什么议纯? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任父款,我火速辦了婚禮,結(jié)果婚禮上痹扇,老公的妹妹穿的比我還像新娘。我一直安慰自己溯香,他們只是感情好鲫构,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著玫坛,像睡著了一般结笨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天炕吸,我揣著相機(jī)與錄音伐憾,去河邊找鬼。 笑死赫模,一個胖子當(dāng)著我的面吹牛树肃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播瀑罗,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼胸嘴,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了斩祭?” 一聲冷哼從身側(cè)響起劣像,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎摧玫,沒想到半個月后耳奕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡诬像,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年屋群,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片颅停。...
    茶點(diǎn)故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡谓晌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出癞揉,到底是詐尸還是另有隱情纸肉,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布喊熟,位于F島的核電站柏肪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏芥牌。R本人自食惡果不足惜烦味,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望壁拉。 院中可真熱鬧谬俄,春花似錦、人聲如沸弃理。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽痘昌。三九已至钥勋,卻和暖如春炬转,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背算灸。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工扼劈, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人菲驴。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓荐吵,卻偏偏與公主長得像,于是被迫代替她去往敵國和親谢翎。 傳聞我的和親對象是個殘疾皇子捍靠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容

  • AAC是音頻的一種編碼格式,AAC通常壓縮比為18:1森逮,也有資料說為20:1榨婆,遠(yuǎn)勝mp3。 AAC音頻格式有ADI...
    鄭旭澤閱讀 9,155評論 11 20
  • AAC介紹 介紹AAC褒侧,全稱Advanced Audio Coding良风,是一種專為聲音數(shù)據(jù)設(shè)計(jì)的文件壓縮格式。他的...
    請叫我果爸閱讀 10,451評論 3 9
  • 版本記錄 前言 AAC(Advanced Audio Coding)闷供,中文名:高級音頻編碼烟央,出現(xiàn)于1997年,基于...
    刀客傳奇閱讀 6,838評論 1 7
  • 學(xué)習(xí)整理的相關(guān)章節(jié)鏈接:基礎(chǔ)篇_1.音視頻學(xué)習(xí)框架基礎(chǔ)篇_2. 顏色空間模型 RBG歪脏、YUV疑俭、HSV基礎(chǔ)篇_3.圖...
    Allan_Wang閱讀 2,325評論 0 3
  • 聲音 如何將現(xiàn)實(shí)生活中的聲音轉(zhuǎn)換成數(shù)字信號? 脈沖編碼調(diào)制(PCM) 脈沖編碼調(diào)制示意圖 圖3-2(a)婿失,是一個以...
    LvyCode閱讀 861評論 0 1