FLV文件(H264 + AAC)格式超详细分析
2014-09-29 15:12
531 查看
最近自己动手将H264视频流和AAC音频流合成flv文件,但是没有采用开源的ffmpeg的api来处理音视频流。方法就是模仿ffmpeg中libavformat/flvenc.c 文件写代码来完成音视频的flv格式封装。在这个封装过程中,需要非常清楚flv文件格式。网上有关flv文件格式的资料非常多,不过大部分资料是互相转载或者缺乏足够详细的信息(例如:AVDecoderConfigurationRecord和 AudioSpecificConfig的生成)。
因此我就以ffmpeg中libavformat/flvenc.c为基础分析flv文件的构成,详细分析flv文件中每个字节的含义。以下每个方格代表一个字节。其中的数字都是16进制表示(省略0x),格中的字符也可以用相应的16进制数字替代,用字符表示有时候更为直观。假定flv文件同时含有视频和音频。
![](http://img0.ph.126.net/oy0r7JMfBa8d9CFqwDh-RA==/6598218756309269265.jpg)
接下来就是Metadata的具体数据,由两个AMF包组成。
![](http://img0.ph.126.net/LdO-zR6WkJmdGpLNIxtQGw==/3288753627987687690.jpg)
Metadata元素个数暂定为12个 = 音频5个 + 视频5个 + 2个(duration和filesize)。 后面还可能会加入其它元素,因此会返回来修改此值。metadata元素的顺序不固定,此处采用ffmpeg中的顺序。
第二个AMF包中各数组元素封装形式为:前两个字节是元素名称的长度;后面跟着长度为L的字符串;第L+3个字节表示元素值的类型;后面跟着是对应值,占用的字节数取决于值的类型。
![](http://img0.ph.126.net/RvJW3p9TmLprTCBOIdq85g==/830914131350014641.jpg)
![](http://img2.ph.126.net/Zfi8jw1Joj18yC4v-oY3Kw==/6597665701960617578.jpg)
![](http://img2.ph.126.net/cB14rzWrgHHhN4vWWNhclQ==/150307637663720813.jpg)
![](http://img1.ph.126.net/uUKrNL8awXgv1gcQu7LwEA==/4831236500361744583.jpg)
以下的(tag->key,tag->value)不一定在所有flv文件中出现,依据不同版本有所不同。
![](http://img2.ph.126.net/RmbgN7_SnvBDaqCJKeMJWw==/6598227552402310826.jpg)
![](http://img0.ph.126.net/DrquJzJN_6-PIWk4FcufDg==/3280309378686368058.png)
![](http://img0.ph.126.net/XrmGmS7u5TluqtK00wyU-A==/1616229316372859226.jpg)
Remark:以上将flv官方文档的metadata信息写入了Script Tag中。但是在做flv文件合成的时候,发现网上有的flv文件将keyframes信息隐藏在Script Tag中。后来通过网络查一些资料,发现keyframes几乎是一个非官方的标准,也就是民间标准。
两个常用的操作metadata的工具是flvtool2和FLVMDI, 都是把keyframes作为一个默认的元信息项目。在FLVMDI的主页(http://www.buraks.com/flvmdi/)上有描述:
keyframes: (Object) This object is added only if you specify the /k switch. 'keyframes' is known to FLVMDI and if /k switch is not specified, 'keyframes' object will be deleted.
'keyframes' object has 2 arrays: 'filepositions' and 'times'. Both arrays have the same number of elements, which is equal to the number of key frames in the FLV. Values in times array are in 'seconds'. Each correspond to the timestamp of the n'th key frame. Values in filepositions array are in 'bytes'. Each correspond to the fileposition of the nth key frame video tag (which starts with byte tag type 9).
也就是说keyframes中包含着2个内容 'filepositions' and 'times'分别指的是关键帧的文件位置和关键帧的PTS。通过keyframes可以建立起自己的Index,然后再seek和快进快退的操作中,快速有效的跳转到你想要找的关键帧位置进行处理。
![](http://img0.ph.126.net/J43AlALtDD4qNKAcfbfdEw==/6597677796588523983.jpg)
![](http://img2.ph.126.net/KePISLnMgWhbWwrz3J20Qw==/1921348191127162988.jpg)
![](http://img2.ph.126.net/HpuEhy5Iv-6NiKpC1p_AFw==/4849813848824697605.jpg)
![](http://img0.ph.126.net/NbBMTQDwe2kYbSbhW-f0og==/6597931783774539393.jpg)
![](http://img2.ph.126.net/W5UcRyNVtx-s1rVUnOUgkg==/2161164871284654827.jpg)
![](http://img1.ph.126.net/N5uAlqS8JngjjZmrdUlULw==/285978576438223393.jpg)
![](http://img2.ph.126.net/x6gP-Z15C4WeJaWggkJhqQ==/6597893300867568995.jpg)
![](http://img1.ph.126.net/lQ70XwSAcVEpyWL-5-yY3Q==/6597966968146633324.jpg)
到此为止已经介绍完flv文件格式,flv格式还是比较简单的,header部分很简洁,body部分都是由一个个tag组成,tag的话也就三种,脚本tag一般只有一个。最后用一个简单的图来概括flv文件格式,以结束本文档。
因此我就以ffmpeg中libavformat/flvenc.c为基础分析flv文件的构成,详细分析flv文件中每个字节的含义。以下每个方格代表一个字节。其中的数字都是16进制表示(省略0x),格中的字符也可以用相应的16进制数字替代,用字符表示有时候更为直观。假定flv文件同时含有视频和音频。
![](http://img0.ph.126.net/oy0r7JMfBa8d9CFqwDh-RA==/6598218756309269265.jpg)
接下来就是Metadata的具体数据,由两个AMF包组成。
![](http://img0.ph.126.net/LdO-zR6WkJmdGpLNIxtQGw==/3288753627987687690.jpg)
Metadata元素个数暂定为12个 = 音频5个 + 视频5个 + 2个(duration和filesize)。 后面还可能会加入其它元素,因此会返回来修改此值。metadata元素的顺序不固定,此处采用ffmpeg中的顺序。
第二个AMF包中各数组元素封装形式为:前两个字节是元素名称的长度;后面跟着长度为L的字符串;第L+3个字节表示元素值的类型;后面跟着是对应值,占用的字节数取决于值的类型。
![](http://img0.ph.126.net/RvJW3p9TmLprTCBOIdq85g==/830914131350014641.jpg)
![](http://img2.ph.126.net/Zfi8jw1Joj18yC4v-oY3Kw==/6597665701960617578.jpg)
![](http://img2.ph.126.net/cB14rzWrgHHhN4vWWNhclQ==/150307637663720813.jpg)
![](http://img1.ph.126.net/uUKrNL8awXgv1gcQu7LwEA==/4831236500361744583.jpg)
以下的(tag->key,tag->value)不一定在所有flv文件中出现,依据不同版本有所不同。
![](http://img2.ph.126.net/RmbgN7_SnvBDaqCJKeMJWw==/6598227552402310826.jpg)
![](http://img0.ph.126.net/DrquJzJN_6-PIWk4FcufDg==/3280309378686368058.png)
![](http://img0.ph.126.net/XrmGmS7u5TluqtK00wyU-A==/1616229316372859226.jpg)
Remark:以上将flv官方文档的metadata信息写入了Script Tag中。但是在做flv文件合成的时候,发现网上有的flv文件将keyframes信息隐藏在Script Tag中。后来通过网络查一些资料,发现keyframes几乎是一个非官方的标准,也就是民间标准。
两个常用的操作metadata的工具是flvtool2和FLVMDI, 都是把keyframes作为一个默认的元信息项目。在FLVMDI的主页(http://www.buraks.com/flvmdi/)上有描述:
keyframes: (Object) This object is added only if you specify the /k switch. 'keyframes' is known to FLVMDI and if /k switch is not specified, 'keyframes' object will be deleted.
'keyframes' object has 2 arrays: 'filepositions' and 'times'. Both arrays have the same number of elements, which is equal to the number of key frames in the FLV. Values in times array are in 'seconds'. Each correspond to the timestamp of the n'th key frame. Values in filepositions array are in 'bytes'. Each correspond to the fileposition of the nth key frame video tag (which starts with byte tag type 9).
也就是说keyframes中包含着2个内容 'filepositions' and 'times'分别指的是关键帧的文件位置和关键帧的PTS。通过keyframes可以建立起自己的Index,然后再seek和快进快退的操作中,快速有效的跳转到你想要找的关键帧位置进行处理。
![](http://img0.ph.126.net/J43AlALtDD4qNKAcfbfdEw==/6597677796588523983.jpg)
![](http://img2.ph.126.net/KePISLnMgWhbWwrz3J20Qw==/1921348191127162988.jpg)
![](http://img2.ph.126.net/HpuEhy5Iv-6NiKpC1p_AFw==/4849813848824697605.jpg)
![](http://img0.ph.126.net/NbBMTQDwe2kYbSbhW-f0og==/6597931783774539393.jpg)
![](http://img2.ph.126.net/W5UcRyNVtx-s1rVUnOUgkg==/2161164871284654827.jpg)
![](http://img1.ph.126.net/N5uAlqS8JngjjZmrdUlULw==/285978576438223393.jpg)
![](http://img2.ph.126.net/x6gP-Z15C4WeJaWggkJhqQ==/6597893300867568995.jpg)
![](http://img1.ph.126.net/lQ70XwSAcVEpyWL-5-yY3Q==/6597966968146633324.jpg)
到此为止已经介绍完flv文件格式,flv格式还是比较简单的,header部分很简洁,body部分都是由一个个tag组成,tag的话也就三种,脚本tag一般只有一个。最后用一个简单的图来概括flv文件格式,以结束本文档。
![](http://img2.ph.126.net/hH11q6CHb6WE8BuvglwpEQ==/2296272860105657762.jpg)
相关文章推荐
- FLV文件(H264 + AAC)格式超详细分析
- FLV文件(H264 + AAC)格式超详细分析
- FLV文件(H264 + AAC)格式超详细分析
- FLV文件(H264 + AAC)格式超详细分析
- mp4(H264容器)的详细文件格式分析 转自:http://blog.csdn.net/szu030606/article/details/5943279
- mp4(H264容器)的详细文件格式分析
- mp4(H264容器)的详细文件格式分析
- mp4(H264容器)的详细文件格式分析
- mp4(H264容器)的详细文件格式分析
- mp4(H264容器)的详细文件格式分析
- mp4(H264容器)的详细文件格式分析
- (详细格式)RTMP中FLV流到标准h264、aac的转换
- mp4(H264容器)的详细文件格式分析
- FLV文件格式分析
- .x file format 详细分析.x 文件格式
- Nutch爬虫工作流程及文件格式详细分析
- FLV文件格式分析
- (原)从mp4,flv文件中解析出h264和aac,送解码器解码失败
- flv文件格式分析FlvParse.exe
- Nutch爬虫工作流程及文件格式详细分析