音视频封装格式之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 数据并进行解码和播放。

相关推荐
AI视频工具指南27 分钟前
怎么用 AI 做一两分钟的小故事视频?
人工智能·aigc·音视频
ACP广源盛139246256732 小时前
项目评估记录:4K 远距离视频 Serdes 传输方案调研,GSV5800@ACP参数与工程问题记录
笔记·硬件架构·音视频·视频·国产芯片
碧海银沙音频科技研究院3 小时前
面向长尾音频分类的知识蒸馏研究
人工智能·算法·音视频
BeiGuTing_code4 小时前
C链表基础(二)有视频模拟!!!
c语言·链表·音视频
燕落南枝4 小时前
HTML 视频标签(video)详解笔记
笔记·html·音视频
霖霖7146 小时前
【ESP32笔记】I2S的音频录制与播放
笔记·单片机·mcu·音视频
码上观世界8 小时前
Agent 对话里的图片与视频处理
音视频
lingyubb11 小时前
影视解说配音工具的技术选型与对比(行业观察)
音视频·ai配音·多语种
科技小E18 小时前
监控设备品牌杂乱无法互通?EasyGBS打通孤岛,统一汇聚视频
服务器·网络·音视频
EasyGBS1 天前
通信基站/铁塔机房无人值守,国标GB28181公网平台EasyGBS视频能力怎么去管
深度学习·安全·音视频