flv格式解析
FLV是一个二进制文件,简单来说,其是由一个文件头(FLV header)和很多tag组成(FLV body)。tag又可以分成三类:audio,video,script,分别代表音频流(0x8),视频流(0x9),脚本流(0x12),而每个tag又由tag header和tag data组成。
分析之前推荐一个flv分析工具:flv分析工具
工具的使用说明和出处:使用说明
以一个具体的flv文件为例具体分析:
文件头由9bytes组成:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kbntqCE6-1580714898238)(https://i.loli.net/2020/01/20/SADYzaEdRkWUGQ9.png)]
前3个bytes是文件类型,总是“FLV”,也就是(0x46 0x4C 0x56)。第4btye是版本号,目前一般是0x01。第5byte是流的信息,倒数第一bit是1表示有视频(0x01),倒数第三bit是1表示有音频(0x4),有视频又有音频就是0x01 | 0x04(0x05),其他都应该是0。最后4bytes表示FLV 头的长度,3+1+1+4 = 9。
FLV header后面就是FLV body,FLV body中包含很多个FLV tag,tag的分类有三种:0x08音频、0x09视频、0x12脚本。
每个tag中包含tag头和tag体。
每个tag前面还有一个previous size包 记录这上一个tag的数据的长度。先简单说一下tag head:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S3t4X8W4-1580714898253)(https://i.loli.net/2020/01/20/aNEIDfAQyx7vlpH.png)]
1byte Tag类型,3bytes数据长度记录,3bytes时间戳,一个扩展时间戳bype,3bytes StreamID
每一个tag第一部分是tag header,tag header长度为11bytes,但是每个tag header前面有4bytes记录着上一个tag的长度。tag header的第1个byte为记录着tag的类型,音频(0x8),视频(0x9),脚本(0x12);第2到4bytes是数据区的长度,也就是tag data的长度;再后面3个bytes是时间戳,单位是毫秒,类型为0x12则时间戳为0,时间戳控制着文件播放的速度,可以根据音视频的帧率类设置;时间戳后面一个byte是扩展时间戳,时间戳不够长的时候用;最后3bytes是streamID,但是总为0,再后面就是数据区了(tag data),也即是h264的裸流,tag header 长度为1+3+3+1+3=11。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1OjXnzFp-1580714898256)(https://i.loli.net/2020/01/20/ezOrFnGiDTvUWL6.png)]