AAC 音频数据结构实例分析:

AAC 有两种数据交换格式:ADTS 和 ADIF
ADIF: Audio Data Interchange Format, 一个文件只有一个头,可类比dvd中使用的ps流。
ADTS: Audio Data Interchange Format, 每个frame中都有这个同步头, 可类比dvb中的ts流.
本博客只介绍 ADTS 格式AAC
基本构成是7bytes 头部+原始数据. 循环重复

一、AAC文件头信息
ADTS的头信息分为:固定头信息(adts_fixed_header,28bits)和可变头信息(adts_variable_header,28bits)两部分。
下面是iso13818-7 的说明.

固定头:
syncword :同步头代表着1个ADTS帧的开始,所有bit置1,即 0xFFF
ID:MPEG标识符,0标识MPEG-4,1标识MPEG-2
Layer: 直接置00,解码时忽略这个参数
protection_absent:表示是否误码校验。1 no CRC , 0 has CRC
profile:AAC 编码级别, 0: Main Profile, 1:LC(最常用), 2: SSR, 3: reserved.
sampling_frequency_index:采样率标识,重要!
Private bit:直接置0,解码时忽略这个参数
channel_configuration: 声道数标识,重要!
original_copy: 直接置0,解码时忽略这个参数
home:直接置0,解码时忽略这个参数

重点关注:
1. sample_freq_index    : 4代表44100hz
2. channel_configuration: 2表示双声道
3. frame_length : 13bits

可变头:
copyright_identification_bit: 直接置0,解码时忽略这个参数
copyright_identification_start: 直接置0,解码时忽略这个参数
aac_frame_lenght: 当前音频帧的字节数. 重要!
adts_buffer_fullness: 当设置为0x7FF时表示时可变码率
number_of_raw_data_blocks_in_frames: 当前音频包里面包含的音频编码帧数,为0代表1frame.

重点关注:
1. sample_freq_index    : 4代表44100hz
2. channel_configuration: 2表示双声道
3. frame_length : 13bits

二 . AAC 数据实例

数据分析都在图片里了.

贴上采样表及channel配置表
采样率表
const int avpriv_mpeg4audio_sample_rates[16] = {
    96000, 88200, 64000, 48000, 44100, 32000,
    24000, 22050, 16000, 12000, 11025, 8000, 7350
};

通道配置表
const uint8_t ff_mpeg4audio_channels[14] = {
    0,
    1, // mono (1/0)
    2, // stereo (2/0)
    3, // 3/0
    4, // 3/1
    5, // 3/2
    6, // 3/2.1
    8, // 5/2.1
    0,
    0,
    0,
    7, // 3/3.1
    8, // 3/2/2.1
    24 // 3/3/3 - 5/2/3 - 3/0/0.2
};

另外,frame 个数number_of_raw_block(用0表示)总是1,raw_data_in_frame总是1024

记录一次调试堆栈,望文生义可以看看函数名称及参数.真正搞懂要调试代码!

(gdb) bt parse 出一个frame 的调用栈
  #0  ff_adts_header_parse (gbc=0x7fffffff8ad0, hdr=0x7fffffff8ab0) at libavcodec/adts_header.c:38
  #1  0x00007ffff6783069 in aac_sync (state=72050243209011196, hdr_info=0x555555573240, need_next_header=0x5555555732a8, new_frame_start=0x7fffffff8b88) at libavcodec/aac_parser.c:45
  #2  0x00007ffff678162e in ff_aac_ac3_parse (s1=0x555555573040, avctx=0x555555559040, poutbuf=0x555555573318, poutbuf_size=0x555555573320, buf=0x7fffffff8d10 "\377\371P\200t\037\374!\020\005 \244\033\377\300", buf_size=20480) at libavcodec/aac_ac3_parser.c:52
  #3  0x00007ffff6f27cc7 in av_parser_parse2 (s=0x555555573040, avctx=0x555555559040, poutbuf=0x555555573318, poutbuf_size=0x555555573320, buf=0x7fffffff8d10 "\377\371P\200t\037\374!\020\005 \244\033\377\300", buf_size=20480, pts=-9223372036854775808, dts=-9223372036854775808, pos=0) at libavcodec/parser.c:169
  #4  0x0000555555555b13 in main (argc=3, argv=0x7fffffffde58) at decode_audio.c:186

(gdb) bt decode_frame 的调用栈
  #0  ff_adts_header_parse (gbc=0x7fffffff8a90, hdr=0x7fffffff8780) at libavcodec/adts_header.c:38
  #1  0x00007ffff67a4078 in parse_adts_frame_header (ac=0x555555559480, gb=0x7fffffff8a90) at libavcodec/aacdec_template.c:3091
  #2  0x00007ffff67a47e8 in aac_decode_frame_int (avctx=0x555555559040, data=0x55555555bac0, got_frame_ptr=0x7fffffff8af8, gb=0x7fffffff8a90, avpkt=0x55555555c080) at libavcodec/aacdec_template.c:3234
  #3  0x00007ffff67a53ad in aac_decode_frame (avctx=0x555555559040, data=0x55555555bac0, got_frame_ptr=0x7fffffff8af8, avpkt=0x55555555c080) at libavcodec/aacdec_template.c:3480
  #4  0x00007ffff699cd56 in decode_simple_internal (avctx=0x555555559040, frame=0x55555555bac0, discarded_samples=0x7fffffff8bb0) at libavcodec/decode.c:327
  #5  0x00007ffff699da08 in decode_simple_receive_frame (avctx=0x555555559040, frame=0x55555555bac0) at libavcodec/decode.c:526
  #6  0x00007ffff699db0c in decode_receive_frame_internal (avctx=0x555555559040, frame=0x55555555bac0) at libavcodec/decode.c:546
  #7  0x00007ffff699dd97 in avcodec_send_packet (avctx=0x555555559040, avpkt=0x555555573300) at libavcodec/decode.c:608
  #8  0x0000555555555635 in decode (dec_ctx=0x555555559040, pkt=0x555555573300, frame=0x555555573400, outfile=0x555555573ab0) at decode_audio.c:81
  #9  0x0000555555555ba3 in main (argc=3, argv=0x7fffffffde58) at decode_audio.c:197

参考:libavcodec/adts_header.c
参考:libavcodec/aac_parser.c
参考:libavcodec/decode.c
参考:iso-iec-13818-7

AAC 音频数据结构实例分析:相关推荐

  1. 【Android RTMP】音频数据采集编码 ( AAC 音频格式解析 | FLV 音频数据标签解析 | AAC 音频数据标签头 | 音频解码配置信息 )

    文章目录 安卓直播推流专栏博客总结 一. AAC 音频格式解析 二. FLV 音频数据标签解析 1. 分析 FLV 格式中的 AAC 音频格式数据 2. AAC 音频特殊配置 3. AAC 音频数据标 ...

  2. AAC音频格式分析与解码

    原文地址为: AAC音频格式分析与解码 一直在做一个语音项目,到了测试阶段,近来不是很忙,想把之前做的内容整理一下. 关于AAC音频格式基本情况,可参考维基百科http://en.wikipedia. ...

  3. RPC-原理及RPC实例分析

    还有就是:RPC支持的BIO,NIO的理解 (1)BIO: Blocking IO;同步阻塞: (2)NIO:Non-Blocking IO, 同步非阻塞; 参考:IO多路复用,同步,异步,阻塞和非阻 ...

  4. Android10.0 Binder通信原理(四)-Native-C\C++实例分析

    摘要:本节主要来讲解Android10.0 Binder的Native层实例流程 阅读本文大约需要花费35分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Androi ...

  5. 【Android RTMP】安卓直播推流总结 ( 直播服务器搭建 | NV21 图像采集 | H.264 视频编码 | PCM 音频采集 | AAC 音频编码 | RTMP 包封装推流 )

    文章目录 一. 安卓直播推流专栏博客总结 二. 相关资源介绍 三. GitHub 源码地址 四. 整体 Android 直播推流数据到服务器并观看直播演示过程 Android 直播推流流程 : 手机采 ...

  6. 【Android RTMP】音频数据采集编码 ( FAAC 编码器编码 AAC 音频采样数据 | 封装 RTMP 音频数据头 | 设置 AAC 音频数据类型 | 封装 RTMP 数据包 )

    文章目录 安卓直播推流专栏博客总结 一. FAAC 编码器编码 AAC 音频采样数据 二. 封装 RTMP 音频数据头 三. 封装 RTMP 音频数据类型 四. 拷贝 AAC 音频数据到 RTMPPa ...

  7. 【Android RTMP】音频数据采集编码 ( FAAC 编码器编码 AAC 音频解码信息 | 封装 RTMP 音频数据头 | 设置 AAC 音频数据类型 | 封装 RTMP 数据包 )

    文章目录 安卓直播推流专栏博客总结 一. FAAC 编码器编码 AAC 音频解码信息 二. 封装 RTMP 音频数据头 三. 封装 RTMP 音频数据类型 四. 拷贝 AAC 音频数据到 RTMPPa ...

  8. linux驱动由浅入深系列:高通sensor架构实例分析之一

    点击打开链接 本系列导航: linux驱动由浅入深系列:高通sensor架构实例分析之一(整体概览+AP侧代码分析) linux驱动由浅入深系列:高通sensor架构实例分析之二(adsp驱动代码结构 ...

  9. linux设备驱动模型之 kset原理与实例分析

    1. Kset kset是具有相同类型的kobject的集合,在sysfs中体现成一个目录,在内核中用kset数据结构表示,定义为: struct kset { struct list_head li ...

  10. 视音频数据处理入门:AAC音频码流解析

    ===================================================== 视音频数据处理入门系列文章: 视音频数据处理入门:RGB.YUV像素数据处理 视音频数据处理 ...

最新文章

  1. (十六)java springcloud版b2b2c社交电商spring cloud分布式微服务-使用spring cloud Bus刷新配置...
  2. Linux2.6内核--内存管理(2)--区
  3. java jframe显示图片_java怎么在JFrame中显示动态图片
  4. 如何理解深度学习分布式训练中的large batch size与learning rate的关系?
  5. 三款免费实用的文件夹同步/备份软件推荐 (SyncToy/FreeFileSync/Compare Advance)
  6. zoom怎么解除静音_ZOOM视频软件使用指南(学生端)
  7. centos重置系统_双系统下Linux系统无法启动及其引导丢失之解决
  8. 【mysql处理远程登陆授权及数据库迁移备份问题】
  9. shell学习之循环命令
  10. 2016年最新C/C++学习路线图 附完整视频资源
  11. mysql 有数据更新数据_MySQL之——实现无数据插入,有数据更新
  12. excel 转txt文件
  13. Linux:CentOS 7 解压 7zip 压缩的文件
  14. 病毒conime.exe、mmlucj.exe、severe.exe 查杀办法
  15. OCR识别通过某瓣人机验证
  16. ios查看苹果app的下载量,日活,销售情况等相关数据
  17. 联想笔记本怎么把计算机移到桌面上,怎样把软件移到桌面上
  18. 联想小新Pro 16频繁蓝屏解决方案
  19. C语言中exit(0)和_exit(0)
  20. vim中指定字符串的替换和删除

热门文章

  1. centos7.4源码安装nginx-1.16.1 及NGINX最全配置 缓存缩略图4层转发
  2. linux如何把文件导出到ftp,Linux如何利用ssh传送文件至FTP空间
  3. Spring Aop(入门篇)
  4. 先手获胜逻辑题_最获胜的A / B测试结果是否令人误解?
  5. python运行黑色窗口怎么弄_selenium+python 去除启动的黑色cmd窗口方法
  6. brew安装php-ffmpeg,macos安装ffmpeg以及出现问题的解决方案,一次成功
  7. 论剑乌镇-热点轮换谁能屹立不倒
  8. win10无法打开设置,桌面右键显示设置提示ms-settings:display 该文件没有与之关联的程序来执行该操作
  9. collapse mode 严重_明早10点大讲堂 | 一个简单的方法解决生成对抗网络mode collapse问题...
  10. 《python网络数据采集》读书笔记