精华内容
下载资源
问答
  • FLV格式详解

    2020-07-30 20:09:51
  • flv格式详解

    2020-04-06 14:45:45
    FLV(Flash Video)是现在非常流行的流媒体格式,由于其视频文件体积轻巧、封装播放简单等特点,使其很适合在网络上进行应用,目前主流的视频网站很多都是使用了FLV格式。 另外RTMP和FLV格式有着友好的兼容性,在...

    FLV简介

    FLV(Flash Video)是现在非常流行的流媒体格式,由于其视频文件体积轻巧、封装播放简单等特点,使其很适合在网络上进行应用,目前主流的视频网站很多都是使用了FLV格式。

    另外RTMP和FLV格式有着友好的兼容性,在使用RTMP进行推流时,RTMP Packet中封装的音视频数据流,其实和FLV/tag封装音频和视频数据的方式是相同的。

    FLV格式解析

    首先我们来看一张图:
    flv格式

    FLV封装格式是由一个文件头(flie header)和 文件体(file Body)组成。其中,FLV body由一对对的(Previous Tag Size字段 + tag)组成。

    Previous Tag Size字段 排列在Tag之前,占用4个字节。Previous Tag Size记录了前面一个Tag的大小,用于逆向读取处理。

    FLV header后的第一个Pervious Tag Size的值为0。

    Tag一般可以分为3种类型:脚本(帧)数据类型、音频数据类型、视频数据。FLV数据以大端序进行存储。

    我们通过一张图看下FLV的具体文件结构:
    FLV文件的详细内容结构

    • FLV header

    FLV头占9个字节,用来标识文件为FLV类型,以及后续存储的音视频流。

    FLV头由一下几部分组成:

    1、 Signature(3 Byte)+Version(1 Byte)+Flags(1 Bypte)+DataOffset(4 Byte) 总共9个字节。

    signature 占3个字节 固定FLV三个字符作为标示。一般发现前三个字符为FLV时就认为他是flv文件。二进制查看器中就是0x46 0x4C 0x56,代表FLV。

    Version 占1个字节 标示FLV的版本号。一般是1。

    Flags 占1个字节 内容标示。第0位和第2位,分别表示 video 与 audio 存在的情况.(1表示存在,0表示不存在)。比如tag是0x05,也就是二进制的00000101,代表既有视频,也有音频。

    DataOffset 4个字节 表示FLV的header长度。目前第一版是9。

    • FLV Body

    FLV的body部分是一系列的back-pointers+tag构成的。其中Back-pointer表示Previous Tag Size(前一个tag的字节数据长度),占4个字节。

    tag分三种类型:video(视频),audio(音频),scripts(脚本数据)。

    • FLV Tag

    每一个Tag也是由两部分组成:tag header 和 tag data。
    Tag Header里存放的是当前tag的类型、数据区(tag data)的长度等信息。tag header一般占11个字节的内存空间。

    具体内容如下:
    1、 type 1个字节。8为Audio,9为Video,18为scripts。(8、9、18这些是使用type转换成十进制的结果)

    2、 tag data size 3个字节。表示tag data的长度。从streamd id 后算起。

    3、 Timestreamp 3个字节。时间戳。

    4、 TimestampExtended 1个字节。时间戳扩展字段。

    5、 stream id 3个字节。总是0。

    • Script Tag Data结构(脚本类型、帧类型)

    该类型Tag又被称为MetaData Tag,存放一些关于FLV视频和音频的元信息,
    比如:duration、width、height等。通常该类型Tag会作为FLV文件的第一个tag,并且只有一个,通常都是跟在FLV Header后。

    该类型的Tag Data一般分为两个AMF包:

    AMF(Action Message Format)是Adobe设计的一种通用数据封装格式,简单来说,AMF将不同类型的数据用统一的格式来描述。

    第一个AMF包:
    第1个字节表示AMF包类型,一般总是0x02,表示字符串。第2-3个字节为标识字符串的长度,一般总是0x000A(“onMetaData”长度)。后面字节为具体的字符串,一般总为“onMetaData”(6F,6E,4D,65,74,61,44,61,74,61)。

    第二个AMF包:
    第1个字节表示AMF包类型,一般总是0x08,表示数组。第2-5个字节为UI32类型值,表示数组元素的个数。后面即为各数组元素的封装,数组元素为元素名称和值组成的对。常见的数组元素如下表所示:

    含义
    duration 时长
    width 视频宽度
    heiht 视频高度
    video data rate 视频码率
    frame rate 视频帧率
    video codec id 视频编码方式
    audio sample rate 音频采样率
    audio sample size 音频采样精度
    stereo 是否为立体声
    audio codec id 音频编码方式
    filesize 文件大小

    这就是脚本类型数据的组成部分。

    • Audio Tag Data结构(音频类型)

    音频Tag Data区域开始的第一个字节包含了音频数据的参数信息,从第二个字节开始为音频流数据。

    其中第一个字节的1到4为代表的是音频格式:

    转换成十进制后的值 代表的格式
    0 Linear PCM
    1 ADPCM
    2 MP3
    3 Linear PCM, little endian
    4 Nellymoser 16-kHz mono
    5 Nellymoser 8-kHz mono
    6 Nellymoser
    7 G.711 A-law logarithmic PCM
    8 G.711 mu-law logarithmic PCM
    9 reserved
    10 AAC
    11 Speex
    14 MP3 8-Khz
    15 Device-specific sound

    接着2位为采样率(对于AAC总是3):

    类型
    0 5.5-kHz
    1 11-kHz
    2 22-kHz
    3 44-kHz

    接着1位为采样的长度(压缩过的音视频都是16bit):

    类型
    0 snd8Bit
    1 snd16Bit

    最后1位为音频类型(对于AAC总是1):

    类型
    0 sndMono
    1 sndStereo

    从第二个字节开始的就是音频数据了。

    • video Tag Data结构(视频类型)

    视频Tag Data和音频Tag Data一样,开始的第一个字节包含视频数据的参数信息,从第二个字节开始为视频流数据。

    第一字节的前四位表示的是帧类型,值如下:

    1: keyframe (for AVC, a seekable frame)——h264的IDR,关键帧,可重入帧。
    2: inter frame (for AVC, a non- seekable frame)——h264的普通帧。
    3: disposable inter frame (H.263 only)
    4: generated keyframe (reserved for server use only)
    5: video info/command frame

    第一个字节的后四位表示的是编码id,值如下

    1: JPEG (currently unused)
    2: Sorenson H.263
    3: Screen video
    4: On2 VP6
    5: On2 VP6 with alpha channel
    6: Screen video version 2
    7: AVC

    第二个字节开始为视频数据。

    结束

    对于FLV的格式介绍就到此结束了,为了加深对FLV格式的理解,建议使用十六进制查看器打开一个flv文件,对照文章进行转换学习。

    展开全文
  • flv格式详解+实例剖析

    2020-11-19 14:42:05
    flv格式详解+实例剖析 (转载自https://www.cnblogs.com/lidabo/p/9018548.html) 简介 FLV(Flash Video)是现在非常流行的流媒体格式,由于其视频文件体积轻巧、封装播放简单等特点,使其很适合在网络上进行应用...

    简介

    FLV(Flash Video)是现在非常流行的流媒体格式,由于其视频文件体积轻巧、封装播放简单等特点,使其很适合在网络上进行应用,目前主流的视频网站无一例外地使用了FLV格式。另外由于当前浏览器与Flash Player紧密的结合,使得网页播放FLV视频轻而易举,也是FLV流行的原因之一。

    FLV是流媒体封装格式,我们可以将其数据看为二进制字节流。总体上看,FLV包括文件头(File Header)和文件体(File Body)两部分,其中文件体由一系列的Tag及Tag Size对组成。

     

     

    flv.jpg

    FLV格式解析

    先来一张图,这是《东风破》——周杰伦(下载)的一个MV视频。我使用的是Binary Viewer的二进制查看工具。

     

    1.png

     

    header

    头部分由一下几部分组成
    Signature(3 Byte)+Version(1 Byte)+Flags(1 Bypte)+DataOffset(4 Byte)

    • signature 占3个字节
      固定FLV三个字符作为标示。一般发现前三个字符为FLV时就认为他是flv文件。
    • Version 占1个字节
      标示FLV的版本号。这里我们看到是1
    • Flags 占1个字节
      内容标示。第0位和第2位,分别表示 video 与 audio 存在的情况.(1表示存在,0表示不存在)。截图看到是0x05,也就是00000101,代表既有视频,也有音频。
    • DataOffset 4个字节
      表示FLV的header长度。这里可以看到固定是9

    body

    FLV的body部分是由一系列的back-pointers + tag构成

    • back-pointers 固定4个字节,表示前一个tag的size。
    • tag 分三种类型,video、audio、scripts。

    tag组成

    tag type+tag data size+Timestamp+TimestampExtended+stream idtag data

    • type 1个字节。8为Audio,9为Video,18为scripts
    • tag data size 3个字节。表示tag data的长度。从streamd id 后算起。
    • Timestreamp 3个字节。时间戳
    • TimestampExtended 1个字节。时间戳扩展字段
    • stream id 3个字节。总是0
    • tag data 数据部分

    我们根据实例来分析:
    看到第一个TAG
    type=0x12=18。这里应该是一个scripts。
    size=0x000125=293。长度为293。
    timestreamp=0x000000。这里是scripts,所以为0
    TimestampExtended =0x00
    stream id =0x000000
    我们看一下TAG的data部分:

     

    3.png

     

    tag的划分

    图中红色部分是我标出的两个back-pointers,都是4个字节。而中间就是第一个TAG。那是怎么计算的呢?我们就以这个做个示例。

    • 首先第一个back-pointers是0x00000000,那是因为后面是第一个TAG。所以他为0。
    • 然后根据我们我们前面格式获取到size是0x000125。也就是说从stream id后面再加上293个字节就到了第一个TAG的末尾,我们数一下一下。stream id以前总共有24个字节。那么到第一个TAG结束,总共有293+24=137=0x13D
    • 接下来我们找到0x13D的地址,从工具上很容易找到,正好就是红色下划线的前面。红色部分是0x00000130=304,这代表的是上一个TAG的大小。
    • 最后我们计算一下,上一个TAG数据部分是293个字节,前面type、stream id等字段占了11个字节。正好是匹配的。

    上面我们已经知道了怎么取划分每个TAG。接下来我们就看TAG的具体内容

    tag的内容

    前面已经提到tag分3种。我们一个个看

    script

    脚本Tag一般只有一个,是flv的第一个Tag,用于存放flv的信息,比如duration、audiodatarate、creator、width等。
    首先介绍下脚本的数据类型。所有数据都是以数据类型+(数据长度)+数据的格式出现的,数据类型占1byte,数据长度看数据类型是否存在,后面才是数据。
    一般来说,该Tag Data结构包含两个AMF包。AMF(Action Message Format)是Adobe设计的一种通用数据封装格式,在Adobe的很多产品中应用,简单来说,AMF将不同类型的数据用统一的格式来描述。第一个AMF包封装字符串类型数据,用来装入一个“onMetaData”标志,这个标志与Adobe的一些API调用有,在此不细述。第二个AMF包封装一个数组类型,这个数组中包含了音视频信息项的名称和值。具体说明如下,大家可以参照图片上的数据进行理解。

    类型 说明
    0 Number type 8 Bypte Double
    1 Boolean type 1 Bypte bool
    2 String type 后面2个字节为长度
    3 Object type  
    4 MovieClip type  
    5 Null type  
    6 Undefined type  
    7 Reference type  
    8 ECMA array type 数组,类似Map
    10 Strict array type  
    11 Date type  
    12 Long string type 后面4个字节为长度

     

    4.png

     

    上图为第一个AMF包

    • type=0x02对应String
    • size=0A=10
    • value=onMetaData 正好是10个字节。

       

       

      5.png

       

      上图为第二个AMF

    • type=0x08 对应ECMA array type。

    表示数组,类似Map。后面4个字节为数组的个数。然后是键值对,第一个为键,2个字节为长度。后面跟具体的内容。接着3个字节表示值的类型,然后根据类型判断长度。
    上图我们可以判断,总共有13个键值对。
    第一个长度为8个字节是duration。值类型是0x004073,第一个字节是00,所以是double,8个字节。
    第二个长度5个字节是width。值也是double类型,8个字节。
    依次解析下去...

    到处,我们已经知道了如何解析FLV中Tag为script的数据。

    video

     

     

    6.png


    type=0x09=9。这里应该是一个video。
    size=0x000030=48。长度为48。
    timestreamp=0x000000
    TimestampExtended =0x00
    stream id =0x000000
    我们看到数据部分:
    视频信息+数据

     

    视频信息,1个字节。

    前4位为帧类型Frame Type

    类型
    1 keyframe (for AVC, a seekable frame) 关键帧
    2 inter frame (for AVC, a non-seekable frame)
    3 disposable inter frame (H.263 only)
    4 generated keyframe (reserved for server use only)
    5 video info/command frame

    后4位为编码ID (CodecID)

    类型
    1 JPEG (currently unused)
    2 Sorenson H.263
    3 Screen video
    4 On2 VP6
    5 On2 VP6 with alpha channel
    6 Screen video version 2
    7 AVC

    特殊情况

    视频的格式(CodecID)是AVC(H.264)的话,VideoTagHeader会多出4个字节的信息,AVCPacketType 和CompositionTime。

    • AVCPacketType 占1个字节
    类型
    0 AVCDecoderConfigurationRecord(AVC sequence header)
    1 AVC NALU
    2 AVC end of sequence (lower level NALU sequence ender is not required or supported)

    AVCDecoderConfigurationRecord.包含着是H.264解码相关比较重要的spspps信息,再给AVC解码器送数据流之前一定要把sps和pps信息送出,否则的话解码器不能正常解码。而且在解码器stop之后再次start之前,如seek、快进快退状态切换等,都需要重新送一遍sps和pps的信息.AVCDecoderConfigurationRecord在FLV文件中一般情况也是出现1次,也就是第一个video tag.

    • CompositionTime 占3个字节
    条件
    AVCPacketType ==1 Composition time offset
    AVCPacketType !=1 0

    我们看第一个video tag,也就是前面那张图。我们看到AVCPacketType =0。而后面三个字节也是0。说明这个tag记录的是AVCDecoderConfigurationRecord。包含sps和pps数据。
    再看到第二个video tag

     

     

    8.png


    我们看到 AVCPacketType =1,而后面三个字节为000043。这是一个视频帧数据。

     

    解析到的数据完全符合上面的理论。

    sps pps

    前面我们提到第一个video 一般存放的是sps和pps。这里我们具体解析下sps和pps内容。先看下存储的格式(图6):
    0x01+sps[1]+sps[2]+sps[3]+0xFF+0xE1+sps size+sps+01+pps size+pps
    我们看到图7 。
    sps[1]=0x64
    sps[2]=00
    sps[3]=0D
    sps size=0x001B=27
    跳过27个字节后,是0x01
    pps size=0x0005=118
    跳过5个字节,就到了back-pointers。

    视频帧数据

    解析出sps和pps tag后,后面的video tag就是真正的视频数据内容了

     

    9.png


    这是第二个video tag其实和图8一样,只是我圈出来关键信息。先看下格式
    frametype=0x17=00010111
    AVCPacketType =1
    Composition Time=0x000043
    后面就是NALU DATA

     

    Audio

    与视频格式类似
    前4位为音频格式

    类型
    0 Linear PCM, platform endian
    1 ADPCM
    2 MP3
    3 Linear PCM, little endian
    4 Nellymoser 16-kHz mono
    5 Nellymoser 8-kHz mono
    6 Nellymoser
    7 G.711 A-law logarithmic PCM
    8 G.711 mu-law logarithmic PCM
    9 reserved
    10 AAC
    11 Speex
    14 MP3 8-Khz
    15 Device-specific sound

    接着2位为采样率

    类型
    0 5.5-kHz
    1 11-kHz
    2 22-kHz
    3 44-kHz

    对于AAC总是3

    接着1位为采样的长度

    类型
    0 snd8Bit
    1 snd16Bit

    压缩过的音频都是16bit

    接着1位为音频类型

    类型
    0 sndMono
    1 sndStereo

    对于AAC总是1

    我们看到第三个TAG

     

    7.png

    展开全文
  • 通过RTMP play分析FLV格式详解

    千次阅读 2016-08-12 11:07:51
    通过RTMP play分析FLV格式详解 最近做了一个rtmp中转服务程序,通过实践,熟悉rtmp play和push中各类格式,这里总结一下。

    最近做了一个rtmp中转服务程序,通过实践,熟悉rtmp play和push中各类格式,这里总结一下。

    程序github地址: https://github.com/runner365/rtmp_relay

    rtmp play接收报文分析

    第一帧收到的报文:

     

    1) 0x46 4c 56:可参考文后:参考一

    字符FLV头

    2) 0x01 05 

    Version TypeFlagsReserved TypeFlagsAudio TypeFlagsReserved TypeFlagsVideo

    这个解析的时候,一般不用管

    3)0x00 00 00 09

    FLV header offset: 也就是从开头9字节后,才是FLV真正的报文头。

    4)0x00 00 00 00 

    这个是第1帧的PreviousTagSize0(前帧长度),因为是第一帧,所以肯定是0;

    5)0x08 可参考文后:参考二,参考三

    帧开头第一字节:0x08表示音频,0x09表示视频

    6)0x00 00 04

    帧payload长度:因为音频第一帧是ASC,所以只有4字节。

    7) 0x 00 00 00 00

    timestamp,时间戳

    8) 0x 00 00 00

    streamid,流ID

    9) 0x AF 00 13 90

    音频payload: 0xaf00开头的后面是asc flag, 0xaf01开头的后面是真正的音频数据

    0x13 90,也就是0b0001 0011 1001 0000, 

    ASC flag格式:xxxx xyyy yzzz z000

    x字符: aac type,类型2表示AAC-LC,5是SBR, 29是ps,5和29比较特殊ascflag的长度会变成4;

    y字符:  sample rate, 采样率, 7表示22050采样率

    z字符:  通道数,2是双通道

    10) 0x 00 00 00 0F

    这个还是PreviousTagSize1,上一帧长度15bytes

    11) 0x09 视频类型,新的一帧

    12)0x00 00 22

    视频帧payload长度

    13) 0x00 00 0a 00 

    时间戳:这个地方有个大坑,顺序是:a[3] a[0] a[1] a[2],最后一位是最高位。

    14) 0x00 00 00

    streamid, 流id。

    15) 0x 17 00 

    视频帧开头2字节:

    0x17 00: 表示内容是SPS和PPS

    0x17 01: 表示内容是I-FRAME

    0x27:      表示内容是P-FRAME

    16) 

    0000002bh: 17 00 00 00 00 01 42 C0 1F FF E1 00 0E 67 42 C0 ; ......B??.gB?
    0000003bh: 1F 8C 8D 40 F0 28 90 0F 08 84 6A 01 00 04 68 CE ; .實@??.刯...h?
    0000004bh: 3C 80 ; <€

    第12, 13字节: 0x00 0E是spslen,也就是14字节长度

    跳过14字节后,0x01是pps开始的标识,跳过它。

    0x00 04是ppslen,也就是4个字节,最后0x68 ce 3c 80就是pps。

     

    参考:

    1, The FLV header

      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] Shall be 0
    TypeFlagsAudio UB [1] 1 = Audio tags are present
    TypeFlagsReserved UB [1] Shall be 0
    TypeFlagsVideo UB [1] 1 = Video tags are present
    DataOffset UI32 The length of this header in bytes

    Signature: FLV 文件的前3个字节为固定的‘F’‘L’‘V’,用来标识这个文件是flv格式的.在做格式探测的时候,

    如果发现前3个字节为“FLV”,就认为它是flv文件.

    Version: 第4个字节表示flv版本号.

    Flags: 第5个字节中的第0位和第2位,分别表示 video 与 audio 存在的情况.(1表示存在,0表示不存在)

    DataOffset : 最后4个字节表示FLV header 长度.

    2,FLV body整体

    Field Type Comment
    PreviousTagSize0 UI32 Always 0
    Tag1 FLVTAG First tag
    PreviousTagSize1 UI32

    Size of previous tag, including its header, in bytes. For FLV version1,

    this value is 11 plus the DataSize of the previous tag.

    Tag2 FLVTAG Second tag
    ... ... ...
    PreviousTagSizeN-1 UI32 Size of second-to-last tag, including its header, in bytes.
    TagN FLVTAG Last tag
    PreviousTagSizeN UI32 Size of last tag, including its header, in bytes

    FLV header之后,就是 FLV File Body.

    FLV File Body是由一连串的back-pointers + tags构成.back-pointers就是4个字节数据,表示前一个tag的size.

    3,FLV body细节

     

    Field Type Comment
    Reserved UB [2] Reserved for FMS, should be 0
    Filter UB [1] Indicates if packets are filtered.
    0 = No pre-processing required.
    1 = Pre-processing (such as decryption) of the packet is
    required before it can be rendered.
    Shall be 0 in unencrypted files, and 1 for encrypted tags.
    See Annex F. FLV Encryption for the use of filters.
    TagType UB [5]

    Type of contents in this tag. The following types are
    defined:
    8 = audio
    9 = video
    18 = script data

    DataSize UI24 Length of the message. Number of bytes after StreamID to
    end of tag (Equal to length of the tag – 11)
    Timestamp UI24 Time in milliseconds at which the data in this tag applies.
    This value is relative to the first tag in the FLV file, which
    always has a timestamp of 0.
    TimestampExtended UI8 Extension of the Timestamp field to form a SI32 value. This
    field represents the upper 8 bits, while the previous
    Timestamp field represents the lower 24 bits of the time in
    milliseconds.
    StreamID UI24 Always 0.
    AudioTagHeader IF TagType == 8
    AudioTagHeader
     
    VideoTagHeader IF TagType == 9
    VideoTagHeader
     
    EncryptionHeader IF Filter == 1
    EncryptionTagHeader
     
    FilterParams IF Filter == 1
    FilterParams
     
    Data IF TagType == 8
    AUDIODATA
    IF TagType == 9
    VIDEODATA
    IF TagType == 18
    SCRIPTDATA
    Data specific for each media t
    展开全文
  • FLV格式概述: FLV(Flash Video)是Adobe公司设计开发的一种流行的流媒体格式,由于其视频文件体积轻巧、封装简单等特点,使其很适合在互联网上进行应用。此外,FLV可以使用Flash Player进行播放,而Flash Player...
  • 视频FLV格式详解

    2011-08-09 15:02:00
    FLV视频格式的定义 FLV 是FLASH VIDEO的简称,FLV流媒体格式是一种新的视频格式,全称为Flash Video。由于它形成的文件极小、加载速度极快,使得网络观看视频文件成为可能,它的出现有效地解决了视频文件导入...
  • flv格式详解+实例剖析 简介 FLV(Flash Video)是现在非常流行的流媒体格式,由于其视频文件体积轻巧、封装播放简单等特点,使其很适合在网络上进行应用,目前主流的视频网站无一例外地使用了FLV格式。另外由于...
  • 一、FLV文件格式 FLV包括文件头(File Header)和文件体(File Body)两部分。文件结构如图所示: 二、FLV文件头 header部分记录了flv的类型、版本等信息,是flv的开头,一般都差不多,占9bytes。具体格式...
  • Video Tag视频Tag:该Tag类型封装真实的视频裸数据,虽然支持H263、H264等编码类型的视频,但是现在主流还是H264,所以下面会重点分析如何将H264视频帧打进Flv方法。Flv Parse 解析的结果如下:previous tag1:十六...
  • FLV文件格式详解

    千次阅读 2019-06-13 16:15:08
    Flash Video(简称FLV),是一种流行的网络格式。目前国内外大部分视频分享网站都是采用的这种格式. 一、File Structure 从整个文件上开看,FLV是由The FLV header和The FLV File Body组成. 1、The FLV header ...
  • flv 文件格式详解

    2019-12-13 16:53:36
    flv容器的扩展名是.flv 是邮adobe推出的一种封装格式,主要用于流媒体系统,由于flash player的普遍使用,flv的容器也比较流行。 flv的封装格式比较简单,由一个header和body构成。 其官方文档地址为: ...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 186
精华内容 74
关键字:

flv格式详解