FLV格式
FLV格式为heder+body
FLV文件中数据存储方式为大端(big-endian)模式
时间戳单位为毫秒
Header
字段 | 类型 | 描述 |
---|---|---|
标记 | UI8 | ‘F’(0x46) |
标记 | UI8 | ‘L’(0x4c) |
标记 | UI8 | ‘V’(0x56) |
版本 | UI8 | flv版本 |
保留 | UB[5] | 0 |
Audio | UB[1] | 1代表有audio tag |
保留 | UB[1] | 0 |
Video | UB[1] | 1代表有video tag |
DataOffset | UI32 | 0x09 |
Body
字段 | 类型 | 描述 |
---|---|---|
PreviousTagSize0 | UI32 | 0,第一个PreviousTagSize |
Tag1 | FLVTAG | 第一个tag |
PreviousTagSize1 | UI32 | 前一个tag的大小,包括它的头部,单位字节。在第一版FLV中,它的大小是11+前一个tag大小 |
Tag2 | FLVTAG | 第二个Tag |
··· | ||
PreviousTagSizeN-1 | UI32 | 倒数第二个tag的大小 |
TagN | FLVTAG | 最后一个Tag,包括头部 |
PreviousTagSizeN | UI32 | 最后一个tag的大小,包括头部 |
FLV Tag 定义
FLV Tag
FLV tag包括audio、video的metadata或者sctipts,可选的加密metadata,以及数据负载(payload)
字段 | 类型 | 描述 |
---|---|---|
保留 | UB[2] | 保留给FMS,0 |
过滤 | UB[1] | 表示数据是否已过滤,0 = 不需要预先处理,1 = 在渲染之前需要预处理(如解密),在未加密文件中应该为0,加密过的Tag需要置该位为1。 |
Tag类型 | UB[5] | 该Tag内容类型,8 = 音频,9 = 视频,18 = 脚本。 |
数据大小 | UI24 | 消息的长度,StreamId到tag末尾的长度(相当于tag长度-11) |
时间戳 | UI24 | DTS,解码时间 |
时间戳扩展 | UI8 | |
流ID | UI24 | 0 |
Tag头 | Tag类型为8时表示音频Tag头,为9时表示视频Tag头 | |
加密头 | 过滤为1时 | |
过滤参数 | 过滤为1时 | |
数据 | Tag类型为8时是音频数据,为9时是视频数据,为18时表示脚本数据 |
音频Tag
音频头
字段 | 类型 | 描述 |
---|---|---|
音频格式 | UB[4] | 音频格式,具体格式见FLV文档 |
音频采样率 | UB[2] | 0 = 5.5kHz, 1 = 11kHz, 2 = 22kHz, 3 = 44kHz |
音频位宽 | UB[1] | 每个音频采样的位宽,属于未压缩的音频格式,压缩过的格式内部解码为16位。0 = 8位,1 = 16位。 |
音频类型 | UB[1] | 0 = 单声道,1 = 立体声 |
AAC包类型 | 当音频类型 = 10,UI8 | 0 = AAC序列头,1 = AAC裸数据 |
音频数据
字段 | 类型 | 描述 |
---|---|---|
音频数据 | 当音频类型 = 10为AAC音频数据 |
AAC音频数据
字段 | 类型 | 描述 |
---|---|---|
数据 | AAC包类型 = 0时为音频定义配置,= 1时为UI8[]类型的AAC帧裸数据 |
视频tag
视频头
字段 | 类型 | 数据 |
---|---|---|
帧类型 | UB[4] | 1 = 关键帧,2 = 参考帧 |
编码ID | UB[4] | 7 = AVC,其他省略 |
AVC包类型 | 当编码ID = 7,UI8 | 0 = AVC序列头,1 = NALU,2 = AVC序列末尾 |
相对时间戳 | 如果编码ID = 7,SI24 | CTS,如果AVC包类型 = 1存放相对时间,否则为0 |
PTS = DTS + CTS
视频数据
字段 | 类型 | 描述 |
---|---|---|
视频tag body | 根据帧类型定义 |
AVC视频包
字段 | 类型 | 数据 |
---|---|---|
数据 | 如果AVC包类型 = 0表示AVC解码配置记录,= 1表示1个或多个NALU |
一般第一个音频tag和第一个视频tag是解码配置记录,记录解码所需的参数,比如h264中的SPS、PPS,aac中的ADTS header。
脚本数据
见官方文档