AAC_LC用LATM封装header信息解析

本文详细介绍了如何根据音频参数生成AAC_LC头信息,包括使用ffmpeg和FAAC库的具体实现过程,以及AAC_LC头信息的结构组成。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通常来说AAC的头信息在编解码过程中是可以获取到的,但今天需要根据音频参数生成相应的AAC头。项目中使用的是AAC_LC,今天先对它的结构进行分析。

    项目中使用ffmpeg进行音频编码,音频编码库为FAAC,好吧,直接看代码吧。

    ffmpeg调用Faac_encode_init()初始化编码器;在Faac_encode_init()调用faacEncGetDecoderSpecificInfo()获取AAC_LC头信息内容及长度。


?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
int FAACAPI faacEncGetDecoderSpecificInfo(faacEncHandle hEncoder,unsigned char ** ppBuffer,unsigned long * pSizeOfDecoderSpecificInfo)
{
     BitStream* pBitStream = NULL; <span style= "font-family:Times New Roman;" ></span> if ((hEncoder == NULL) || (ppBuffer == NULL) || (pSizeOfDecoderSpecificInfo == NULL)) {
         return -1;
     }
 
     if (hEncoder->config.mpegVersion == MPEG2){
         return -2; /* not supported */
     }
 
     *pSizeOfDecoderSpecificInfo = 2;
     *ppBuffer = malloc (2);
 
     if (*ppBuffer != NULL){
 
         memset (*ppBuffer,0,*pSizeOfDecoderSpecificInfo);
         pBitStream = OpenBitStream(*pSizeOfDecoderSpecificInfo, *ppBuffer);
         PutBit(pBitStream, hEncoder->config.aacObjectType, 5);
         PutBit(pBitStream, hEncoder->sampleRateIdx, 4);
         PutBit(pBitStream, hEncoder->numChannels, 4);
         CloseBitStream(pBitStream);
 
         return 0;
     } else {
         return -3;
     }
}




    从代码中可以看出,头数据长度固定为2;

    数据内容由高位到低位依次为:aacObjectType(5bits),sampleRateIdx(4bits),numChannels(4bits)

例如:音频编码参数为:

aacObjectType:AAC_LC,对应值为2,用5bit二进制表示为00010;

sampleRate:44100KHz, 对应的IDX值为4, 用4bit二进制表示为0100; 

numChannels:2,对应的值为2,用4bit二进制表示为0010;

将它们由高位到低位串起来:0001,0010,0001,0000,

则,对应的十六进制值为:0x1220


引一些参考资料:http://wiki.multimedia.cx/index.php?title=MPEG-4_Audio

Audio Specific Config

The Audio Specific Config is the global header for MPEG-4 Audio:

5 bits: object type
if (object type == 31)
    6 bits + 32: object type
4 bits: frequency index
if (frequency index == 15)
    24 bits: frequency
4 bits: channel configuration
var bits: AOT Specific Config

Audio Object Types

MPEG-4 Audio Object Types:

  • 0: Null
  • 1: AAC Main
  • 2: AAC LC (Low Complexity)
  • 3: AAC SSR (Scalable Sample Rate)
  • 4: AAC LTP (Long Term Prediction)
  • 5: SBR (Spectral Band Replication)
  • 6: AAC Scalable
  • 7: TwinVQ
  • 8: CELP (Code Excited Linear Prediction)
  • 9: HXVC (Harmonic Vector eXcitation Coding)
  • 10: Reserved
  • 11: Reserved
  • 12: TTSI (Text-To-Speech Interface)
  • 13: Main Synthesis
  • 14: Wavetable Synthesis
  • 15: General MIDI
  • 16: Algorithmic Synthesis and Audio Effects
  • 17: ER (Error Resilient) AAC LC
  • 18: Reserved
  • 19: ER AAC LTP
  • 20: ER AAC Scalable
  • 21: ER TwinVQ
  • 22: ER BSAC (Bit-Sliced Arithmetic Coding)
  • 23: ER AAC LD (Low Delay)
  • 24: ER CELP
  • 25: ER HVXC
  • 26: ER HILN (Harmonic and Individual Lines plus Noise)
  • 27: ER Parametric
  • 28: SSC (SinuSoidal Coding)
  • 29: PS (Parametric Stereo)
  • 30: MPEG Surround
  • 31: (Escape value)
  • 32: Layer-1
  • 33: Layer-2
  • 34: Layer-3
  • 35: DST (Direct Stream Transfer)
  • 36: ALS (Audio Lossless)
  • 37: SLS (Scalable LosslesS)
  • 38: SLS non-core
  • 39: ER AAC ELD (Enhanced Low Delay)
  • 40: SMR (Symbolic Music Representation) Simple
  • 41: SMR Main
  • 42: USAC (Unified Speech and Audio Coding) (no SBR)
  • 43: SAOC (Spatial Audio Object Coding)
  • 44: LD MPEG Surround
  • 45: USAC

Sampling Frequencies

There are 13 supported frequencies:

  • 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 Configurations

These are the channel configurations:

  • 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

<think>我们正在处理关于AAC传输类型的问题,特别是OT_AAC_TRANSPORT_TYPE相关的定义和用法。根据用户提供的引用,我们可以总结如下:1.引用[1]中定义了一个枚举类型TRANSPORT_TYPE,其中包含了多种AAC传输类型,包括:-TT_MP4_RAW=0-TT_MP4_ADIF=1-TT_MP4_ADTS=2-TT_MP4_LATM_MCP1=6-TT_MP4_LATM_MCP0=7-TT_MP4_LOAS=10-TT_DRM=122.引用[4]解释了这些传输类型的含义:-TT_MP4_RAW:裸AAC码流,没有任何封装-TT_MP4_ADIF和TT_MP4_ADTS:分别是ADIF和ADTS格式。-TT_MP4_LATM_MCP1和TT_MP4_LATM_MCP0:LATM封装格式,其中MCP1表示带内传输StreamMuxConfig,MCP0表示带外传输。-TT_MP4_LOAS:LOAS格式。3.引用[5]提到,对于AAC-LD(低延时)编码,通常使用TT_MP4_RAW(裸流)传输类型,并且需要记录每一帧的长度通过带外方法传输以辅助解码。而AAC-LC则通常使用TT_MP4_ADTS(ADTS格式)用于流媒体传输。4.在安防监控领域(引用[2]),一般选择AacTransType_ADTS(即ADTS传输类型)。5.引用[3]给出了一个编码器配置结构体,其中包含传输类型(trans_type)的配置,例如设置为ADTS。用户询问的OT_AAC_TRANSPORT_TYPE_ADTS、OT_AAC_TRANSPORT_TYPE_LOAS、OT_AAC_TRANSPORT_TYPE_LATM_MCP1的定义和用法:-从枚举值来看,OT_AAC_TRANSPORT_TYPE_ADTS对应TT_MP4_ADTS(值为2),OT_AAC_TRANSPORT_TYPE_LOAS对应TT_MP4_LOAS(值为10),OT_AAC_TRANSPORT_TYPE_LATM_MCP1对应TT_MP4_LATM_MCP1(值为6)。用法:-ADTS(AudioDataTransportStream):是一种有同步头的封装格式,每一帧都有一个头,可以在流中任意位置开始解码。适用于流媒体传输,如实时传输的AAC流(如引用[1]提到实时AAC流通常采用TT_MP4_ADTS格式)。-LOAS(LowOverheadAudioStream):也是一种封装格式,常用于数字电视等领域。-LATM_MCP1(MPEG-4LATMwithMuxConfigPresentin-band):LATM(Low-overheadMPEG-4AudioTransportMultiplex)格式,MCP1表示多路复用配置信息(StreamMuxConfig)在码流中带内传输,即包含在音频帧中。注意:用户问题中的前缀“OT_”可能是特定SDK或库中的前缀(如可能是某个公司或项目的命名),但从引用的枚举来看,它们与引用[1]中的TRANSPORT_TYPE枚举成员相对应。因此,我们可以认为:-OT_AAC_TRANSPORT_TYPE_ADTS就是TRANSPORT_TYPE中的TT_MP4_ADTS-OT_AAC_TRANSPORT_TYPE_LOAS就是TT_MP4_LOAS-OT_AAC_TRANSPORT_TYPE_LATM_MCP1就是TT_MP4_LATM_MCP1在具体使用时,需要根据应用场景选择合适的传输类型:-实时流媒体(如网络直播、实时通信)常用ADTS,因为其每一帧都有同步头,适合流式传输。-低延时应用(如实时音视频通信)可能需要使用裸流(TT_MP4_RAW)并配合带外传输帧长度信息(如引用[5]所述)。-LOAS和LATM格式则用于特定场合,如数字电视、广播等。总结:用户提到的三个传输类型定义在枚举中,其数值和含义如上所述。在编程中,设置编码器或解码器的传输类型时,需要根据实际需求选择对应的枚举值。</think>### AAC传输类型定义与用法详解 根据提供的引用资料,AAC传输类型用于指定音频数据的封装格式,在编码和解码过程中至关重要。以下是您询问的三种传输类型的定义和使用场景: #### 1. **OT_AAC_TRANSPORT_TYPE_ADTS**(对应引用[1][3][4]) - **定义**: $$ \text{TT\_MP4\_ADTS} = 2 $$ - **封装格式**:ADTS(Audio Data Transport Stream)格式,每个AAC帧前添加7-9字节的帧头。 - **核心特征**: - 每帧自带同步头和参数信息(采样率、声道数等) - 支持流媒体实时传输(如网络直播) - 帧间独立,可从任意位置开始解码 - **典型用法**: ```c // 编码器配置示例(引用[3]) AvAacEncConfig config = { .trans_type = AvAacEncTransType_ADTS, // 设置为ADTS传输 .format = AvAacEncFmt_AACLC, .bit_rate = 128000 }; ``` **应用场景**:安防监控[^2]、实时流媒体传输[^1]、网络音频直播。 #### 2. **OT_AAC_TRANSPORT_TYPE_LOAS**(对应引用[1][4]) - **定义**: $$ \text{TT\_MP4\_LOAS} = 10 $$ - **封装格式**:LOAS(Low Overhead Audio Stream)格式,使用同步字0x2B7标识帧起始。 - **核心特征**: - 低开销封装,适合带宽受限场景 - 需显式传输全局配置信息 - 主要用于广播系统(如DVB、ATSC) - **典型用法**: ```c TRANSPORT_TYPE transport = TT_MP4_LOAS; // 配置LOAS传输(引用[1]) ``` **应用场景**:数字电视广播、卫星音频传输。 #### 3. **OT_AAC_TRANSPORT_TYPE_LATM_MCP1**(对应引用[1][4][5]) - **定义**: $$ \text{TT\_MP4\_LATM\_MCP1} = 6 $$ - **封装格式**:LATM(Low-overhead MPEG-4 Audio Transport Multiplex)带内配置。 - **核心特征**: - 多路复用能力(可封装多个音频流) - **MCP1**表示流配置信息(StreamMuxConfig)在码流内传输 -解析首帧获取配置参数 - **典型用法**: ```c // 低延时场景配置(引用[5]) if (aac_type == AAC_LD) { // 低延时编码 transport_type = TT_MP4_RAW; // 裸流需带外传帧长 } else { transport_type = TT_MP4_LATM_MCP1; // 标准LATM带内配置 } ``` **应用场景**:多媒体容器封装(如MP4)、需要多音频流同步的场景。 --- ### **关键区别总结** | 类型 | 同步机制 | 配置信息位置 | 典型比特率开销 | |---------------|----------------|--------------|----------------| | **ADTS** | 每帧头同步字 | 每帧头携带 | 约3% | | **LOAS** | 同步字0x2B7 | 独立全局配置 | <1% | | **LATM_MCP1** | 复用层同步 | 首帧带内传输 | 约1.5% | > **工程实践建议**(引用[2][5]): > - 实时流媒体优先选**ADTS**(抗丢包强) > - 低延时通信用**裸流(TT_MP4_RAW)**+带外传帧长 > - 广播系统用**LOAS**,多媒体容器用**LATM**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值