FLV
是FLASH VIDEO的简称,FLV
流媒体格式是随着Flash MX的推出发展而来的视频格式。由于它形成的文件极小、加载速度极快,使得网络观看视频文件成为可能,它的出现有效地解决了视频文件导入Flash后,使导出的SWF文件体积庞大,不能在网络上很好的使用等问题。RTMP
和HTTP_FLV
内部使用FLV
协议封装H.264
和AAC
音视频包,FLV属于大端字节序
。
FLV格式由FLV Header
+FLV Body
构成:
从上图可知,FLV封装主要由以下几个部分组成:‘
FLV Body = PreviousTagSize0 + Tag1 + ..+ PreviousTagSize n + Tag n
PreviousTagSize + Tag = FLV Tag header + Data tag
Data tag = Video(video header + h264 data
) / Audio (audio header + aac data
)
为了进一步熟悉FLV协议,我们探讨下在RTMP中对FLV的封装。
RTMP的Video FLV Data (封装H.264)
通常,FLV的Video Tag应该由11字节
的FLV tag header
和Video tag header
构成,即:
FLV tag Header说明:
PreviousTagSize
: 表面之前的 Tag 的长度(tag 头+tag 数据),第一个 tag值是 0TagType
:音频:8, 视频:9DataSize
:flv tag 的数据长度,其实如图里 audio tag 头及其数据长度Timestamp
:时间戳,貌似flv播放需要TimestampExtended
:当时间Timestamp不能表示的时候,启用本扩展字段StreamID
:都填 0.
但是,在RTMP协议中,Video Tag不包含FLV tag header
,即只有Video tag header
,并且封装的H.264数据需要区分PPS/SPS NALU
和普通NALU
,具体结构如下:
- PPS/SPS NALU