FLV格式分析

FLV格式分析


目录

  1. FVL概述
  2. 框架解析图
  3. FLV Header
  4. FLV Body

博客推荐(感觉直接看这篇就可以了,我的算是补充):flv格式详解+实例剖析


1. FVL概述

  1. FLV(Flash Video)是Adobe公司推出的⼀种流媒体格式,由于其封装后的⾳视频⽂件体积⼩、封装简单等特点,⾮常适合于互联⽹上使⽤。⽬前主流的视频⽹站基本都⽀持FLV。采⽤FLV格式封装的⽂件后缀为.flv。
  2. FLV封装格式是由⼀个⽂件头(file header)和 ⽂件体(file Body)组成。
  3. FLV body由⼀对对的(Previous Tag Size字段 + tag)组成。Previous Tag Size字段排列在Tag之前,占⽤4个字节。Previous Tag Size记录了前⾯⼀个Tag的⼤⼩,⽤于逆向读取处理。FLV header后的第⼀个Pervious Tag Size的值为0。
  4. Tag⼀般可以分为3种类型:脚本(帧)数据类型、⾳频数据类型、视频数据类型。FLV数据以⼤端序进⾏存储,在解析时需要注意。
  5. ⼀个标准FLV⽂件结构如下图:
    在这里插入图片描述
  6. FLV⽂件的详细内容结构如下图:
    在这里插入图片描述

2. 框架解析图

在这里插入图片描述


3. FLV Header

  1. 注:在下⾯的数据type中,UI表示⽆符号整形,后⾯跟的数字表示其⻓度是多少位。⽐如UI8,表示⽆符号整形,⻓度⼀个字节。UI24是三个字节,UI[8*n]表示多个字节。UB表示位域,UB5表示⼀个字节的5位。可以参考c中的位域结构体。
  2. FLV头占9个字节,⽤来标识⽂件为FLV类型,以及后续存储的⾳视频流。⼀个FLV⽂件,每种类型的tag都属于⼀个流,也就是⼀个flv⽂件最多只有⼀个⾳频流,⼀个视频流,不存在多个独⽴的⾳视频流在⼀个⽂件的情况。

1. FLV头的结构如下:

在这里插入图片描述


4. FLV Body

  1. FLV Header之后,就是FLV File Body。FLV File Body是由⼀连串的back-pointers + tags构成。Back-pointer表示Previous Tag Size(前⼀个tag的字节数据⻓度),占4个字节。
    在这里插入图片描述

1. FLV Tag

  1. 每⼀个Tag也是由两部分组成:tag header和tag data。Tag Header⾥存放的是当前tag的类型、数据区(tag data)的⻓度等信息。
1. tag header
  1. tag header⼀般占11个字节的内存空间。FLV tag结构如下:
    在这里插入图片描述
  2. 注意:
  3. flv⽂件中Timestamp和TimestampExtended拼出来的是dts。也就是解码时间。Timestamp和TimestampExtended拼出来dts单位为ms。(如果不存在B帧,当然dts等于pts)
  4. CompositionTime 表示PTS相对于DTS的偏移值, 在每个视频tag的第14~16字节 。显示时间(pts) = 解码时间(tag的第5~8字节) +CompositionTime。
  5. CompositionTime的单位也是ms
  6. Script data脚本数据就是描述视频或⾳频的信息的数据,如宽度、⾼度、时间等等,⼀个⽂件中通常只有⼀个元数据,⾳频tag和视频tag就是⾳视频信息了,采样、声道、频率,编码等信息。
2. Script Tag Data结构(脚本类型、帧类型)
  1. 该类型Tag⼜被称为MetaData Tag,存放⼀些关于FLV视频和⾳频的元信息,⽐如:duration、width、height等。通常该类型Tag会作为FLV⽂件的第⼀个tag,并且只有⼀个,跟在File Header后。该类型Tag Data的结构如下所示:
    在这里插入图片描述
  2. 第⼀个AMF包: 第1个字节表示AMF包类型,⼀般总是0x02,表示字符串。第2-3个字节为UI16类型值,标识字符串的⻓度,⼀般总是0x000A(“onMetaData”⻓度)。后⾯字节为具体的字符串,⼀般总为“onMetaData”(6F,6E,4D,65,74,61,44,61,74,61)。
  3. 第⼆个AMF包: 第1个字节表示AMF包类型,⼀般总是0x08,表示数组。第2-5个字节为UI32类型值,表示数组元素的个数。后⾯即为各数组元素的封装,数组元素为元素名称和值组成的对。常⻅的数组元素如下表所示。
    在这里插入图片描述
3. Audio Tag Data结构(⾳频类型)
  1. ⾳频Tag Data区域开始的:
    1. 第⼀个字节包含了⾳频数据的参数信息,
    2. 第⼆个字节开始为⾳频流数据。
  2. (这两个字节属于tag的data部分,不是header部分)
  3. 第⼀个字节为⾳频的信息(仔细看spec发现对于AAC⽽⾔,⽐较有⽤的字段是SoundFormat),格式如下:
    在这里插入图片描述
  4. 第⼆个字节开始为⾳频数据(需要判断该数据是真正的⾳频数据,还是⾳频config信息)
    在这里插入图片描述
    在这里插入图片描述
  5. 如果是AAC数据,如果他是AAC RAW, tag data[3] 开始才是真正的AAC frame data。
    在这里插入图片描述
4. Video Tag Data结构(视频类型)
  1. 视频Tag Data开始的:
    1. 第⼀个字节包含视频数据的参数信息。
    2. 第⼆个字节开始为视频流数据。
  2. 第⼀个字节包含视频信息,格式如下:
    在这里插入图片描述
  3. 第⼆个字节开始为视频数据
    4.
    在这里插入图片描述
  4. CompositionTime 单位毫秒
    1. CompositionTime 每个视频tag(整个tag)的第14~16字节(如果是tag data偏移[3]~[5],[0],[1][2:AVCPackettype] )(表示PTS相对于DTS的偏移值 )。
    2. CompositionTime 单位为ms : 显示时间 = 解码时间(tag的第5~8字节,位置索引[4]~[7])+ CompositionTime
      在这里插入图片描述
      f

猜你喜欢

转载自blog.csdn.net/weixin_41910694/article/details/109564752