flv封装ffmpeg编码的视音频笔记(二)

    flv封装ffmpeg编码的视音频笔记(一)不仅分析FLV文件结构及各结构的具体内容,对视频封装也做了具体说明。在上文的基础上,本文将添加音频封装的相关内容。封装音频之前,注意将FLV文件头中的类型标志位设为5,以保证FLV文件中存在音频。


一、音频配置Tag信息

    紧接着视频配置Tag的是音频配置Tag,也就是第一个AudioTag,它的标签头数据结构按照上文介绍的填值即可,需要将标签类型的值设为8,表示该Tag是音频相关的。

    音频标签数据区的第1个字节包含了音频数据的参数信息,从第2个字节开始为音频流数据。 
  第1个字节的的含义,见表1、表2、表3、表4,数据位从左至右。


表1 前4位表示音频数据的格式
--------------------------
值  含义
--------------------------
0  未压缩 
1  ADPCM 
2  MP3 
5  Nellymoser 8kHz momo 
6  Nellymoser 
--------------------------
说明:
  1.Nellymoser 8kHz 是一个特殊的类型,8kHz采样率在其它格式中不被支持。当音频格式是Nellymoser 8kHz mono的时候,采样精度(见表6)和音频类型(见表7)被忽略了。
  2.对于其它的 Nellymoser,采样率,采样精度、音频类型照常。

表2 第5-6位的数值表示采样率
---------------
值  含义
---------------
0  5.5kHz
1  11kHz
2  22kHz
3  44kHz
---------------

表3 第7位表示采样精度
--------------
值  含义
--------------
0  8位
1  16位
--------------

表4 第8位表示音频类型
--------------
值  含义
--------------
0  单声道
1  立体声 
--------------

    音频配置Tag的数据区结构如表5

表5 音频配置Tag的数据区结构
---------------------------------------
项目       长度(字节) 说明
---------------------------------------
类别      1     值为175,二进制为 10101111表示: 1010(十进制为10)-->AAC  第5-6位 11(十进制为   3)-->44kHz 第7位 1 --> 采样为16位数字 第8位 1 --> 立体声
AAC类型    1       值为0,表示AAC sequence header
音频配置  2          第一个字节为18,第二个字节为16
---------------------------------------
    接下来是该Tag的大小。

二、ffmpeg编码得到的AAC数据
    AAC原始码流(又称为“裸流”)是由一个一个的ADTS frame组成的。他们的结构如下图所示。

    其中每个ADTS frame之间通过syncword(同步字)进行分隔。同步字为0xFFF(二进制“111111111111”)。AAC码流解析的步骤就是首先从码流中搜索0x0FFF,分离出ADTS frame;然后再分析ADTS frame的首部各个字段。本文的程序即实现了上述的两个步骤。
    每次编码的采样数不超过1024,使用1024个采样编码可得到一包AAC数据。“雷神”的文章说是编码得到的AAC数据有同步字,在实际编码中并没有看到。得到一包AAC数据后,就可以为FLV音频封装做准备了。

三、音频Tag信息
    音频Tag的标签头和音频配置Tag的标签头一样,不同的是标签数据区,音频Tag的标签数据区见表6


表6 音频Tag的数据区结构
---------------------------------------
项目       长度(字节) 说明
---------------------------------------
类别      1     值为175,二进制为 10101111表示: 1010(十进制为10)-->AAC  第5-6位 11(十进制为   3)-->44kHz 第7位 1 --> 采样为16位数字 第8位 1 --> 立体声
AAC类型    1       值为1,表示AAC数据
AAC数据 数据实际尺寸
---------------------------------------
    填上AAC数据后,别忘了加上音频Tag的大小,依次类推。如此,在上文的基础上可添加能正常播放的FVL音频。

四、音视频同步相关
    视频和音频的正常播放,需要确保填入Tag的时间戳是正确的,同时音视频Tag需要“间隔”地加入FLV文件中。一个视频Tag的播放时间大概是41ms,一个音频Tag的播放时间是大概是23ms,所以大部分的FLV文件里一个视频Tag后接二个音频Tag,当然具体需要考虑实际的时间戳。

你可能感兴趣的:(流媒体,ffmpeg,编码,音频,flv)