一、什么是flv
flv流媒体协议是Adobe公司推出的一种流媒体协议。其特点就是封装后的音视频数据量很小,并且协议规范相对简单,所以FLV流媒体协议适合网络传输,但是他是一个私有协议,所支持的网络传输比较有限:如RTMP、HTTP-FLV。
二、FLV流媒体格式讲解
flv有两部分,一个是flv header另外一个是flv body。
flv header长度固定9个字节
flv body由一组组的previous tags size + tag组成
tag由 flv tag header + tag data组成
Previous Tag Size一般在整个Tag的前面,它一般记录前一个Tag的大小。Tag的类型一般分为三种、第一种脚本数据帧类型、视频数据类型、音频数据类型。
2.1FLV Header
FLV 头部的前三个字节是固定的,表明了是FLV格式,Version是版本号固定为1,其他根据项目自己配置
2.2 FLV BODY
FLV BODY由FLV Tag Header 和Tag Data组成。
音频FLV BODY = FLV Tag Header + Audio Tag Data。
视频FLV BODY = FLV Tag Header + Video Tag Data
脚本FLV BODY = FLV Tag Header + Script Tag Data
但无论是视频的Tag Data还是音频的Tag Data它们的FLV Tag Header都是相同的,下面我们来看看公共部分的FLV Tag Header:
2.3.1FLV 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 包 = 数据类型(看下图) + 数据长度 + 数据)。
AMF数据类型:
AMF1的第一个字节表示包类型、默认0x02。第2-3个字节代表的是字符串的长度,默认0X00A。 而后面的字节是具体的字符串(“onMetaData”)用十六进制表示:(6f、6e、4d、65、74、61、44、61、74、61)。
AMF2包封装一个数组类型,这个数组中包含了音视频信息项的名称和值。第一个字节是0x08表示数组类型。第2-5个字节表示的是数组元素的个数、而后面的数组则是每个数组的键值对。
AMF2数组对应的键值对:
AMF1的分析:
AMF2的分析:
2.3.2FLV 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.3.3FLV AUDIO TAG
FLV AUDIO TAG是由两部分组成,FLV Tag HEADER + VIDEO DATA TAG。
从这张图可以看出,AUDIO DATA TAG是视频的具体信息,这其中包括SoundFormat音频类型(10: aac)、SoundRate音频采样率、SoundSize音频采样深度、SoundType音频编码类型、AACPacketType AAC包的类型、Data就是具体的音频数据。下面这个是每一个Audio Data Tag的具体定义:
三、总结
FLV = FLV Header + FLV Body
FLV Body = FLV TAG
FLV TAG = FLV TAG Header + TAG DATA(FLV TAG有三种类型)