flv文件分析

2017-04-12  本文已影响0人  无言aaa

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文件:

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

实例

flv first tag

如上图所示

Tag 类型

ScriptData Tag

如果TAG包中的TagType==18时,就表示这个TAG是SCRIPT.
SCRIPTDATA 结构十分复杂,定义了很多格式类型,每个类型对应一种结构.

ScriptData Value-1 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

实例

OnMetaData

如上图所示:

SCRIPTDATASTRING

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

ECMA ARRAY 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

VIDEODATA

OnMetaData的下一个tag为Video tag,具体数据如下图:

Video Tag header

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

video tag data

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

AVCVIDEOPACKET

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

avc data
上一篇下一篇

猜你喜欢

热点阅读