前排提示:之所以叫 “速通版”,前提是对有一定音视频基础知识的人群,可参考本文快速了解一些重点信息和内容。
目录
一、整体结构
FLV (即 Flash Video 的缩写) ,源于 Adobe 公司定义的一种流媒体的封装格式。
整体上看,由 2 部分组成:
FLV = FLV Header + FLV Body
FLV 文件的数据是以大端字节序存储的。
(注意,通常大多数的媒体文件都是 小端字节序存储。
而网络传输的数据通常使用 大端字节序)。
⼀个标准 FLV 文件结构,如下图所示:
可以看到整体结构比较简单 ——
- FLV Header 是固定长度为 9 Byte 的数据,
- 而 FLV Body 是由一对接一对的 [ PreviousTagSize ] + [ Tag ] 组成。
二、FLV Header 部分
大小占 9 Byte,共有 4 个结构体成员,定义如下:
取值类型 | 名称 | 占位大小 | 说明 |
char [3] | Signature | 3 Byte | FLV 文件标识(固定值 “F” “L” “V” ) |
unsigned char | Version | 1 Byte | 版本 (目前值都是 1) |
unsigned char | TypeFlags | 1 Byte | 表示是否存在音频和视频 第 0 ~ 4 bit:保留位,固定值 0 第 5 bit:是否存在音频 第 6 bit:保留位,固定值 0 第 7 bit:是否存在视频 |
unsigned int | DataOffset | 4 Byte | 表示 FLV Header 本身的长度,单位 Byte ( 目前版本1 规定的值是 9 ) |
不得不感慨,FLV Header 的设计真的是非常简洁、优雅。
三、FLV Body 部分
前面已经介绍过了,FLV Body 是由一对接一对的 [ PreviousTagSize ] + [ Tag ] 组成。
-
Previous Tag Size 字段
排列在 Tag之前,记录 前一个Tag 的大小 (用于逆向读取处理),长度占 4 个字节。显然,FLV Header 后的第⼀个 Pervious Tag Size 的值必定为 0。
-
FLV Tag 字段
FLV Tag 结构上,分为 2 部分:
FLV Tag = [ Tag Header ] + [ Tag Data ]
类型上,分为 3 种:
- 脚本(帧)数据 - Script Tag Data
也被称为 MetaDataTag,存放⼀些关于FLV视频和音频的元信息,比如:duration、width、height等。 通常作为 FLV 文件的第一个 tag,并且只有一个,跟在 File Header 后面。
- 音频数据 - Audio Tag Data
第一个字节包含了 Audio 数据的参数信息, 第二个字节开始为 Audio 数据(RawData or Configration)。
注意,这两个字节属于 tag 的 data 部分,不是 header 部分。
- 视频数据 - Video Tag Data
第一个字节包含了 Video 数据的参数信息, 第二个字节开始为 Video 数据。
注意,⼀个 FLV 文件,每种类型的 Tag 都属于⼀个流,也就说是⼀个 FLV 文件最多只有⼀个音频流和⼀个视频流,不存在多个独立的音视频流封装在在同⼀个 FLV 文件的情况。
FLV Tag Header 结构体如下:
关于 FLV 的时间戳计算:
- FLV 文件中的 Timestamp 和 TimestampExtended 拼出来的是 DTS -解码时间,单位为 ms。(如果没有 B 帧,当然 DTS 等于 PTS 显示时间)
- CompositionTime 表示 PTS 相对于 DTS 的偏移值, 在每个视频 tag 的第 14~16 字节,单位也是 ms。 PTS = DTS (tag 的第 5~8 字节) + CompositionTime
PS:分享
一个 系统深入学习音视频 知识的课程 —— https://xxetb.xetslk.com/s/45jaSl
(学无止境,文章如有纰漏不足,欢迎您不吝指正!谢谢 ^_^)