简介
FLV是Adobe公司提出一种视频格式,由于协议简单、传输体积小而被广泛采用,而常见的HTTP-FLV流媒体协议是通过HTTP协议将FLV封装过的视频内容、音频内容流式传输到端上,从而实现直播播放诉求。个人理解HTTP-FLV不算是一个标准协议,而是借助了HTTP的流传输能力将FLV格式协议的媒体内容流示传输到客户端,而了解FLV协议格式内容,对于理解整个HTTP-FLV流媒体协议来说是非常有必要的。
FLV协议内容
简单来说,FLV格式主要由FLV header和FLV body两部分构成,而FLV body里包含了多个FLV tags,大体的组合公式可以概括为:
FLV = FLV header + FLV body
FLV body = PreviousTagSize0 + Tag1 + … + PreviousTagSizeN-1 + TagN
1、FLV header
header部分长度为9个字节,前面3个字节为固定”FLV”拼写,第4个字节为版本号,通常为01;第5个字节里,第6位表示audio tag,第8位表示video tag;最后4个字节代表header长度,版本1下的长度为9;在常见的flv转封装库,如flv.js,都是通过检测FLV header来确定当前字节流是不是一个标准FLV格式的流
2、FLV body
flv body
是由PreviousTagSize和FLV tags叠加构成
2.2、FLV tags
FLV tags 由 tags header + tags data 构成,header部分包含TagType、DataSize、Timestamp、Timestamp Extend、StreamId构成,其中TagType标明了data的类型,结构图如下:
2.2.1、FLV tags header
2.2.2、FLV tags data
- Audio tags,用于描述音频信息
- Video tags,主要用于描述视频信息
- Script Data tags,一种amf的格式实现,拥有各种类型,用于存放媒体onMetaData(元数据)信息,如时长、长度、宽度等
3、FLV tags data
3.1、Audio tags
图解如下:
定义如下:
特别需要关注的是,当SoundFormat=10的时候,SoundData的内容为AACAUDIODATA,AACAUDIODATA的协议内容为:
3.2、Video tags
图解如下:
定义如下:
特别需要关注的是,当CodecID为7的时候,也就是说VideoData的实际媒体内容为AVCVIDEOPACKET,AVCVIDEOPACKET的协议内容如下:
3.3、Scripts Data tags
图解如下:
定义如下:
SCRIPTDATAOBJECT的协议字段为:
SCRIPTDATAVALUE的协议字段为:
总协议图
基于上面的协议拆分,做了下协议的整合大图
附录
官方协议详解:https://www.adobe.com/content/dam/acom/en/devnet/flv/video_file_format_spec_v10.pdf