AAC格式ADTS+實例剖析

介紹

在前面flv格式詳解+實例剖析的文章中介紹了flv的格式寥袭,今天這章主要介紹ADTS格式

AAC的音頻文件格式有ADIF & ADTS:

  • ADIF:Audio Data Interchange Format 音頻數(shù)據(jù)交換格式。這種格式的特征是可以確定的找到這個音頻數(shù)據(jù)的開始,不需進(jìn)行在音頻數(shù)據(jù)流中間開始的解碼杯活,即它的解碼必須在明確定義的開始處進(jìn)行狰腌。故這種格式常用在磁盤文件中柳畔。

  • ADTS:Audio Data Transport Stream鼎姐。是AAC音頻的傳輸流格式哪雕。這種格式的特征是它是一個有同步字的比特流船殉,解碼可以在這個流中任何位置開始。

總結(jié):ADTS可以在任意幀解碼斯嚎,也就是說它每一幀都有頭信息利虫。ADIF只有一個統(tǒng)一的頭,所以必須得到所有的數(shù)據(jù)后解碼堡僻。且這兩種的header的格式也是不同的糠惫,目前一般編碼后的和抽取出的都是ADTS格式的音頻流。

ADTS 格式

adts.png

從圖上可以總結(jié)出兩點(diǎn):

  • ADTS Frame = ADTS頭+AAC ES(AAC音頻數(shù)據(jù))
  • ADTS頭包含了AAC文件的采樣率钉疫、通道數(shù)硼讽、幀數(shù)據(jù)長度等信息。ADTS頭分為固定頭信息和可變頭信息兩個部分陌选,固定頭信息在每個幀中的是一樣的理郑,可變頭信息在各個幀中并不是固定值蹄溉。ADTS頭一般是7個字節(jié)((28+28)/ 8)長度咨油,如果需要對數(shù)據(jù)進(jìn)行CRC校驗,則會有2個Byte的校驗碼柒爵,所以ADTS頭的實際長度
    是7個字節(jié)或9個字節(jié)役电。

固定頭信息:adts_fixed_header()

1.jpg

syncword :同步頭 總是0xFFF, all bits must be 1,代表著一個ADTS幀的開始

  • ID:MPEG Version: 0 for MPEG-4, 1 for MPEG-2
  • Layer:always: '00'
  • profile:表示使用哪個級別的AAC棉胀,有些芯片只支持AAC LC 法瑟。在MPEG-2 AAC中定義了3種:
    • 0: AAC Main
    • 1:AAC LC (Low Complexity)
    • 2:AAC SSR (Scalable Sample Rate)
    • 3:AAC LTP (Long Term Prediction)
  • sampling_frequency_index:表示使用的采樣率下標(biāo)
    • 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
  • channel_configuration: 表示聲道數(shù)
    • 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,

可變頭信息:adts_variable_header()

2.jpg
  • 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ù))麻掸。

實例分析

前面文章介紹了flv格式詳解+實例剖析酥夭,這里我們還是使用里面的資源《東風(fēng)破》——周杰倫(下載

D:\jianshu>ffprobe -show_format dongfengpo.flv
ffprobe version 4.4-full_build-www.gyan.dev Copyright (c) 2007-2021 the FFmpeg developers
  built with gcc 10.2.0 (Rev6, Built by MSYS2 project)
  configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-lzma --enable-libsnappy --enable-zlib --enable-librist --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --enable-libcaca --enable-sdl2 --enable-libdav1d --enable-libzvbi --enable-librav1e --enable-libsvtav1 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libaom --enable-libopenjpeg --enable-libvpx --enable-libass --enable-frei0r --enable-libfreetype --enable-libfribidi --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-d3d11va --enable-dxva2 --enable-libmfx --enable-libglslang --enable-vulkan --enable-opencl --enable-libcdio --enable-libgme --enable-libmodplug --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libshine --enable-libtheora --enable-libtwolame --enable-libvo-amrwbenc --enable-libilbc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-ladspa --enable-libbs2b --enable-libflite --enable-libmysofa --enable-librubberband --enable-libsoxr --enable-chromaprint
  libavutil      56. 70.100 / 56. 70.100
  libavcodec     58.134.100 / 58.134.100
  libavformat    58. 76.100 / 58. 76.100
  libavdevice    58. 13.100 / 58. 13.100
  libavfilter     7.110.100 /  7.110.100
  libswscale      5.  9.100 /  5.  9.100
  libswresample   3.  9.100 /  3.  9.100
  libpostproc    55.  9.100 / 55.  9.100
Input #0, flv, from 'dongfengpo.flv':
  Metadata:
    encoder         : Lavf57.41.100
  Duration: 00:05:14.47, start: 0.000000, bitrate: 431 kb/s
  Stream #0:0: Video: h264 (High), yuv420p(progressive), 352x240 [SAR 3675:3674 DAR 245:167], 283 kb/s, 29.97 fps, 29.97 tbr, 1k tbn, 59.94 tbc
  Stream #0:1: Audio: aac (LC), 44100 Hz, stereo, fltp, 128 kb/s
[FORMAT]
filename=dongfengpo.flv
nb_streams=2
nb_programs=0
format_name=flv
format_long_name=FLV (Flash Video)
start_time=0.000000
duration=314.470000
size=16954257
bit_rate=431310
probe_score=100
TAG:encoder=Lavf57.41.100
[/FORMAT]

視頻是flv格式的文件,我們先使用ffmpeg把a(bǔ)ac抽取出來文件

ffmpeg -i dongfengpo.flv -acodec copy -vn dongfengpo.aac

查看一下信息

D:\jianshu>ffprobe -show_format dongfengpo.aac
ffprobe version 4.4-full_build-www.gyan.dev Copyright (c) 2007-2021 the FFmpeg developers
  built with gcc 10.2.0 (Rev6, Built by MSYS2 project)
  configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-lzma --enable-libsnappy --enable-zlib --enable-librist --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --enable-libcaca --enable-sdl2 --enable-libdav1d --enable-libzvbi --enable-librav1e --enable-libsvtav1 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libaom --enable-libopenjpeg --enable-libvpx --enable-libass --enable-frei0r --enable-libfreetype --enable-libfribidi --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-d3d11va --enable-dxva2 --enable-libmfx --enable-libglslang --enable-vulkan --enable-opencl --enable-libcdio --enable-libgme --enable-libmodplug --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libshine --enable-libtheora --enable-libtwolame --enable-libvo-amrwbenc --enable-libilbc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-ladspa --enable-libbs2b --enable-libflite --enable-libmysofa --enable-librubberband --enable-libsoxr --enable-chromaprint
  libavutil      56. 70.100 / 56. 70.100
  libavcodec     58.134.100 / 58.134.100
  libavformat    58. 76.100 / 58. 76.100
  libavdevice    58. 13.100 / 58. 13.100
  libavfilter     7.110.100 /  7.110.100
  libswscale      5.  9.100 /  5.  9.100
  libswresample   3.  9.100 /  3.  9.100
  libpostproc    55.  9.100 / 55.  9.100
[aac @ 000001da29bfa980] Estimating duration from bitrate, this may be inaccurate
Input #0, aac, from 'dongfengpo.aac':
  Duration: 00:04:58.38, bitrate: 139 kb/s
  Stream #0:0: Audio: aac (LC), 44100 Hz, stereo, fltp, 139 kb/s
[FORMAT]
filename=dongfengpo.aac
nb_streams=1
nb_programs=0
format_name=aac
format_long_name=raw ADTS AAC (Advanced Audio Coding)
start_time=N/A
duration=298.379710
size=5188301
bit_rate=139106
probe_score=51
[/FORMAT]

使用Binary Viewer打開


3.png

我們看前7個字節(jié)

FFF1508003DFFC

按照前面的格式分析

  • 固定頭部分
    syncword = 0xFFF
    ID = 0
    layer = 00
    protection_absent = 1
    profile = 01 也就是AAC
    sampling_frequency_index = 0100 也就是44100HZ
    channel_configuration = 010
  • 可變頭部分
    aac_frame_length = 0000000011110 = 30
    adts_buffer_fullness = 11111111111 = 0x7FF

我們找到下一個同步字0xFFF的位置正好是在30脊奋。符合aac_frame_length
最后我們用工具Projects (p23.nl)驗證一下

image.png

到這里整個adts格式分析就結(jié)束了熬北,大家可以自己嘗試一下。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末诚隙,一起剝皮案震驚了整個濱河市讶隐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌久又,老刑警劉巖巫延,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件效五,死亡現(xiàn)場離奇詭異,居然都是意外死亡炉峰,警方通過查閱死者的電腦和手機(jī)火俄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來讲冠,“玉大人瓜客,你說我怎么就攤上這事「涂” “怎么了谱仪?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長否彩。 經(jīng)常有香客問我疯攒,道長,這世上最難降的妖魔是什么列荔? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任敬尺,我火速辦了婚禮,結(jié)果婚禮上贴浙,老公的妹妹穿的比我還像新娘砂吞。我一直安慰自己,他們只是感情好崎溃,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布蜻直。 她就那樣靜靜地躺著,像睡著了一般袁串。 火紅的嫁衣襯著肌膚如雪概而。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天囱修,我揣著相機(jī)與錄音赎瑰,去河邊找鬼。 笑死破镰,一個胖子當(dāng)著我的面吹牛餐曼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播啤咽,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼晋辆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了宇整?” 一聲冷哼從身側(cè)響起瓶佳,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鳞青,沒想到半個月后霸饲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體为朋,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年厚脉,在試婚紗的時候發(fā)現(xiàn)自己被綠了习寸。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡傻工,死狀恐怖霞溪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情中捆,我是刑警寧澤鸯匹,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站泄伪,受9級特大地震影響殴蓬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蟋滴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一染厅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧津函,春花似錦肖粮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蕉堰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間悲龟,已是汗流浹背屋讶。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留须教,地道東北人皿渗。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像轻腺,于是被迫代替她去往敵國和親乐疆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345

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

  • AAC概述 AAC是高級音頻編碼(Advanced Audio Coding)的縮寫贬养,出現(xiàn)于1997年挤土,最初是基于...
    coder_feng閱讀 1,552評論 0 2
  • AAC是音頻的一種編碼格式,AAC通常壓縮比為18:1误算,也有資料說為20:1仰美,遠(yuǎn)勝mp3迷殿。 AAC音頻格式有ADI...
    鄭旭澤閱讀 9,131評論 11 20
  • 1.ADTS是個啥ADTS全稱是(Audio Data Transport Stream),是AAC的一種十分常見...
    rogerwu1228閱讀 8,729評論 1 3
  • HLS協(xié)議及TS封裝 一咖杂、HLS協(xié)議 HLS協(xié)議由蘋果公司提出并推廣庆寺,來自維基百科的定義。 HTTP Live S...
    O2Space_Xiu閱讀 14,184評論 2 16
  • 簡介 FLV(Flash Video)是現(xiàn)在非常流行的流媒體格式诉字,由于其視頻文件體積輕巧懦尝、封裝播放簡單等特點(diǎn),使其...
    第八區(qū)閱讀 21,908評論 22 33