首页 > 视频编解码 > AVC > 将h.264视频流封装成flv格式文件(一.flv格式)
2015
01-19

将h.264视频流封装成flv格式文件(一.flv格式)

flv文件的格式其实网上资料还是不少,但是怎么封装成flv却不多。看了不少资料,找到了一个觉得还比较靠谱的:http://www.cnblogs.com/chef/archive/2012/07/18/2597279.html

其实flv还是挺简单的一个视频格式,下面就来先谈一谈FLV的格式吧。

FLV是一个二进制文件,简单来说,其是由一个文件头(FLV header)和很多tag组成(FLV body)。tag又可以分成三类:audio,video,script,分别代表音频流,视频流,脚本流,而每个tag又由tag header和tag data组成。

文件头由9bytes组成

 将h.264视频流封装成flv格式文件(一.flv格式) - 第1张  | 资料库吧

前3个bytes是文件类型,总是“FLV”,也就是(0x46 0x4C 0x56)。第4btye是版本号,目前一般是0x01。第5byte是流的信息,倒数第一bit是1表示有视频(0x01),倒数第三bit是1表示有音频(0x4),有视频又有音频就是0x01 | 0x04(0x05),其他都应该是0。最后4bytes表示FLV 头的长度,3+1+1+4 = 9。

将h.264视频流封装成flv格式文件(一.flv格式) - 第2张  | 资料库吧

FLV header后面就是FLV body,FLV body由若干个tag 组成。每一个tag第一部分是tag header,tag header长度为11bytes,但是每个tag header前面有4bytes记录着上一个tag的长度,此待会儿再说。tag header的第1个byte为记录着tag的类型,音频(0x8),视频(0x9),脚本(0x12);第2到4bytes是数据区的长度,也就是tag data的长度;再后面3个bytes是时间戳,单位是毫秒,类型为0x12则时间戳为0,时间戳控制着文件播放的速度,可以根据音视频的帧率类设置;时间戳后面一个byte是扩展时间戳,时间戳不够长的时候用;最后3bytes是streamID,但是总为0,再后面就是数据区了(tag data),也即是h264的裸流,tag header 长度为1+3+3+1+3=11。

将h.264视频流封装成flv格式文件(一.flv格式) - 第3张  | 资料库吧

0x12前面的00 00 00 00 就是刚刚说的记录着上一个tag的长度的4bytes,这里因为前面没有tag,所以为0。

tag data如果是音频数据,第一个byte记录audio信息:

前4bits表示音频格式(全部格式请看官方文档):

·0 — 未压缩

·1 — ADPCM

·2 — MP3

·4 — Nellymoser 16-kHz mono

·5 — Nellymoser 8-kHz mono

·10 — AAC

下面两个bits表示samplerate:

·0 — 5.5KHz

·1 — 11kHz

·2 — 22kHz

·3 — 44kHz

下面1bit表示采样长度:

·0 — snd8Bit

·1 — snd16Bit

下面1bit表示类型:

·0 — sndMomo

·1 — sndStereo

之后是数据。

如果是视频数据,第一个byte记录video信息:

前4bits表示类型:

·1– keyframe

·2 — inner frame

·3 — disposable inner frame (h.263 only)

·4 — generated keyframe

后4bits表示解码器ID:

·2 — seronson h.263

·3 — screen video

·4 — On2 VP6

·5 — On2 VP6 with alpha channel

·6 — Screen video version 2

·7 — AVC (h.264)

之后是数据。

将h.264视频流封装成flv格式文件(一.flv格式) - 第4张  | 资料库吧

 

 

 

如果是AAC和AVC的音视频,则在放入数据前有一个音频和视频的配置信息需要写入前两个tag,等会再说。之前说每个tag前面会有一个记录上个tag长度的4个bytes(previous tag size),整个的flv文件其实是:FLV header + previous tag size0 + tag1 + previous tag size1 + tag2 + previous tag size2 + … +tagN + previous tag sizeN。第一个previous tag size因为前面没有tag,所以为0,其他的总是记录着前面一个tag 长度(tag data size + tag header size)。

将h.264视频流封装成flv格式文件(一.flv格式) - 第5张  | 资料库吧

 

 

如果tag data是脚本数据,Script Tag Data,该类型Tag又通常被称为Metadata(元数据) Tag,会放一些关于FLV视频和音频的参数信息,如duration、width、height等。通常该类型Tag会跟在File Header后面作为第一个Tag出现,而且只有一个。一般来说,该Tag Data结构包含两个AMF包。AMF(Action Message Format)是Adobe设计的一种通用数据封装格式,在Adobe的很多产品中应用,简单来说,AMF将不同类型的数据用统一的格式来描述。第一个 AMF包封装字符串类型数据,用来装入一个“onMetaData”标志,这个标志与Adobe的一些API调用有,在此不细述。第二个AMF包封装一个数组类型,这个数组中包含了音视频信息项的名称和值。具体说明如下,大家可以参照图片上的数据进行理解。

第一个AMF包:

 第1个字节表示AMF包类型,一般总是0x02,表示字符串,其他值表示意义请查阅文档。

  第2-3个字节为UI16类型值,表示字符串的长度,一般总是0x000A(“onMetaData”长度)。

  后面字节为字符串数据,一般总为“onMetaData”。

第二个AMF包:

 第1个字节表示AMF包类型,一般总是0x08,表示数组。

  第2-5个字节为UI32类型值,表示数组元素的个数。

  后面即为各数组元素的封装,数组元素为元素名称和值组成的对。表示方法如下:

   第1-2个字节表示元素名称的长度,假设为L。

     后面跟着为长度为L的字符串。

     第L+3个字节表示元素值的类型。

   后面跟着为对应值,占用字节数取决于值的类型。

将h.264视频流封装成flv格式文件(一.flv格式) - 第6张  | 资料库吧

到此flv格式的解析就差不多了,如有写错的地方请指出。

 

附上一个网友写的flv的查看工具:http://download.csdn.net/detail/yeyumin89/4534822 将h.264视频流封装成flv格式文件(一.flv格式) - 第7张  | 资料库吧将h.264视频流封装成flv格式文件(一.flv格式) - 第8张  | 资料库吧

转自:http://blog.csdn.net/yeyumin89/article/details/7932368

打赏
最后编辑:
作者:admin
这个作者貌似有点懒,什么都没有留下。

留下一个回复

你的email不会被公开。