简介

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