【音频编码格式】AAC详解

文章目录

AAC的ADIF和ADTS

AAC音频格式 :Advanced Audio Coding(高级音频解码),是一种由MPEG-4标准定义的有损音频压缩格式,取代MP3,提供更好的音质和更低的比特率,非常常用!

  • ADIF :Audio Data Interchange Format ADIF是AAC的单一文件存储格式,整个音频流封装为一个文件,适合本地存储(如下载的音频文件);

    • 文件结构 :文件头+连续的数据帧
      • 全局头\] + \[音频数据块1\] + \[音频数据块2\] + ... + \[音频数据块N

        • 全局头(Header) : 包含采样率、声道数、比特率等全局信息 ,但不包含帧级的同步信息
      • 音频数据块 : 连续存储的AAC压缩数据,没有独立的帧头(与ADTS不同)。
    • 缺点:无法流式传输(需完整文件才能解码)。不能从中间任一帧解码;
    • 应用场景
      • 完整的音频文件(如.m4a、.aac本地文件)
      • 避免ADTS的冗余头开销:ADIF比ADTS节省约5%~10%空间(无每帧头)
  • ADTS (Audio Data Transport Stream) ADTS是AAC的流式传输格式,每帧自带头信息,适合实时传输(如网络直播)

    • 帧结构帧头 (7/9字节)+ 数据块:AAC压缩数据。
    • 优势:支持流式播放(可逐帧解析,无需完整文件)
    • 应用场景:- 实时流媒体(HTTP Live Streaming, HLS)。- 广播传输(如数字电视)
    • 问题
      • 编码AAC裸流的时候,会遇到写出来的AAC文件并不能在PC和手机上播放?
        • 原始AAC数据(裸流)每一帧因缺少ADTS头信息导致无法被播放器识别
        • 如何为AAC裸流添加ADTS头?
          • 使用FFmpeg封装: 将AAC裸流封装为ADTS格式 ffmpeg -i input_raw.aac -c:a copy -f adts output_adts.aac
  • 二者区别

    • 简单说,ADTS可以在任意帧解码 ,也就是说它每一帧都有头信息。ADIF只有一个统一的头,所以必须得到所有的数据后解码。
    • 且这两种的header的格式也是不同的,目前一般编码后的和抽取出的都是ADTS格式的音频流。
  • 如何解决ADIF的局限性?

    • 需要流式传输 将ADIF转换为ADTS格式(通过FFmpeg)
      *
      • ffmpeg -i input.adif -f adts output.aac
    • 从ADIF中提取部分数据 必须从头开始截取 ,否则数据无效:
      *
      • dd if=input.adif of=partial.adif bs=1M count=10 # 截取前10MB

ADTS结构解析

AAC音频文件的每一帧由ADTS Header和AAC Audio Data组成。结构体如下:

ADTS头解析 :每⼀帧的ADTS的头⽂件都包含了⾳频的采样率,声道,帧⻓度等信息,这样解码器才能解析读取。⼀般情况下ADTS的头信息都是7个字节,分为2部分

  1. 固定头(adts_fixed_header) :固定头信息中的数据每⼀帧都相 同。28bit=3.5bytes,

  2. syncword :同步头 总是0xFFF, all bits must be 1,代表着⼀个ADTS帧的开 始

  3. ID :MPEG标识符,0标识MPEG-4,1标识MPEG-2

  4. Layer :always: '00

  5. protection_absent :表示是否误码校验。Warning, set to 1 if there is no CRC and 0 if there is CRC

  6. profile :表示使⽤哪个级别的AAC,如01 Low Complexity(LC)--- AAC LC。有些芯⽚只⽀持AAC LC 。

  7. profile = MPEG-4 Audio Object Type -1

  8. sampling_frequency_index :表示使⽤的采样率下标,通过这个下标在 Sampling Frequencies[ ]数组中查找得知采样率的值

  9. channel_configuration : 表示声道数,⽐如2表示⽴体声双声道

  10. adts_variable_header () 28bit=3.5bytes

  11. frame_length : ⼀个ADTS帧的⻓度包括ADTS头和AAC原始流.

  12. frame length, this value must include 7 or 9 bytes of header length:

  13. aac_frame_length = (protection_absent == 1 ? 7 : 9) + size(AACFrame)

  14. protection_absent=0时, header length=9 bytes

  15. protection_absent=1时, header length=7bytes

  16. adts_buffer_fullness :0x7FF 说明是码率可变的码流。

  17. 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文件分析

下⾯是ADTS的AAC⽂件部分 :转换为2进制,对应信息就知道了;

相关推荐
让学习成为一种生活方式16 分钟前
植物中验证蛋白相互作用的Pull-down和Co-IP技术--文献精读181
网络·网络协议·tcp/ip
普普通通的南瓜24 分钟前
IP证书在关键信息基础设施安全防护中的实践与挑战
网络·数据库·网络协议·tcp/ip·安全·ssl
CV实验室2 小时前
CV论文速递:覆盖视频生成与理解、3D视觉与运动迁移、多模态与跨模态智能、专用场景视觉技术等方向 (11.17-11.21)
人工智能·计算机视觉·3d·论文·音视频·视频生成
讨厌下雨的天空2 小时前
网络基础
网络·1024程序员节
0和1的舞者3 小时前
《网络编程核心概念与 UDP Socket 组件深度解析》
java·开发语言·网络·计算机网络·udp·socket
华普微HOPERF3 小时前
Matter协议,如何赋能智能家居构建跨生态的互操作网络?
网络·智能家居
河南博为智能科技有限公司4 小时前
动环监控终端-守护变电站安全运行的智能核心
运维·服务器·网络·物联网
无心水4 小时前
【Python实战进阶】5、Python字符串终极指南:从基础到高性能处理的完整秘籍
开发语言·网络·python·字符串·unicode·python实战进阶·python工业化实战进阶
FinelyYang5 小时前
uniapp+unipush2.0+WebRTC实现h5一对一视频通话
uni-app·音视频·webrtc
Top`5 小时前
两个服务之间传递的数据本质上是字节码(Byte Stream)
网络