美文网首页
flv文件分析

flv文件分析

作者: 无言aaa | 来源:发表于2017-04-12 15:36 被阅读0次

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

    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

    如上图所示:

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

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

    ECMA ARRAY
    • 08表示这个数据为ECMA ARRAY
    • 0000 0010 表示ECMA ARRAY内包含的属性为16(0x10)个
    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,具体数据如下图:

    • 00 0009 OnMetaData的结束标志
    • 0000 0171 上一个tag的长度
    • 09 表示这个tag为video tag
    • 00 0046 这个tag data的大小
    • 0000 0000 tag的Timestamp和TimestampExtended
    • 0000 00 StreamID,总是0
    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

    相关文章

      网友评论

          本文标题:flv文件分析

          本文链接:https://www.haomeiwen.com/subject/gueuattx.html