美文网首页
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文件分析

    FLV头 FLV头包含以下字段 实例 上图是以16进制显示一个flv文件: 464c56 表示"FLV" 01表示...

  • FLV文件(H264,AAC)格式分析

    FLV 文件 = File Header(FLV 文件头)+ File Body(FLV 文件体)。其中文件体又由...

  • flv文件结构分析

    flv文件分flv header,后面是 previous tag size , tagflv header主要字...

  • ffmpeg之ffprobe使用

    多年的音视频开发过程中,对于音视频文件的分析先后用过许多的工具: Flv Flv解析工具:FlvParse.exe...

  • FFmpeg转封装(3)

    FLV在FFmpeg中的Muxer 查看FLV文件的Muxer信息 转FLV 生成带关键索引的FLV ffprob...

  • FLV格式解析

    FLV是一个二进制文件,简单来说,其是由一个文件头(FLV header)和很多tag组成(FLV body)。 ...

  • Flv文件格式解析

    Flv文件解析 Flv文件分为header和body两个部分 Header Body TAG TAG_DATA S...

  • js框架或者库

    使用 flv.js 做直播 flv.js 是来自 Bilibli 的开源项目。它解析 FLV 文件喂给原生 HTM...

  • 使用ffmpeg进行推流实现

    本文主要是记录如何使用ffmpeg进行推流。 本文使用本地的flv视频文件,然后使用ffmpeg读取flv文件的每...

  • flv文件格式介绍

    目录 概述 flv文件主体结构 Tag介绍 开源的解析软件 参考阅读 1. 概述 flv(Flash Video)...

网友评论

      本文标题:flv文件分析

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