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 |
解说
AMF Object 和 AMF Array 其实都是 Dictionary<String, Data> 的解构,Strict Array 才是真正的 Array。
AMF Array 的第一个长度为参考值,不一定为 Pair 个数,实际以 Object End 结束。
Metadata Tag 本身是一个 Pair,其中 Key 固定为 String “onMetadata”,实际也有遇到 Key 的 Type 不是 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_。