音视频封装格式之FLV

news2024/9/22 13:36:54

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 Type1表示 Tag 的类型,如音频、视频、脚本数据等
Data Size3后续数据字段的大小(不包括 Tag Header 自身)
Timestamp3时间戳,单位为毫秒
Timestamp Extended1时间戳扩展位,用于扩展时间戳的范围
StreamID3总是为 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 数据并进行解码和播放。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2071846.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

4.2较难的栈和队列OJ

本篇博客来手撕三道稍有难度的栈和队列相关OJ,题目均已插入超链接,点击即可跳转~ 一、设计循环队列 1、题目描述 设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出,即first in fir…

day39.动态规划+MySQL数据库复习

一.动态规划: 198.打家劫舍 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定…

深入浅出消息队列----【Broker 集群】

深入浅出消息队列----【Broker 集群】 单 master多 master多 master 多 slave 异步复制多 master 多 slave 同步复制Dledger 本文仅是文章笔记,整理了原文章中重要的知识点、记录了个人的看法 文章来源:编程导航-鱼皮【yes哥深入浅出消息队列专栏】 Brok…

LeetCode100.删除链表的倒数第 N 个结点

1. 题目大意 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 进阶:你能尝试使用一趟扫描实现吗? 2. 思路分析 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5]我们可以先遍历一遍链表求出…

Data Localization Software Architecture - SAAS Localization CyberWin Future

一、Future Window Industry Application Cross-platform Architecture The cross-platform architecture of Future Window adopts Hybird (hybrid mode mobile application), which is a mobile application development model that combines the characteristics of native …

golang学习笔记——grom连接mysql

GORM 指南 The fantastic ORM library for Golang aims to be developer friendly. Golang的ORM库旨在对开发人员友好。 特性 全功能 ORM关联 (Has One,Has Many,Belongs To,Many To Many,多态,单表继承)Create&…

【Redis】渐进式遍历和数据库管理

渐进式遍历和数据库管理 渐进式遍历scan 数据库管理切换数据库清除数据库 渐进式遍历 Redis 使⽤ scan 命令进⾏渐进式遍历键,进⽽解决直接使⽤ keys 获取键时可能出现的阻塞问题。每次 scan 命令的时间复杂度是 O(1),但是要完整地完成所有键的遍历&…

数学建模笔记(三):拟合算法

前面介绍的插值方法,我们可以发现他的特点在于最终得到的曲线一定要经过已经给出的样本点的,而这次要介绍的拟合方法的区别在于,拟合不要求曲线一定要经过所有的样本点,只要这个曲线与样本点之间的误差足够小,距离足够…

unity AssetBundle 使用_什么是AssetBundle_导入必要的插件_创建AssetBundles_AB包资源下载_大文件下载

一、什么是AssetBundle? 定义AssetBundle。 AssetBundle 是一个存档文件,包含可在运行时由 Unity 加载的特定于平台的非代码资源(比如模型、纹理、预制件、音频剪辑甚至整个场景)。AssetBundle 可以表示彼此之间的依赖关系&…

PD取电快充协议方案

PD快充协议是通过调整电压和电流来提供不同的充电功率。它采用了一种基于USB-C端口的通信协议,实现了充电器于设备之间的信息交换。在充电过程中设备会向充电器发出请求,要求提供不同的电压和电流,充电器接收到请求后,会根据设备的…

数据本地化软件架构-SAAS本地化未来之窗行业应用跨平台架构

一、未来之窗行业应用跨平台架构 未来之窗跨平台架构采用Hybird(混合模式移动应用)是一种结合了原生应用(Native App)和网页应用(Web App)特点的移动应用开发模式。 二、特点 2.1. 开发成本相对较低 - 与…

C++码表之Unicode

今日诗词: 折花逢驿使,寄与陇头人。 江南无所有,聊赠一枝春。 ——《赠范晔诗》【南北朝】陆凯 引言: 上一期我们说到了ASCII码表,这是一种现如今不是那么通用的机制,随着计算机的普及,越来越…

电脑ip地址为什么会自己变更?电脑ip怎么改

在当今这个高度依赖互联网的时代,IP地址作为网络设备的身份标识,其稳定性和可管理性对于网络通信的顺畅至关重要。然而,许多用户可能会遇到电脑IP地址自动变更的情况,这不仅可能影响到网络连接的稳定性,还可能给远程访…

怎么使用win10录屏快捷键 ?分享三款录屏工具

录屏软件在我们日常生活中越来越常见,无论是做教程、记录游戏精彩瞬间还是进行远程教学,一个好的录屏软件都能让我们的生活变得更加便捷。不少人也会选怎win10自带的录屏,使用WIN10 录屏快捷键【winG】,就可以唤出录屏工具&#x…

【Node】【1】node和nvm安装

安装nvm、node、npm 安装node 18 ,最简单的办法是使用nvm,就不用手动安装了,那么就得先安装nvm。 NVM 是Node Version Manager,用于管理 Node.js 版本。你设备上的不同项目可能使用不同版本的 Node.js。通过 nvm,用户…

Redis | 非关系型数据库Redis的初步认识

本节内容相对理论,着重看基础通用命令这一节 Redis 非关 kv型{字典} 概念应用ubuntu安装配置 windows添加密码 可能问题【ubuntu】远程连接 基础通用命令 ⭐ 概念 特点: 1、开源的,使用C编写,基于内存且支持持久化 2、没有表 支持…

ssrf例题分析

我们第一步先在ubuntu中解压web-ssrfme.zip,更新镜像后重启容器。 我们可以看到代码中成功拉取到ssrfme镜像 ig(preg_match(/file\:\/\/|dict\:\/\/.|\.\.\/|127.0.0.1|localhost/is,$url,$match)) 使用端口访问文件&…

【Linux系列】SH 与 BASH 的区别:深入解析与使用案例

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Leetcode JAVA刷刷站(93)复原IP地址

一、题目概述 二、思路方向 为了解决这个问题,我们可以使用回溯算法。回溯算法在这里非常适用,因为我们需要尝试在字符串中的不同位置插入点(.)来分割出可能的IP地址段,并且需要验证每个段是否满足条件(即…

如何使用ssm实现铁岭河医院医患管理系统+vue

TOC ssm077铁岭河医院医患管理系统vue 系统概述 进过系统的分析后,就开始记性系统的设计,系统设计包含总体设计和详细设计。总体设计只是一个大体的设计,经过了总体设计,我们能够划分出系统的一些东西,例如文件、文…