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码流到FLV文件的更多相关文章

  1. 【转】打包AAC码流到FLV文件

    AAC编码后数据打包到FLV很简单.1. FLV音频Tag格式                              字节位置    意义0x08,                         ...

  2. 将h264和aac码流合成flv文件

    在视频应用中,经常需要将接收到h264和aac数据保存成文件. 本来想用mp4格式,但是mp4在没有正常关闭的情况下会导致文件打不开,而在实际应用中经常会出现设备直接拔电,程序不是正常结束的情况.于是 ...

  3. 【雷神源码解析】无基础看懂AAC码流解析,看不懂你打我

    一 前言 最近在尝试学习一些视频相关的知识,随便一搜才知道原来国内有雷神这么一个真正神级的人物存在,尤其是在这里(传送门)看到他的感言更是对他膜拜不已,雷神这种无私奉献的精神应当被我辈发扬光大.那写这 ...

  4. AAC 码流信息分析

    AAC在对PCM数据进行编码时,使用window取出1024或128个数据进行MDCT转换到频域. Window的相关信息记录在ics_info中: 关于ics_info中各个字段的含义如下 wind ...

  5. (原)从mp4,flv文件中解析出h264和aac,送解码器解码失败

    转载请注明出处:http://www.cnblogs.com/lihaiping/p/5285166.html 今天在做本地文件解码测试,发现从mp4,flv文件中读出来的帧数据,h264和aac帧直 ...

  6. aac adts & LATM封装码流分析

    本文继续上一篇文章的内容,介绍一个音频码流处理程序.音频码流在视频播放器中的位置如下所示. 本文中的程序是一个AAC码流解析程序.该程序可以从AAC码流中分析得到它的基本单元ADTS frame,并且 ...

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

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

  8. 视音频数据处理入门:H.264视频码流解析

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

  9. RTP协议全解析(H264码流和PS流)

    转自:http://blog.csdn.net/chen495810242/article/details/39207305 写在前面:RTP的解析,网上找了很多资料,但是都不全,所以我力图整理出一个 ...

随机推荐

  1. 由浅到深理解ROS(4)

    消息和消息类型 节点能相互传递消息,节点之间通信也是基于消息.消息类型也就是数据类型数据类型,理解消息的类型很重要,因为它决定了消息的内容.也就是说,一个话题的消息类型能告诉你该话题中每个消息携带了哪 ...

  2. python入门课程 第二章 安装Python

    2-1 选择python版本首先python2.7和python3是不可以通用的目前丰富的类库都支持python2.7,所以选用Python2.7    选择python2.7版本2-2 window ...

  3. Windows 下Node.js开发环境配置

    第一步:安装VirtualBox(以管理员身份安装) 1.安装完成后,打开VirtualBox,点击“新建”按钮,输入信息,“下一步”(名称可任意) 2.设置内存为1024MB,“下一步”—>“ ...

  4. 使用tomcat7-maven-plugin部署Web项目

      一.环境准备 我使用的环境是:Window 10.Tomcat 8.0.36.maven3.tomcat7-maven-plugin 2.2版本. 二.设置环境变量 安装Tomcat8.0.36和 ...

  5. 红米4A手机刷开发版rom并且获取root权限

    1 bl解锁 Critical partition flashing is not allowed就是因为没有bl解锁. 注册小米账号并且关联手机. 下载bl解锁工具 http://www.miui. ...

  6. [Android]豆瓣FM离线数据

    离线目录结构: /sdcard/Android/data/com.douban.radio下 ./cache/fileCaches: 离线音乐歌词(lyric) ./cache/images: 离线音 ...

  7. ajax (异步js+xml)

    AJAX 基础 AJAX = 异步js+xml 通过与后台服务器进行少量数据交换,实现前台网页局部更新 XMLHttpRequest对象 是 AJAX 的基础 var xmlhttp; if (win ...

  8. java 从零开始 第三天

    2015年5月2日 51刚过一天,电脑坏了.不开心,就没有更新了 Java中的类型转换 自动类型 在 Java 程序中,不同的基本数据类型的数据之间经常需要进行相互转换.例如: , 代码中 int 型 ...

  9. CALL TRANSFORMATION 的方法生成XML文件

    *&---------------------------------------------------------------------**& Report  Z_BARRY_X ...

  10. LeetCode:区域和检索【303】

    LeetCode:区域和检索[303] 题目描述 给定一个整数数组  nums,求出数组从索引 i 到 j  (i ≤ j) 范围内元素的总和,包含 i,  j 两点. 示例: 给定 nums = [ ...