FLV 文件格式解析 (2)

FLV 文件格式解析第二篇,本篇讲解上篇未提到的 metadata tag。

Metadata Tag

Metadata tag 本身是一个 AMF Pair,定义如下:

数据大小 名称 备注
AMF Data Key 一般为 String
AMF Data Value

AMF Data:

数据大小 名称 备注
byte Type 0 (0x0) - Double
1 (0x1) - Boolean
2 (0x2) - String
3 (0x3) - Object
8 (0x8) - Array
9 (0x9) - Object End
10 (0xA) - Strict Array
variable Content 根据 Type 变化,以下详解
  • 0 - Double

IEEE Double-precise Floating-point Value

  • 1 - Boolean

0 (0x0) - False
1 (0x1) - True

  • 2 - String
数据大小 名称 备注
UInt16 Length
byte[Length] Content UTF-8 String
  • 3 - Object
数据大小 名称 备注
AMF Pair[*] Dictionary
byte Object End 总是 9(0x9)
  • 8 - Array
数据大小 名称 备注
UInt32 Size 估计大小,实际以 Object End 结束
AMF Pair[*] Content 多个 AMF Pair
byte Object End 总是 9(0x9)
  • 9 - Object Ended

标识 Object 或 Array 结束,没有 Content。

  • 10 - Strict Array
数据大小 名称 备注
UInt32 Size 精确大小
AMF Data[Size] Content 多个 AMF Data

解说

  1. AMF Object 和 AMF Array 其实都是 Dictionary<String, Data> 的解构,Strict Array 才是真正的 Array。

  2. AMF Array 的第一个长度为参考值,不一定为 Pair 个数,实际以 Object End 结束。

  3. Metadata Tag 本身是一个 Pair,其中 Key 固定为 String “onMetadata”,实际也有遇到 KeyType 不是 String,但 Content 仍是 String 的情况,大概可以忽略 Key 的 _Type_。

常见的 Key

对于一个 FLV 文件,常见的 Key 有:

  • width (Double) 帧宽度
  • height (Double) 帧高度
  • duration (Double) 视频持续时间,以秒为单位
  • framerate (Double) 帧率

还有一个常用但是非标准的 Key:keyframes

Keyframes 可以让播放器快速在文件中定位,播放网络媒体时特别有用。因为是非标准,所以用 Youku 编码器的格式来说明,不保证完全如此:

keyframes (Array):

    times: (Strict Array<Double>) 时间戳,以秒为单位

    filepositions (Strict Array<Double>) 对应的文件位置,以字节为单位

filepositions 里的值表示最近的 video tag 开始的位置,即指向的字节必定为 9(Video Tag 的 Type),不含前面的 _Previous Tag Size_。