AAC头部格式,rtp打包格式

本文介绍了AAC编码中的两种头部格式:AudioSpecificConfig和StreamMuxConfig。AudioSpecificConfig用于指定音频的基本属性,如object type、采样率等;而StreamMuxConfig则用于多路复用配置。此外还讨论了AAC在不同容器格式中的应用及RTP打包方式。

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

一共有2种AAC头格式,一种是StreamMuxConfig,另一种是AudioSpecificConfig

1、AudioSpecificConfig
读写header的代码参考
    ffmpeg libavcodec\aacenc.c put_audio_specific_config()
    ffmpeg libavcodec\mpeg4audio.c avpriv_mpeg4audio_get_ config()
    fdk-aac libMpegTPEnc\src\tpenc_asc.cpp transportEnc_writeASC()
    libaacplus aacplusenc.c aacplusEncGetDecoderSpecificInfo()
 
ISO文档 14496-3
    1.6.2.1 "Syntax - AudioSpecificConfig"
http://www.nhzjj.com/asp/admin/editor/newsfile/2010318163752818.pdf
 
该Header的主要成员
  audioObjectType: 基本的object type用5个比特表示。2是AAC-LC,5是SBR,29是PS。
  samplingFrequencyIndex: 4个比特,用来表示采样率表中的索引号
  channelConfiguration: 4个比特,声道数
  if (audioObjectType == 5 || audioObjectType == 29)
    extensionSamplingFrequencyIndex: 4个比特,表明实际的音频采样率
    audioObjectType:  5个比特,表明基本层编码的AOT
  GASpecificConfig
    frameLengthFlag: 1个比特,0表示帧长为1024,1表示帧长为960
    DependsOnCoreCoder: 1个比特
    extensionFlag: 1个比特
 
剩余的扩展字段 
  syncExtensionType:  11个比特,0x2b7表示HE-AAC的扩展
  if (syncExtensionType == 0x2b7) {
    extensionAudioObjectType: 5个比特
    if ( extensionAudioObjectType == 5 ) {
      sbrPresentFlag: 1个比特
      if (sbrPresentFlag == 1) {
        extensionSamplingFrequencyIndex: 4个比特
      }
    }
  }
 
object type、sample rate详细表格可以参考
http://wiki.multimedia.cx/index.php?title=MPEG-4_Audio
 
如果是HE-AAC,有两种explicit和implicit一共三种声明模式。在explicit模式一(hierarchical signaling),AOT是5,然后在channels之后会有扩展的采样率和AOT字段(这里的AOT用于表明基本层编码,一般是2 AAC-LC),fdk_aac采用的这种方式;在explicit模式二(backward compatible signaling),AOT仍然是2(AAC-LC),但在GASpecificConfig后会有同步字0x2b7和sbrPresentFlag,libaacplus采用的是这种方式;在implicit模式,AOT仍然是2(AAC-LC),AudioSpecificConfig没有任何扩展,仍只是2个字节,需要靠解码器在AAC码流中找到SBR的数据
参考论文《A closer look into MPEG-4 High Efficiency AAC》
http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.129.4563&rep=rep1&type=pdf
 
 
2、StreamMuxConfig
写header的代码参考
    ffmpeg libavformat\latmenc.c latm_write_frame_heade()
    ffmpeg libavcodec\aacdec.c read_stream_mux_config()
    fdk-aac libMpegTPEnc\src\tpenc_latm.cpp CreateStreamMuxConfig()
 
ISO文档 14496-3
    1.7.3 Multiplex Layer
 
 
其他相关的
1、TS流可以使用ADTS和LATM两种封装格式。在ffmpeg的mpegtsenc中,用了一个amux的AVFormatContext,先把非ADTS的raw aac流写成ADTS或者LATM格式,然后再写入TS流
2、FLV/RTMP有两种AAC AUDIO DATA,0是AudioSpecificConfig,1是raw的AAC流。可以参考flv格式的官方说明文档
3、AAC的LATM over RTP打包格式定义在RFC 3016。SDP中几个参数含义:object,就是AAC的AOT;cpresent=0,表示StreamMuxConfig不出现在码流中;config,就是StreamMuxConfig用base16进行编码。每个RTP包的载荷,最前面是PayloadLengthInfo,每出现一个0xFF表示帧长度+255,直至非0xFF就是剩余的长度;然后就是PayloadMux即AAC的裸流

4、AAC的另外一种RTP打包格式是mpeg4-generic,定义在RFC 3640。SDP中几个参数含义:config,就是AudioSpecificConfig的十六进制表示;sizeLength=13; indexLength=3,这是每个rtp包头都是固定的。每个RTP包的载荷,最前面2个字节一般是0x00 10,这是 AU-headers-length,表示AU header的长度是16个比特也就是2个字节。后面2个字节,高13位是AAC帧的长度,低3位为0。

### 回答1: AAC(Advanced Audio Coding)是一种基于MPEG-2标准的音频压缩编码格式,它采用了高效的压缩算法,能够在保留较高音质的同时减小文件大小。RTP(Real-time Transport Protocol)是一种实时传输音视频数据的协议,用于在互联网上传输音视频流。 AAC封包和解包是将AAC音频数据封装成RTP数据包,并在接收端将RTP数据包解包还原成AAC音频数据的过程。 在进行AAC封包时,需要首先将原始的AAC音频数据按照RTP格式进行封装。封包的过程包括以下几个步骤: 1. 分片:将原始的AAC音频数据分成较小的数据块,以便在网络上传输。 2. 添加RTP头部:为每个数据块添加RTP头部,包括序列号、时间戳等信息,用于接收端进行数据恢复。 3. 添加RTP扩展头部(可选):添加一些额外的信息,如源地址、目的地址等。 4. 添加UDP头部:将封装好的RTP数据包添加UDP头部,以便进行网络传输。 在进行AAC解包时,需要将接收到的RTP数据包解析还原成原始的AAC音频数据。解包的过程包括以下几个步骤: 1. 去除UDP头部:将接收到的数据包去除UDP头部,获取RTP数据包。 2. 解析RTP头部:解析RTP头部获取序列号、时间戳等信息。 3. 去除RTP头部:将RTP头部去除,获取原始的AAC音频数据块。 4. 还原AAC音频数据:将获取到的音频数据块还原成原始的AAC音频数据。 封包和解包使得AAC音频数据能够以RTP数据包的形式在网络上进行实时传输和接收,保证了音频数据的完整性和一定程度的实时性。这对于需要进行音频传输的应用场景非常有用,如实时语音通话、音频会议等。 ### 回答2: RTP(实时传输协议)是一种用于实时数据传输的协议,可以将音频、视频和其他多媒体数据封装并实时传输。AAC(Advanced Audio Coding)是一种高级音频编码格式,能够提供较高的音质和较低的数据率。 在将AAC封装成RTP包时,需要进行以下步骤: 1. 分割AAC帧:AAC编码的音频数据通常以帧的形式存储,需要将这些帧进行分割,以便封装成RTP包。 2. 添加RTP头部:根据RTP协议的规范,需要为每个AAC帧添加RTP头部,包括序列号、时间戳和同步源等信息。 3. 打包RTP包:将添加了RTP头部AAC帧按照一定的顺序和格式打包RTP包,可以使用UDP协议进行传输。 解包RTP中的AAC音频数据时,需要进行以下步骤: 1. 解析RTP头部:从接收到的RTP包中提取出RTP头部的信息,包括序列号、时间戳和同步源等。 2. 解析AAC帧:根据AAC编码的格式,将RTP包中的数据解析成原始的AAC帧。 3. 合并帧数据:如果收到多个RTP包含有同一帧中的不同部分数据,需要将这些部分数据进行合并,还原出完整的AAC帧。 4. 进行解码:将还原出的AAC帧进行解码,得到音频数据。 5. 进一步处理:可以对解码后的音频数据进行后续处理,如播放、存储或传输。 通过上述封包和解包的过程,我们能够将AAC音频数据封装成RTP包进行实时传输,并在接收端解析和解包RTP包,得到原始的AAC音频数据进行后续处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值