flv文件分析

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)

实例

flv header

上图是以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 表示包的具体数据

实例

flv文件分析_第1张图片
flv first tag

如上图所示

  • 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 结构十分复杂,定义了很多格式类型,每个类型对应一种结构.

flv文件分析_第2张图片
ScriptData Value-1
flv文件分析_第3张图片
ScriptData Value-2

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

实例

flv文件分析_第4张图片
OnMetaData

如上图所示:

  • 02表示这个数据为string类型
  • 00 0a表示数据的长度为10(0x0a)
  • 接下来的10字节表示OnMetaData,这个数据总是出现在OnMetaData Tag的第一个data中
flv文件分析_第5张图片
SCRIPTDATASTRING

在读完OnMetaData这个数据后,接下来的数据是类型是ECMA ARRAY,如下图

ECMA ARRAY
  • 08表示这个数据为ECMA ARRAY
  • 0000 0010 表示ECMA ARRAY内包含的属性为16(0x10)个
flv文件分析_第6张图片
SCRIPTDATAECMAARRAY

接下来的数据则是SCRIPTDATAOBJECTPROPERTY数据对象,它包含流的一些属性,有一系列name和value组成。

SCRIPTDATAOBJECTPROPERTY

第一个属性是duration,它的长度为8字节(0008),names为6475 7261 7469 6f6e(duration),00表示这个属性为Number类型,它队形的数据值为Double:
40 62d3 7ced 9168 73(表示这个文件的时长)

属性

接着一次读剩余的属性值,直到遇到000 0009(SCRIPTDATAOBJECTEND,SCRIPTDATAECMAARRAY的终止符则表示OnMetaData数据处理完了)。

Video Tag

flv文件分析_第7张图片
VIDEODATA

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
flv文件分析_第8张图片
Video Tag header

接下来的70个字节为video tag的数据,1表示video的frame类型为keyframe,7表示编码ID为AVC

video tag data

现在知道这个video tag数据是AVC格式的数据,接着来分析一下AVCVIDEOPACKET。

flv文件分析_第9张图片
AVCVIDEOPACKET

下图是一个AVC data的头几个字节,00表示这个data是 AVC sequence header,00 0000表示CompositionTime。AVC sequence header格式说明参考H.264-AVC-ISO_IEC_14496-15.pdf。

avc data

你可能感兴趣的:(flv文件分析)