FLV格式简介
FLV 是FLASH VIDEO的简称,FLV流媒体格式是随着Flash MX的推出发展而来的视频格式。由于它形成的文件极小、加载速度极快,使得网络观看视频文件成为可能,它的出现有效地解决了视频文件导入Flash后,使导出的SWF文件体积庞大,不能在网络上很好的使用等问题。
这里对我而言,需要知道的是FLB是一种复合格式,里面包含音频和视频,音频可以有它自己的编码方式,同样视频也可以有其自己的编码方式。
这里我制作了一个FLV格式的结构图, 如下:
其主要结构为:
Header + PreviousTagSize 0 + (Tag1 + Tag1's data + PreviousTagSize1) + ...... + (Tag n + Tag n's data + PreviousTagSize n).
这里的Header一般为9个字节。其结构如下:
typedef struct {
byte Signature[3]; // 第1-3字节为文件标识(Signature),总为“FLV”(0x46 0x4C 0x56)
byte Version; // 版本
byte Flags; // 第5个字节的前5位保留,必须为0。第6位表示是否存在音频Tag。第7位保留,必须为0。第8位表示是否存在视频Tag。
uint DataOffset; // 1. 从File Header开始到File Body开始的字节数,版本1中总为9。
// 2. 整个header的长度,一般为9;大于9表示下面还有扩展信息
// 3. DataOffset为Big-endian字序
} FLV_HEADER;
PreviousTagSize占用4个字节。
Tag一般占用11个字节,其结构如下:
typedef struct {
byte TagType; // 1byte: Tag类型(8:音频; 9:视频; 18:脚本; 其他:保留)
byte DataSize[3]; // 3byte: 数据区长度
byte Timestamp[3]; // 3byte: 时间戳: 整数,单位是毫秒。对于脚本型的tag总是0
uint Reserved; // 4byte: 时间戳扩展
// 1 bytes 将时间戳扩展为4bytes,代表高8位。很少用到
// StreamsID: 3 bytes 总是0
} FLV_TAG;
当我们读取了Tag后就可以知道Tag的data长度。
实例验证
我使用了一个red5.flv的文件,该文件里面只有视频结构,没有音频数据。其大小为27733 byte。
其调试信息如下:
Header Size: 9
PrevTagSize0 is: 4, value is: 0
Tag1 -- Size:11
Data1 -- Size: 159
PrevTagSize1 is: 4, value is: 170
Tag2 -- Size:11
Data2 -- Size: 16088
PrevTagSize2 is: 4, value is: 16099
Tag3 -- Size:11
Data3 -- Size: 1293
PrevTagSize3 is: 4, value is: 1304
Tag4 -- Size:11
Data4 -- Size: 1210
PrevTagSize4 is: 4, value is: 1221
Tag5 -- Size:11
Data5 -- Size: 1256
PrevTagSize5 is: 4, value is: 1267
Tag6 -- Size:11
Data6 -- Size: 701
PrevTagSize6 is: 4, value is: 712
Tag7 -- Size:11
Data7 -- Size: 596
PrevTagSize7 is: 4, value is: 607
Tag8 -- Size:11
Data8 -- Size: 400
PrevTagSize8 is: 4, value is: 411
Tag9 -- Size:11
Data9 -- Size: 560
PrevTagSize9 is: 4, value is: 571
Tag10 -- Size:11
Data10 -- Size: 686
PrevTagSize10 is: 4, value is: 697
Tag11 -- Size:11
Data11 -- Size: 994
PrevTagSize11 is: 4, value is: 1005
Tag12 -- Size:11
Data12 -- Size: 1010
PrevTagSize12 is: 4, value is: 1021
Tag13 -- Size:11
Data13 -- Size: 789
PrevTagSize13 is: 4, value is: 800
Tag14 -- Size:11
Data14 -- Size: 1768
PrevTagSize14 is: 4, value is: 1779
Total size is: 27733
参考
1. http://blog.sina.com.cn/s/blog_48f93b530100eyoe.html
2. http://wuyuans.com/2012/08/flv-format/
3. FLV封装格式分析器(程序+源代码)
http://download.csdn.net/detail/leixiaohua1020/6838805