1. What is ADTs?
The full name of ADTs is (Audio Data Transport Stream), which is a very common transmission format of AAC.
Remember that when Demux is the first step, when the es stream of AAC audio is extracted from the FLV Encapsulation Format and sent to the hardware decoder, it cannot be played. When it is saved to a local PC player, I cannot play it either. However, it crashed and was later known by searching for information. Generally, the ACC decoder needs to package the AAC es stream into the ADTs format. Generally, seven bytes of ADTs header must be added before the AAC es stream. That is to say, you can regard the ADTs header as the AAC frameheader.
ADTs AAC |
Adts_header |
AAC es |
Adts_header |
AAC es |
... |
Adts_header |
AAC es |
2. ADTs content and structure
Useful information sampling rate, number of channels, and frame length in the ADTs header. Think about it too. If I were a decoder, I couldn't solve a bunch of AAC audio es streams. Every AAC stream with the ADTs header information will clearly tell the decoder the information it needs.
In general, the ADTs header information is 7 bytes, divided into two parts:
Adts_fixed_header ();
Adts_variable_header ();
Syncword: Synchronous header, always 0 xfff, all bits must be 1, representing the beginning of this ADTs Frame
ID: MPEG version, 0 for MPEG-4, 1 for MPEG-2
Layer: Always '00'
Profile: indicates the level of AAC to be used. Some chips only support aac lc and three types are defined in MPEG-2 AAC:
Sampling_frequency_index: indicates the subscripts used for sampling rate. You can use this subscript to find the value of sampling rate in the sampling frequencies [] array.
There are 13 supported frequencies:
0: 96000Hz
1: 88200Hz
2: 64000Hz
3: 48000Hz
4: 44100Hz
5: 32000Hz
6: 24000Hz
7: 22050Hz
8: 16000Hz
9: 12000Hz
10:11025Hz
11: 8000Hz
12: 7350Hz
13: Reserved
14: Reserved
15: frequency is written explictly
Channel_configuration: number of channels
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
Frame_length: the length of an ADTs Frame includes the ADTs header and the AAC original stream.
Adts_buffer_fullness: 0x7ff indicates a variable bit rate.
3. Pack AAC into ADTs format
If you use an embedded high-definition decoding chip as a product, the decoding work is generally completed by hardware. Therefore, most of the work is to package the AAC original stream into the ADTs format, and then discard it to the hardware.
By understanding the ADTs format, it is easy to package AAC into ADTs. We only need to obtain information about the audio sampling rate, number of audio channels, metadata length, and aac format in the Encapsulation Format. Add an ADTs header before each AAC original stream.
Paste the code of adding the ADTs header in FFMPEG to clearly understand the structure of the ADTs header:
int ff_adts_write_frame_header(ADTSContext *ctx, uint8_t *buf, int size, int pce_size){ PutBitContext pb; init_put_bits(&pb, buf, ADTS_HEADER_SIZE); /* 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 */ /* adts_variable_header */ put_bits(&pb, 1, 0); /* copyright_identification_bit */ put_bits(&pb, 1, 0); /* copyright_identification_start */ put_bits(&pb, 13, ADTS_HEADER_SIZE + size + pce_size); /* aac_frame_length */ put_bits(&pb, 11, 0x7ff); /* adts_buffer_fullness */ put_bits(&pb, 2, 0); /* number_of_raw_data_blocks_in_frame */ flush_put_bits(&pb); return 0;}
Refer:
1,AAC ADTs format Analysis
Http://blog.csdn.net/bsplover/article/details/7426476
(Conversion) AAC ADTs format Analysis