AAC 音频数据结构实例分析:
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 音频数据结构实例分析:相关推荐
- 【Android RTMP】音频数据采集编码 ( AAC 音频格式解析 | FLV 音频数据标签解析 | AAC 音频数据标签头 | 音频解码配置信息 )
文章目录 安卓直播推流专栏博客总结 一. AAC 音频格式解析 二. FLV 音频数据标签解析 1. 分析 FLV 格式中的 AAC 音频格式数据 2. AAC 音频特殊配置 3. AAC 音频数据标 ...
- AAC音频格式分析与解码
原文地址为: AAC音频格式分析与解码 一直在做一个语音项目,到了测试阶段,近来不是很忙,想把之前做的内容整理一下. 关于AAC音频格式基本情况,可参考维基百科http://en.wikipedia. ...
- RPC-原理及RPC实例分析
还有就是:RPC支持的BIO,NIO的理解 (1)BIO: Blocking IO;同步阻塞: (2)NIO:Non-Blocking IO, 同步非阻塞; 参考:IO多路复用,同步,异步,阻塞和非阻 ...
- Android10.0 Binder通信原理(四)-Native-C\C++实例分析
摘要:本节主要来讲解Android10.0 Binder的Native层实例流程 阅读本文大约需要花费35分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Androi ...
- 【Android RTMP】安卓直播推流总结 ( 直播服务器搭建 | NV21 图像采集 | H.264 视频编码 | PCM 音频采集 | AAC 音频编码 | RTMP 包封装推流 )
文章目录 一. 安卓直播推流专栏博客总结 二. 相关资源介绍 三. GitHub 源码地址 四. 整体 Android 直播推流数据到服务器并观看直播演示过程 Android 直播推流流程 : 手机采 ...
- 【Android RTMP】音频数据采集编码 ( FAAC 编码器编码 AAC 音频采样数据 | 封装 RTMP 音频数据头 | 设置 AAC 音频数据类型 | 封装 RTMP 数据包 )
文章目录 安卓直播推流专栏博客总结 一. FAAC 编码器编码 AAC 音频采样数据 二. 封装 RTMP 音频数据头 三. 封装 RTMP 音频数据类型 四. 拷贝 AAC 音频数据到 RTMPPa ...
- 【Android RTMP】音频数据采集编码 ( FAAC 编码器编码 AAC 音频解码信息 | 封装 RTMP 音频数据头 | 设置 AAC 音频数据类型 | 封装 RTMP 数据包 )
文章目录 安卓直播推流专栏博客总结 一. FAAC 编码器编码 AAC 音频解码信息 二. 封装 RTMP 音频数据头 三. 封装 RTMP 音频数据类型 四. 拷贝 AAC 音频数据到 RTMPPa ...
- linux驱动由浅入深系列:高通sensor架构实例分析之一
点击打开链接 本系列导航: linux驱动由浅入深系列:高通sensor架构实例分析之一(整体概览+AP侧代码分析) linux驱动由浅入深系列:高通sensor架构实例分析之二(adsp驱动代码结构 ...
- linux设备驱动模型之 kset原理与实例分析
1. Kset kset是具有相同类型的kobject的集合,在sysfs中体现成一个目录,在内核中用kset数据结构表示,定义为: struct kset { struct list_head li ...
- 视音频数据处理入门:AAC音频码流解析
===================================================== 视音频数据处理入门系列文章: 视音频数据处理入门:RGB.YUV像素数据处理 视音频数据处理 ...
最新文章
- (十六)java springcloud版b2b2c社交电商spring cloud分布式微服务-使用spring cloud Bus刷新配置...
- Linux2.6内核--内存管理(2)--区
- java jframe显示图片_java怎么在JFrame中显示动态图片
- 如何理解深度学习分布式训练中的large batch size与learning rate的关系?
- 三款免费实用的文件夹同步/备份软件推荐 (SyncToy/FreeFileSync/Compare Advance)
- zoom怎么解除静音_ZOOM视频软件使用指南(学生端)
- centos重置系统_双系统下Linux系统无法启动及其引导丢失之解决
- 【mysql处理远程登陆授权及数据库迁移备份问题】
- shell学习之循环命令
- 2016年最新C/C++学习路线图 附完整视频资源
- mysql 有数据更新数据_MySQL之——实现无数据插入,有数据更新
- excel 转txt文件
- Linux:CentOS 7 解压 7zip 压缩的文件
- 病毒conime.exe、mmlucj.exe、severe.exe 查杀办法
- OCR识别通过某瓣人机验证
- ios查看苹果app的下载量,日活,销售情况等相关数据
- 联想笔记本怎么把计算机移到桌面上,怎样把软件移到桌面上
- 联想小新Pro 16频繁蓝屏解决方案
- C语言中exit(0)和_exit(0)
- vim中指定字符串的替换和删除
热门文章
- centos7.4源码安装nginx-1.16.1 及NGINX最全配置 缓存缩略图4层转发
- linux如何把文件导出到ftp,Linux如何利用ssh传送文件至FTP空间
- Spring Aop(入门篇)
- 先手获胜逻辑题_最获胜的A / B测试结果是否令人误解?
- python运行黑色窗口怎么弄_selenium+python 去除启动的黑色cmd窗口方法
- brew安装php-ffmpeg,macos安装ffmpeg以及出现问题的解决方案,一次成功
- 论剑乌镇-热点轮换谁能屹立不倒
- win10无法打开设置,桌面右键显示设置提示ms-settings:display 该文件没有与之关联的程序来执行该操作
- collapse mode 严重_明早10点大讲堂 | 一个简单的方法解决生成对抗网络mode collapse问题...
- 《python网络数据采集》读书笔记