FLV(Flash Video)是一种常见的视频文件格式,FLV 格式最初是由 Adobe 公司开发的,旨在为网络视频提供一种高效、可扩展且易于流式传输的解决方案。随着在线视频的迅速发展,FLV 因其良好的兼容性和流式传输性能,成为了许多视频分享网站(如早期的 YouTube、优酷等)首选的视频格式。
一、FLV 格式的特点
(一)流式传输
FLV 格式支持流式传输,这意味着用户无需等待整个视频文件下载完成就可以开始观看。视频数据可以在下载的同时进行播放,大大减少了用户的等待时间,提供了更流畅的观看体验。
(二)高效压缩
FLV 通常采用 H.264 等先进的视频编码标准和 AAC 等音频编码标准,能够在保证一定视频质量的前提下实现高效的压缩,减小文件大小,节省带宽资源。
(三)易于嵌入网页
FLV 格式可以很方便地嵌入到 HTML 网页中,通过 Adobe Flash Player 插件进行播放。这使得在网页上展示视频内容变得简单快捷,促进了网络视频的普及。
(四)支持元数据
FLV 文件可以包含丰富的元数据,如视频标题、作者、描述、标签等,方便对视频进行分类、搜索和管理。
二、FLV 格式的文件结构
FLV 文件由文件头(File Header)和一系列的标签(Tag)组成。flv格式以大端序存储。
文件组成如下:
2.1 文件头
文件头包含了 FLV 文件的基本信息,如文件标识、版本号、音频和视频流的存在标志等。
- 9 个字节,包含文件格式标识和版本信息。
- 前 3 个字节通常为 "FLV"(0x46 0x4C 0x56),表示这是一个 FLV 文件。
- 第 4 个字节表示版本号。
- 第 5 个字节的前 5 位通常为 0,后 3 位表示是否存在音频和视频。
- 第 6 - 9 字节表示文件头的大小。
2.2 标签
标签是 FLV 文件的主要数据单元,分为音频标签(Audio Tag)、视频标签(Video Tag)和脚本标签(Script Tag)。各个标签的header部分相同,但是数据不同。
-
音频标签:包含音频数据的编码格式、采样率、声道数等信息以及音频帧数据。
-
视频标签:包含视频数据的编码格式、分辨率、帧率等信息以及视频帧数据。
-
脚本标签:用于存储与视频相关的元数据,如视频的标题、时长、创建时间等,以及用于交互操作的脚本信息。
2.2.1 tag header
字段名称 | 长度(字节) | 描述 |
---|---|---|
Tag Type | 1 | 表示 Tag 的类型,如音频、视频、脚本数据等 |
Data Size | 3 | 后续数据字段的大小(不包括 Tag Header 自身) |
Timestamp | 3 | 时间戳,单位为毫秒 |
Timestamp Extended | 1 | 时间戳扩展位,用于扩展时间戳的范围 |
StreamID | 3 | 总是为 0 |
2.2.2 Script Tag Data结构
该类型Tag⼜被称为MetaData Tag,存放⼀些关于FLV视频和⾳频的元信息,⽐如:duration、width、
height等。通常该类型Tag会作为FLV⽂件的第⼀个tag,并且只有⼀个,跟在File Header后。
2.2.3 Audio Tag Data结构(⾳频类型)
音频tag data的第一个字节包含了音频数据的参数信息,
第二个字节开始为音频流数据。需要考虑AACAUDIOPACKET字段中的AACPacketType头,如果为1,这里直接就是aac码流了,否则还会有一个aac sequence header(可以理解为flv协议定义的header)
注意虽然这里有采样率相关的信息,但一般我们还是从流中去解析实际的采样率
2.2.4 Video Tag Data结构(视频类型)
视频Tag Data第⼀个字节包含视频数据的参数信息,
第⼆个字节开始为视频流数据。
处理视频流数据时,需要考虑AVCVIDEOPACKET字段中的AVCPacketType头,如果有,这里直接就是es流了,否则还会有一个avc sequence header(可以理解为flv协议定义的header)
三、FLV如何解析
以下是一个简单的 FLV 标签(Tag)解析的流程图示例:
RTMP与FLV
RTMP(Real Time Messaging Protocol,实时消息传输协议)和 FLV(Flash Video)有着密切的关系。
FLV 是一种常见的视频格式。RTMP 通常用于在网络上进行实时数据传输,包括音频、视频和数据等。
RTMP 可以传输 FLV 格式的视频数据。在实际应用中,服务器和客户端之间通过 RTMP 协议建立连接,服务器将 FLV 格式的视频数据封装在 RTMP 数据包中进行传输,客户端接收并解析这些数据包,从而获取和播放 FLV 格式的视频内容。
当使用 RTMP 传输 FLV 时,服务器会对 FLV 数据进行分段和封装,添加必要的控制信息和包头,以适应 RTMP 协议的传输要求。客户端在接收到 RTMP 数据包后,按照协议规范进行解析和处理,提取出其中的 FLV 数据并进行解码和播放。