AAC ADTS LATM 格式分析
一、ADTS格式:
ADTS的全稱是Audio Data Transport Stream。是AAC音訊的傳輸流格式。
AAC音訊格式在MPEG-2(ISO-13318-7 2003)中有定義。AAC後來又被採用到MPEG-4標準中。
[@more@]1. adts_sequence()
{
while (nextbits() == syncword) {
adts_frame();
}
}
2. adts_frame()
{
adts_fixed_header();
adts_variable_header();
if (number_of_raw_data_blocks_in_frame == 0) {
adts_error_check();
raw_data_block();
}
else {
adts_header_error_check();
for (i = 0; i <= number_of_raw_data_blocks_in_frame; i++) {
raw_data_block();
adts_raw_data_block_error_check();
}
}
}
3.
adts_fixed_header()
{
syncword; 12 bslbf
ID; 1 bslbf
layer; 2 uimsbf
protection_absent; 1 bslbf
profile; 2 uimsbf
sampling_frequency_index; 4 uimsbf
private_bit; 1 bslbf
channel_configuration; 3 uimsbf
original/copy; 1 bslbf
home; 1 bslbf
}
adts_variable_header()
{
copyright_identification_bit; 1 bslbf
copyright_identification_start; 1 bslbf
frame_length; 13 bslbf
adts_buffer_fullness; 11 bslbf
number_of_raw_data_blocks_in_frame; 2 uimsfb
}
詳細說明下ADTS頭的重要資料部分:
syncword 同步字The bit string ‘1111 1111 1111’,說明一個ADTS幀的開始。
ID MPEG 標示符, 設定為1.
layer Indicates which layer is used. Set to ‘00’
protection_absent 表示是否誤碼校驗
profile 表示使用哪個級別的AAC,如01 Low Complexity(LC)--- AACLC
sampling_frequency_index 表示使用的取樣率下標
sampling_frequency_index sampling frequeny [Hz]
0x0 96000
0x1 88200
0x2 64000
0x3 48000
0x4 44100
0x5 32000
0x6 24000
0x7 22050
0x8 16000
0x9 2000
0xa 11025
0xb 8000
0xc reserved
0xd reserved
0xe reserved
0xf reserved
channel_configuration 表示聲道數
frame_length 一個ADTS幀的長度包括ADTS頭和raw data block.
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資料塊並不是說沒有。
(一個AAC原始幀包含一段時間內1024個取樣及相關資料)
二、封裝AAC為ADTS幀
一個AAC原始資料塊長度是可變的,對原始幀加上ADTS頭進行ADTS 的封裝,就形成了ADTS幀。通常我們將得到的AAC原始幀進行封裝後寫入檔案,用常用的播放器如千千靜聽即可播放,這是個驗證AAC資料是否正確的方法。
進行封裝之前,需要了解相關引數,如取樣率,聲道數,原始資料塊的長度等。
下面是把AAC原始資料幀加工為ADTS幀,根據相關引數填寫組成7個位元組的ADTS頭。
The ADTS header is defined below -
unsigned int obj_type = 0;
unsigned int num_data_block = frame_length / 1024;
// include the header length also
frame_length += 7;
/* We want the same metadata */
/* Generate ADTS header */
if(adts_header == NULL) return;
/* Sync point over a full byte */
adts_header[0] = 0xFF;
/* Sync point continued over first 4 bits + static 4 bits
* (ID, layer, protection)*/
adts_header[1] = 0xF9;
/* Object type over first 2 bits */
adts_header[2] = obj_type << 6;//
/* rate index over next 4 bits */
adts_header[2] |= (rate_idx << 2);
/* channels over last 2 bits */
adts_header[2] |= (channels & 0x4) >> 2;
/* channels continued over next 2 bits + 4 bits at zero */
adts_header[3] = (channels & 0x3) << 6;
/* frame size over last 2 bits */
adts_header[3] |= (frame_length & 0x1800) >> 11;
/* frame size continued over full byte */
adts_header[4] = (frame_length & 0x1FF8) >> 3;
/* frame size continued first 3 bits */
adts_header[5] = (frame_length & 0x7) << 5;
/* buffer fullness (0x7FF for VBR) over 5 last bits*/
adts_header[5] |= 0x1F;
/* buffer fullness (0x7FF for VBR) continued over 6 first bits + 2 zeros
* number of raw data blocks */
adts_header[6] = 0xFC;// one raw data blocks .
adts_header[6] |= num_data_block & 0x03; //Set raw Data blocks.
在CMMB中,採用AAC音訊壓縮標準,預設狀況下,編碼引數如下:雙聲道,取樣率24KHZ,幀長變長,碼流可變位元速率的碼流,一般採用的AAC profile為AAC-LC。將從CMMB複用幀解析的一個AAC原始幀封裝為ADTS幀的方法如下:
uint8 aac_buf[ADTS_FRAME_SIZE]={0x0ff,0x0f9,0x058,0x80,0,0x1f,0xfc};
從上述7個位元組分析音訊引數如下:
synword--0xfff
ID:0x1--- 1--- MPEG2 identifier,
LAYER--00
protection_absent ---01
profile--01 1 Low Complexity profile (LC) AAC-LC
smaping_freuency_index---0110-->0x06--->取樣率24KHZ
channel_configuration --- aac_buf[3] = 0x08---->2---->雙聲道。。
adts_buffer_fullness--->0x7ff 位元速率可變的碼流
現插入長度引數 wDataLen;
void OnAudioAacFrame(byte* data, uint16 wDataLen)
{
unsigned int num_data_block = wDataLen / 1024;
uint16 frame_Length;
frame_Length = wDataLen + 7;
/* frame size over last 2 bits */
aac_buf[3] |= (frame_length & 0x1800) >> 11;// the upper 2 bit
/* frame size continued over full byte */
aac_buf[4] = (frame_length & 0x1FF8) >> 3;// the middle 8 bit
/* frame size continued first 3 bits */
aac_buf[5] |= (frame_length & 0x7) << 5;//the last 3 bit
aac_bug[6] |= num_data_block & 0x03; //Set raw Data blocks.
memcpy(&aac_buf[7],data,wDataLen);
//形成一個ADTS幀寫入檔案。
fwrite(aac_buf,wDataLen+7,sizeof(byte),f_audio);
}
三.LATM格式
LATM 的全稱為“Low-overhead MPEG-4 Audio TransportMultiplex”(低開銷音訊傳輸複用),
是MPEG-4 AAC制定的一種高效率的碼流傳輸方式,MPEG-2 TS 流也採用LATM
作為AAC 音訊碼流的封裝格式之 LATM格式也以幀為單位,主要由AudioSpecificConfig(音訊特定配置單元)與音訊負載組成。
AudioSpecificConfig 描述了一個LATM 幀的資訊,音訊負載主要由PayloadLengthInfo(負載長度資訊)和PayloadMux(負載淨荷)組成。
AudioSpecificConfig 資訊可以是帶內傳,也可以是帶外傳。所謂帶內傳,就是指每一個LATM 幀,都含有一個AudioSpecificConfig 資訊;
而帶外傳,則每一個LATM幀都不含有AudioSpecificConfig 資訊,而透過其他方式把AudioSpecificConfig資訊傳送到解碼端,
由於AudioSpecificConfig 資訊一般是不變的,所以只需傳送一次即可。由此可見,
AudioSpecificConfig 資訊採用帶內傳輸可適應音訊編碼資訊不斷變化的情況,
而採用帶外傳輸,可以節省音訊傳輸位元速率。帶內或帶外傳,由muxconfigPresent 標誌位決定。例如流媒體應用中,
muxconfigPresent 可設定為0,這樣LATM幀中將不含有AudioSpecificConfig 資訊,LATM幀透過RTP包傳送出去,
AudioSpecificConfig 可透過SDP檔案一次性傳送到解碼端。
AudioSpecificConfig 主要引數
numSubFrames 子幀的數目
numProgram 複用的節目數
numLayer 複用的層數
frameLengthType 負載的幀長度型別,包括固定長度與可變長度
audioObjectType 音訊物件型別
samplingFrequency 取樣率
channelConfiguration 聲道配置
音訊負載由若干子幀組成,每個子幀由PayloadLengthInfo和PayloadMux組成,
與ADTS幀淨荷一樣,音訊負載主要包含原始幀資料。
AAC打包成TS流通常有兩種方式,分別是先打包成ADTS或LATM。ADTS的每一幀都有個幀頭,在
每個幀頭資訊都一樣的狀況下,會有很大的冗餘。LATM格式具有很大的靈活性,每幀的音訊配置單元既可以帶內傳輸,
又可以帶外傳輸。正因為如此,LATM不僅適用於流傳輸還可以用於RTP傳輸,
RTP傳輸時,若音訊資料配置資訊是保持不變,可以先透過SDP會話先傳輸StreamMuxConfig(AudioSpecificConfig)資訊,
由於LATM流由一個包含了一個或多個音訊幀的audioMuxElements序列組成。
一個完整或部分完整的audioMuxElement可直接對映到一個RTP負載上。
下面是一個audoMuxEmlemt
AudioMuxElement(muxConfigPresent)
{
if (muxConfigPresent)
{
useSameStreamMux;
if (!useSameStreamMux)
StreamMuxConfig();
}
if (audioMuxVersionA == 0)
{
for (i = 0; i <= numSubFrames; i++)
{
PayloadLengthInfo();
PayloadMux();
}
}
}
可以很簡單的把ADTS幀轉換為LATM幀,根據ADTS頭的資訊,生成StreamMuxConfig,
將ADTS中的原始幀提取出來,前面加上PayloadLengthInfo做為LATM的音訊幀。
按照上述格式打包生成AudioMuxElement,作為RTP的負載傳輸.
四、CMMB中的LATM
當CMMB中音訊壓縮標準為AAC時,預設採用LATM封裝。StreamMuxConfig採用帶外傳輸。
StreamMuxConifg中的若干預設引數如下:audioMuxVersion:0標誌流語法版本號為0,
allStreamsSameTimeFraming標誌複用到PayLoadMux()中的所有負載共享一個共同的時基音訊子幀.
audioObjectType:2 AAC-LC
freameLengthType:0 幀長度是可變的
latmBufferFullness:0xFF 位元速率可變的碼流
參考:
[1]ISO/IEC 13818-7(2003 MPEG-2 AAC, Second Edition)
[2] ISO13818-7(2006 Fourth edition AAC)
[3] RFC 3016 (rfc3016) - RTP Payload Format for MPEG-4 Audio-VisualStreams
[4] AAC音訊壓縮編碼標準的ADTS與LATM格式分析
[5] GYZ 234-2008: CMMB複用實施指南
[6]ISO/IEC 14496-3 2005 (MPEG-4 PART-3)(LATM)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23410886/viewspace-1031637/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- AAC 音訊音訊
- 硬碟格式分析硬碟
- JavaCV FFmpeg AAC編碼Java
- ffmpeg提取aac資料
- 音訊編解碼·實戰篇(1)WAV轉至AAC(AAC編碼)音訊
- 音訊編解碼·實戰篇(1)PCM轉至AAC(AAC編碼)音訊
- android: AAC檔案解析Android
- LDS檔案格式分析
- Android MediaCodec硬解碼AAC音訊檔案(實時AAC音訊幀)並播放Android音訊
- MediaCodec硬編碼pcm2aac
- SARIF:靜態分析結果交換格式
- ffmpeg音訊編碼之pcm轉碼aac音訊
- 【AAC 系列三】深入理解架構元件:LiveData架構元件LiveData
- 【AAC 系列四】深入理解架構元件:ViewModel架構元件View
- 直播中需要了解的AAC基礎知識
- 趣探 Mach-O:檔案格式分析Mac
- Unix/ELF檔案格式及病毒分析(轉)
- Unix/ELF檔案格式及病毒分析 (轉)
- Android音視訊(四)MediaCodec編解碼AACAndroid
- 【秒懂音視訊開發】14_AAC編碼
- AAC 的 Lifecycle 結合 Kotlin Coroutines 進行使用Kotlin
- javascript時間日期格式化程式碼分析JavaScript
- ffmpeg分析系列之三(輸入輸出格式)
- MySQL Binlog三種格式介紹及分析MySql
- 網易雲音樂ncm格式分析以及ncm與mp3格式轉換
- 【AAC 系列二】深入理解架構元件的基石:Lifecycle架構元件
- 【AAC 系列一】Android 應用架構新時代來臨!Android應用架構
- MIDI檔案格式分析(補充和勘誤)
- Python新型字串格式漏洞分析及解決方案Python字串
- ffmpeg分析系列之四(探測輸入的格式)
- ios利用mic採集Pcm轉為AAC,AudioQueue、AudioUnit(流式)iOS
- js對flv提取h264、aac音視訊流JS
- Audio Unit播放aac/m4a/mp3等檔案
- 用《Excel》玩轉格式,輕鬆分析龐大資料!Excel大資料
- 分析及格式化trace檔案 - TKPROF (Transient Kernel Profiler)
- UNIX/LINUX平臺可執行檔案格式分析Linux
- oracle中的數值資料儲存格式分析(ZT)Oracle
- NTFS格式大硬碟資料恢復特殊案例分析(轉)硬碟資料恢復