一、什么是FLV
FLV流媒体协议是美国Adobe公司推出来的一种流媒体协议。FLV流媒体格式的特点是封装过后的音视频数据非常小、并且封装的规范相对更加简单,所以FLV流媒体格式非常适合网络传输。但是FLV格式是Adobe公司的私有协议,所以它支持的网络传输协议比较有限:如RTMP、HTTP-FLV。
二、FLV流媒体格式讲解
FLV流媒体封装格式一般由两个部分组成,一个是FLV Header、另外一个是FLV Body。其中,FLV Header长度固定式9个字节,FLV BODY则是由一组组的Previous Tags Size + Tag组成。Previous Tag Size一般在整个Tag的前面,它一般记录前一个Tag的大小。Tag的类型一般分为三种、第一种脚本数据帧类型、视频数据类型、音频数据类型。
2.1 FLV Header的讲解:
FLV头部前三个字节是固定FLV的十六进制,Version是版本号固定为1。其他的根据自己的业务配置
2.2 FLV BODY 的讲解
FLV BODY一般由FLV Tag Header和Tag Data组成。如果是视频的TAG DATA,则FLV Tag Header+ Video Tag Data。而如果是音频的TAG DATA,则是FLV Tag Header + Audio Tag Data。但无论是视频的Tag Data还是音频的Tag Data它们的FLV Tag Header都是相同的,下面我们来看看公共部分的FLV Tag Header:
2.2.1. FLV Script Tag的讲解:
FLV Script Tag也是由FLV Tag Header + Script Data Tag组成。Script Tag的类型一般被称为MedtaData Tag,它一般会存储一些关于FLV音视频的参数信息,比方说:分辨率(width、height)、duration,通常来说Script Tag Data是第一个出现的Tag,并且有且只有一个。
Script Tag是由两个AMF包组合起来(AMF 包 = 数据类型(看下图) + 数据长度 + 数据)。AMF1的第一个字节表示包类型、默认0x02。第2-3个字节代表的是字符串的长度,默认0X00A。 而后面的字节是具体的字符串(“onMetaData”)用十六进制表示:(6f、6e、4d、65、74、61、44、61、74、61)
AMF数据类型:
而第二个AMF包,第一个字节是0x08表示数组类型。第2-5个字节表示的是数组元素的个数、而后面的数组则是每个数组的键值对。
AMF2数组对应的键值对:
具体的数据分析:
AMF1的分析:
AMF2的分析:
2.2.2. FLV VIDEO TAG的讲解:
FLV VIDEO TAG是由两部分组成,FLV Tag HEADER + VIDEO DATA TAG。具体的我们来看看图解:
从这张图可以看出,VIDEO DATA TAG是视频的具体信息,这其中包括:STREAMID视频流ID、FrameType视频帧类型(1: avc keyframe指的是关键帧、2: avc inter frame指的是普通帧)、CODECID编码ID(默认7:AVC编码)、AVCPacketType编码包类型(0: avc sequence hdr、1: NALU类型)、CompositionTime构造时间、Data具体的视频数据
2.2.3. FLV AUDIO TAG的讲解
FLV AUDIO TAG是由两部分组成,FLV Tag HEADER + VIDEO DATA TAG。具体的我们来看看图解:
从这张图可以看出,AUDIO DATA TAG是视频的具体信息,这其中包括:STREAMID音频流ID、SoundFormat音频类型(10: aac)、SoundRate音频采样率、SoundSize音频采样深度、SoundType音频编码类型、AACPacketType AAC包的类型、Data就是具体的音频数据。下面这个是每一个Audio Data Tag的具体定义: