AAC编码后数据打包到FLV很简单。

1. FLV音频Tag格式
                              字节位置    意义
0x08,                        // 0,       TagType
0xzz, 0xzz, 0xzz,            // 1-3,     DataSize,    
0xzz, 0xzz, 0xzz, 0xzz,      // 4-6, 7   TimeStamp | TimeStampExtend    
0x00, 0x00, 0x00,            // 8-10,    StreamID
 
0xzz,                        // 11,      AudioTag Header  
0x0b,                        // 12,      AACPacketType    (如果不是AAC编码 没有这个字节)       
0xzz ... 0xzz                // 音频数据

2. AudioTagHeader
音频Tag头一般由一个字节定义(AAC用两个字节),第一个字节的定义如下:
音频格式 4bits | 采样率 2bits | 采样精度 1bits | 声道数 1bits|

音频格式 4bits
0x00 = Linear PCM, platform endian
0x01 = ADPCM
0x02 = MP3
0x03 = Linear PCM, little endian
0x04 = Nellymoser 16-kHz mono
0x05 = Nellymoser 8-kHz mono
0x06 = Nellymoser
0x07 = G.711 A-law logarithmic PCM
0x08 = G.711 mu-law logarithmic PCM
0x09 = reserved
0x0A = AAC
0x0B = Speex
0x0E = MP3 8-Khz
0x0F = Device-specific sound

采样率 2bits
0 = 5.5-kHz
1 = 11-kHz
2 = 22-kHz
3 = 44-kHz
对于AAC总是3,这里看起来FLV不支持48K AAC,其实不是的,后面还是可以定义为48K。

采样精度 1bits
0 = snd8Bit
1 = snd16Bit
压缩过的音频都是16bit

声道数 1bits
0 = sndMono
1 = sndStereo
对于AAC总是1

综上,如果是AAC 48K 16比特精度 双声道编码,该字节为 0b1010 1111 = 0xAF。

看第2个字节,如果音频格式AAC(0x0A),AudioTagHeader中会多出1个字节的数据AACPacketType,这个字段来表示AACAUDIODATA的类型:
0x00 = AAC sequence header,类似h.264的sps,pps,在FLV的文件头部出现一次。
0x01 = AAC raw,AAC数据

3. AAC Sequence header
AAC sequence header定义AudioSpecificConfig,AudioSpecificConfig包含着一些更加详细的音频信息,它的定义在ISO14496-3中1.6.2.1。
简化的AudioSpecificConfig 2字节定义如下:
AAC Profile 5bits | 采样率 4bits | 声道数 4bits | 其他 3bits |

AAC Profile 5bits,参考ISO-14496-3 Object Profiles Table
AAC Main 0x01
AAC LC    0x02
AAC SSR  0x03
...

(为什么有些文档看到profile定义为4bits,实际验证是5bits)

采样率 4bits
Value samplingFrequencyIndex
0x00   96000
0x01   88200
0x02   64000
0x03   48000
0x04   44100
0x05   32000
0x06   24000
0x07   22050
0x08   16000
0x09   12000
0x0A   11025
0x0B     8000
0x0C   reserved
0x0D   reserved
0x0E   reserved
0x0F   escape value

声道数 4bits
0x00 - defined in audioDecderSpecificConfig
0x01 单声道(center front speaker)
0x02 双声道(left, right front speakers)
0x03 三声道(center, left, right front speakers)
0x04 四声道(center, left, right front speakers, rear surround speakers)
0x05 五声道(center, left, right front speakers, left surround, right surround rear speakers)
0x06 5.1声道(center, left, right front speakers, left surround, right surround rear speakers, front low frequency effects speaker)
0x07 7.1声道(center, left, right center front speakers, left, right outside front speakers, left surround, right surround rear speakers, front low frequency effects speaker)
0x08-0x0F - reserved

其他3bits设置为0即可。

AAC-LC, 48000,双声道 这样的设置 Sequence header 为 0b 00010 0011 0010 000 = 0x11 0x90。
因此 AAC Sequence header的整个音频Tag包为 0x08, 00 00 04, 00 00 00 00, 00 00 00, AF 00 11 90 | 00 00 00 0F

AAC Sequence header这个音频包有些FLV文件里面没有也可以正确解码。但对于RTMP播放,必须要在发送第一个音频数据包前发送这个header包。

4. AAC音频包
结构为:0x08, 3字节包长度,4字节时间戳,00 00 00,AF 01 N字节AAC数据 | 前包长度
其中编码后AAC纯数据长度为N,3字节包长度 = N + 2

前包长度 = 11 + 3字节包长度 = 11 + N + 2 = 13 + N。

aac格式介绍的更多相关文章

  1. 视音频编解码学习工程:AAC格式分析器

    =====================================================视音频编解码学习工程系列文章列表: 视音频编解码学习工程:H.264分析器 视音频编解码学习工 ...

  2. aac格式解析

    AAC格式有以下两种: ADIF:Audio Data Interchange Format 音频数据交换格式.这种格式的特征是可以确定的找到这个音频数据的开始,不需进行在音频数据流中间开始的解码,即 ...

  3. 图像JPEG格式介绍

    1 JPG格式介绍 JPEG (Joint PhotographicExperts GROUP)是由国际标准组织和国际电话电报咨询委员会为静态图像所建立的第一个国际数字图像压缩标准,也是至今一直在使用 ...

  4. Mysql Binlog 三种格式介绍及分析

    一.Mysql Binlog格式介绍       Mysql binlog日志有三种格式,分别为Statement,MiXED,以及ROW! 1.Statement:每一条会修改数据的sql都会记录在 ...

  5. 图像YUV格式介绍

    图像YUV格式介绍   1 YUV格式简介 YUV格式,与我们熟知的RGB类似,YUV也是一种颜色编码方法,主要用于电视系统以及模拟视频领域,它将亮度信息(Y)与色彩信息(UV)分离,没有UV信息一样 ...

  6. Mysql Binlog三种格式介绍及分析【转】

    一.Mysql Binlog格式介绍       Mysql binlog日志有三种格式,分别为Statement,MiXED,以及ROW! 1.Statement:每一条会修改数据的sql都会记录在 ...

  7. 图像bayer格式介绍以及bayer插值原理CFA

    1 图像bayer格式介绍 bayer格式图片是伊士曼·柯达公司科学家Bryce Bayer发明的,Bryce Bayer所发明的拜耳阵列被广泛运用数字图像. 对于彩色图像,需要采集多种最基本的颜色, ...

  8. Au cs6怎样才能导入和导出m4a或者就是aac格式的文件呢?

        [求解]Au cs6怎样才能导入和导出m4a或者就是aac格式的文件呢?   汉化版;解决发法----首选项------常规------媒体与暂存盘-----动态链接媒体下面的启动DLMS格式 ...

  9. Linux/Unix 指令使用说明的格式介绍(the Bash Command 'Usage' Syntax)

    Linux/Unix 指令使用说明的格式介绍(the Bash Command 'Usage' Syntax) 摘自    金马的Blog 原文  http://www.lijinma.com/blo ...

随机推荐

  1. Linux与本地上传下载文件

    当出于安全原因,客户的服务器不允许使用windows第三方插件连接的时候,本地windows跟远程的linux服务器进行文件的上下传受到了限制,此时可以在linux服务器上安装一个工具:lrzsz.安 ...

  2. centos7.0 安装nginx

    在centos7.0下安装nginx需要安装 prce和zlib包去官网下载相应的包 然后解压相应的包进行编译 解压nginx源码包进入到解压文件 ./configure --sbin-path=/u ...

  3. GCD(st表+二分)

    GCD Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submis ...

  4. 开关openCV

    #include <cv.h> #include <highgui.h> #include <stdio.h> //开关 ; void switch_callbac ...

  5. 九度OJ 1255:骰子点数概率 (递归、DP)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:316 解决:29 题目描述: 把n个骰子扔在地上,所有骰子朝上一面的点数之和为S.输入n,打印出S的所有可能的值出现的概率. 输入: 输入包 ...

  6. 【python】-- 内置函数、软件目录开发规范(代码编码风格)

    内置函数 一.内置函数表格 二.内置函数演示 1.abs(x) 功能:取数的绝对值 >>> abs(-1) #取-1的绝对值 1 ########################## ...

  7. [luogu3601]签到题

    [luogu3601]签到题 luogu 求\[\sum_{i=l}^ri-\phi(i)\] 一个朴素的想法是枚举l~r,根号求\(\phi\),显然这样是\((r-l)\sqrt r\),时间无法 ...

  8. 初步jmeter安装与使用

    前言,最近公司做了面向全国用户的教育平台,由于测试人员以功能测试为主,于是接口代码压测就被开发揽了,这就开始倒腾jmeter了,其实我想对于java,我更愿意用Python的工具,毕竟我爬虫时用的Py ...

  9. Redis持久化——RDB(一)

    核心知识点: 1.RDB:将当前数据生成快照保存到硬盘 2.手动触发 save:会阻塞Redis服务器直到RDB完成. bgsave:执行fork创建子进程,由子进程负责RDB操作,阻塞只发生在for ...

  10. QCon2016 上海会议汇总(2) - 团队管理

    QCon 2016上海日程:http://2016.qconshanghai.com/schedule <当你的团队还支撑不起梦想时> - 链尚网技术合伙人 杨荣伟 Figo讲述了如何训练 ...