FLV头
FLV头包含以下字段
Field Type Comment
Signature UI8 Signature byte always 'F' (0x46)
Signature UI8 Signature byte always 'L' (0x4C)
Signature UI8 Signature byte always 'V' (0x56)
Version UI8 File version (for example, 0x01 for FLV
version 1)
TypeFlagsReserved UB[5] Must be 0
TypeFlagsAudio UB[1] Audio tags are present
TypeFlagsReserved UB[1] Must be 0
TypeFlagsVideo UB[1] Video tags are present
DataOffset UI32 Offset in bytes from start of file to start of body (that is, size of header version 1 always is 9)
实例
上图是以16进制显示一个flv文件:
- 464c56 表示"FLV"
- 01表示 FLV的版本号
- 05的二进制为00000101,表示这个flv包含音频包和数据包
- 00000009表示flv包体的偏移量为9个字节
FLV包体
FLV的包体是有一个一个的tag组成的:
FLV Body = tag0 size + tag1 + tag1 size + ...... + tagN + tagN size
tag的结构为:
tag type | DataSize | Timestamp | TimestampExtended | StreamID | Data |
---|---|---|---|---|---|
8bit | 24bit | 24bit | 8 bit | 24bit |
- tag type表示这个tag的类型
- 8:audio
- 9:video
- 18: script data
其它的值保留。 - data size 表示数据包的大小
- timestamp和timestampExtended表示这个包的时间错
- StreamID永远为0
- Data 表示包的具体数据
实例
如上图所示
- 12表示这个tag是 script data(flv的第一个永远是onMetaData)
- 0001 66 表示这个tag数据的大小
- 00 0000 00 表示 timestamp和timestampExtended
- 接下来的0x166(358)个字节数据为tag data数据,0009是tag data的结束
Tag 类型
ScriptData Tag
如果TAG包中的TagType==18时,就表示这个TAG是SCRIPT.
SCRIPTDATA 结构十分复杂,定义了很多格式类型,每个类型对应一种结构.
onMetaData
onMetaData是一种ScriptData,包含流的许多属性,通用的属性有:
- duration: double
- width: double
- height: double
- videodatarate:double
- framerate:double
- videocodecid:double
- audiosamplerate:double
- audiosamplesize:double
- stereo: bool
- audiocodecid:double
- datasize:double
- onMetaData:
- lasttimestamp
- totalframes
- hasAudio
- hasVideo
- hasCuePoints
- hasMetadata
- hasKeyframes
实例
如上图所示:
- 02表示这个数据为string类型
- 00 0a表示数据的长度为10(0x0a)
- 接下来的10字节表示OnMetaData,这个数据总是出现在OnMetaData Tag的第一个data中
在读完OnMetaData这个数据后,接下来的数据是类型是ECMA ARRAY,如下图
- 08表示这个数据为ECMA ARRAY
- 0000 0010 表示ECMA ARRAY内包含的属性为16(0x10)个
接下来的数据则是SCRIPTDATAOBJECTPROPERTY数据对象,它包含流的一些属性,有一系列name和value组成。
第一个属性是duration,它的长度为8字节(0008),names为6475 7261 7469 6f6e(duration),00表示这个属性为Number类型,它队形的数据值为Double:
40 62d3 7ced 9168 73(表示这个文件的时长)
接着一次读剩余的属性值,直到遇到000 0009(SCRIPTDATAOBJECTEND,SCRIPTDATAECMAARRAY的终止符则表示OnMetaData数据处理完了)。
Video Tag
OnMetaData的下一个tag为Video tag,具体数据如下图:
- 00 0009 OnMetaData的结束标志
- 0000 0171 上一个tag的长度
- 09 表示这个tag为video tag
- 00 0046 这个tag data的大小
- 0000 0000 tag的Timestamp和TimestampExtended
- 0000 00 StreamID,总是0
接下来的70个字节为video tag的数据,1表示video的frame类型为keyframe,7表示编码ID为AVC
现在知道这个video tag数据是AVC格式的数据,接着来分析一下AVCVIDEOPACKET。
下图是一个AVC data的头几个字节,00表示这个data是 AVC sequence header,00 0000表示CompositionTime。AVC sequence header格式说明参考H.264-AVC-ISO_IEC_14496-15.pdf。