FLV文件格式

FLV全称Flash Video, VSCode可以下载一个插件hexdump for VSCode用来查看视频的16进制内容.

FLV文件的前3个字节为46 4C 56, 也就是字符F L V, FLV文件 = FLV头文件 + tag1 + tag1内容1 + tag2 + tag2内容2 + … + tagN + tagN内容N

FLV头文件

  • 1-3: 前3个字节是文件格式标识(FLV, 0x46 0x4C 0x56)
  • 4-4: 第4个字节是版本0x01
  • 5-5: 第5个字节的前5位是保留的必须是0, 第6位是音频类型标志位, 第7位也是保留的必须是0, 第8位是视频类型标志位
  • 6-9: 第6个字节到第9个字节也是保留的。数据为: 00 00 00 09

整个文件头长度一般是9 (3 + 1 + 1 + 4)

Tag基本格式

tag类型信息, 固定长度为15字节

  • 1-4: 前一个tag长度(4字节), 第一个tag就是0
  • 5-5: tag类型, 0x8 音频, 0x9 视频, 0x12 脚本数据
  • 6-8: tag内容大小(3个字节)
  • 9-11: 时间戳(3个字节, 毫秒), 第一个tag的时候总是为0, 如果是脚本就是0
  • 12-12: 时间戳拓展, 可以让时间戳变成4个字节, (以存储更长时间的flv时间信息),本字节作为时间戳的最高位。
    在flv回放过程中,播放顺序是按照tag的时间戳顺序播放。任何加入到文件中时间设置数据格式都将被忽略
  • 13-15: streamID (3个字节), 总是0

Video Tag Content格式

第一个字节高4位表示是否为关键帧, 低4位表示codec的版本, H.264的值是7(0111)

{
keyframe_type // (4 bit)
codec version // (4 bit)
// H264 only
package type // (1 byte)
composition time // (3 bytes)
sps_pps_data // 第一个video tag发送
frame_data // 视频帧数据

}