本来是没什么好说的,然而最近看完官方文档,发现之前特么解错了。所以也特别提出来说一下

位置

FLV [FLV头] [【这里】ScriptTag] [【这里】AudioTag1] [【这里】VideoTag1]…… [【这里】AudioTagN] [【这里】VideoTagN]


结构

含义
Reserved(预留) 2 bit 给FMS(Flash media server)预留的两位 始终为0
Filtered 1 bit 是否需要预处理,0 为不需要,1 为需要,主要用于加密过得流
TagType 5 bit 类型 8 = 音频, 9 = 视频, 18 = 信息
Datasize 3 Byte (24bit) 数据段长度,特别指出是从Stream ID之后开始算起。
TimeStamp 3 Byte (24bit) 时间戳,相对, 相对于开头的,第一个音视频Tag (一般为sequence header) 永远是0。
TimeStampExt 1 Byte (8bit) 扩展时间戳,表示的是最高位。
StreamID 3 Byte (24bit) 流ID,并没有什么乱用,一直是0,留着备用的吧大约~
注:FLV 头结束 (后面是datasize 包含的数据段,可是还是头啊哈哈哈)
音视频头 音视频头 音视频头
数据体 数据体 数据体

例子

1
2
3
4
5
6
7
8
9
10
11
09 0000 2b00 0000 0000 0000 // FLV Tag Header
~~ // 0000 1001 FMS 00,Filter 0(不加密),TagType 01001=9 视频
~~~~~~~ //数据区长度 43
~~ ~~~~ // 时间戳 0
~~ // 时间戳扩展 0
~~ ~~~~ // Stream ID 始终为 0
1700 0000 00 // 视频头
01 42c0 1fff e100 1667 42c0 1fda 0140 16e8 4000 //数据区
0003 005d cd65 0003 c60c a801 0005 68ce 3c80 00 //数据区
00 0000 36 // 整个Tag大小 54 应该等于 DataSize + 11 (43 + 11)

抽出来的刚好是个视频的 sequence header。就以后再说吧。

这里为毛今天说这个。是因为大部分的中文文档(抄来抄去) 写的多少都有点问题。

第一个 byte 不是 TagType ! 而是 FMS预留位 + 是否加密 + TagType。

刚好前两天听了个内存管理的分享,之所以凑整,是为了内存找齐。 加密流十分少见,因为消耗特别大,没毛病的不会加个密,但是不代表直接把第一个Byte 当做TagType就没毛病。(自己查下用的开源代码,是否有这个问题。)

相对时间戳!

TimeStamp是相对时间戳。4294967296 毫秒 = 1193 小时 = 49天
恩 50天就溢出了。。。难道Hello女神的49天直播是防止溢出?