音视频封装格式之FLV

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部分相同,但是数据不同。

  1. 音频标签:包含音频数据的编码格式、采样率、声道数等信息以及音频帧数据。

  2. 视频标签:包含视频数据的编码格式、分辨率、帧率等信息以及视频帧数据。

  3. 脚本标签:用于存储与视频相关的元数据,如视频的标题、时长、创建时间等,以及用于交互操作的脚本信息。

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 数据并进行解码和播放。

相关推荐
vfvfb几秒前
合并音频 声音合并 多个音频wav合并成一个
音视频·音频合并
AI巨人2 小时前
“PR插件:轻松减少50%素材寻找时间,内置丰富素材,提升视频制作效率
人工智能·音视频·语音识别
Likeadust3 小时前
视频推流平台EasyDSS无人机推流直播技术赋能城市可视化管理
音视频·无人机
AI生成未来3 小时前
港科大等提出音频驱动多人视频生成新范式 AnyTalker,解锁任意数量角色间的自然互动!
aigc·音视频·视频生成·音频驱动视频
EasyDSS4 小时前
全场景视频推流利器:视频推流平台EasyDSS技术解析与行业落地实践
音视频
XHW___0015 小时前
音频调试时录制pcm数据
音视频·pcm
♛小小小让让5 小时前
FourCC、编解码器、 文件后缀、视频容器的关系
笔记·音视频
智联视频超融合平台5 小时前
智能互联新时代:视频联网平台与物联网的完美融合
人工智能·物联网·网络协议·系统安全·音视频
小c君tt6 小时前
ffmpeg-音-视频-基本概念
ffmpeg·音视频
Hello World,8 小时前
使用ffmpeg播放视频并添加当前时间水印
ffmpeg·音视频