FLV格式分析

news2025/1/18 9:53:31

1.FLV封装格式简介

FLV(Flash Video)是Adobe公司推出的⼀种流媒体格式,由于其封装后的⾳视频⽂件体积小、封装简单等特点,⾮常适合于互联⽹上使⽤。⽬前主流的视频⽹站基本都⽀持FLV。采⽤ FLV格式封装的⽂件后缀为.flv。

2.FLV封装格式分析

FLV封装格式是由**⼀个⽂件头(file header)**和 **⽂件体(file Body)**组成:

FLV body由⼀对对的(Previous Tag Size字段 + tag)组成,Previous Tag Size字段排列在Tag之前,占⽤ 4个字节。**Previous Tag Size记录了前⾯⼀个Tag的大小,⽤于逆向读取处理。**FLV header 后的第⼀个Pervious Tag Size的值为0。

Tag⼀般可以分为3种类型:

  • 脚本(帧)数据类型
  • ⾳频数据类型
  • 视频数据

FLV数据以⼤端序进⾏存储,在解析时需要注意。

⼀个标准FLV⽂件结构如下图:

在这里插入图片描述

FLV⽂件的详细内容结构如下图:

在这里插入图片描述

3.FLV封装格式详细解析

3.1.FLV解析流程

在这里插入图片描述

3.2.FLV header

FLV头的结构如下:

FieldTypeComment
签名UI8F’(0x46)
签名UI8‘L’(0x4C)
签名UI8‘V’(0x56)
版本UI8FLV的版本。0x01表示FLV版本为1
保留字段UB5前五位都为0
⾳频流标识UB1是否存在⾳频流
保留字段UB1为0
视频流标识UB1是否存在视频流
⽂件头⼤⼩UI32FLV版本1时填写9,表明的是FLV头的⼤小

数据type中,UI表示⽆符号整形,后⾯跟的数字表示其⻓度是多少位,比如:UI8,表示⽆符号整形,⻓度⼀个字节UI24是三个字节,UI[8*n]表示多个字节。UB表示位域,UB5表示⼀个字节的5位。可以参考c中的位域结构体。

FLV头占9个字节,⽤来标识⽂件为FLV类型,以及后续存储的⾳视频流,⼀个FLV⽂件,每种类型的tag都属于⼀个流,也就是⼀个flv⽂件最多只有⼀个⾳频流,⼀个视频流,不存在多个 独立的音视频流在⼀个文件的情况

3.3.FLV Body

在这里插入图片描述

FLV Header之后,就是FLV File Body。FLV File Body是由⼀连串的back-pointers + tags构成。 Back-pointer表示Previous Tag Size(前⼀个tag的字节数据⻓度),占4个字节。

3.4.FLV Tag tag header

每⼀个Tag也是由两部分组成:tag header和tag data。Tag Header⾥存放的是当前tag的类型、数据区(tag data)的⻓度等信息。

tag header⼀般占11个字节的内存空间。FLV tag header结构如下:

FieldTypeComment
Tag类型 TypeUI88:audio 9:video 18:Script data(脚本数据) all Others:reserved 其他所有值未使⽤
数据区⼤小UI24当前tag的数据域的⼤⼩,不包含tag header。 Length of the data in the Data field
时间戳TimestampUI24当前帧时戳,单位是毫秒。相对值,第⼀个tag的时戳总是为0
时戳扩展字段 TimestampExtendedUI8如果时戳⼤于0xFFFFFF,将会使⽤这个字节。这个字节是 时戳的⾼8位,上⾯的三个字节是低24位。
StreamIDUI24总是为0
数据域UI[8*n]数据域数据

1.flv⽂件中Timestamp和TimestampExtended拼出来的是dts。也就是解码时间。 Timestamp和TimestampExtended拼出来dts单位为ms。(如果不存在B帧,当然dts等于 pts)

2.CompositionTime 表示PTS相对于DTS的偏移值, 在每个视频tag的第14~16字节 。 显示时间(pts) = 解码时间(tag的第5~8字节) + CompositionTime CompositionTime的单位也是ms 。

3.Script data脚本数据就是描述视频或⾳频的信息的数据,如宽度、⾼度、时间等等,⼀个⽂ 件中通常只有⼀个元数据,⾳频tag和视频tag就是⾳视频信息了,采样、声道、频率,编码等 信息。

3.5.FLV Tag data

FLV Tag data,在FLV Tag Header之后,分为MetaData Tag、Audio Tag、Video Tag。

3.5.1.MetaData Tag

MetaData Tag存放⼀些关于FLV视频和⾳频的元信息,⽐如:duration、width、 height等,通常该类型Tag会作为FLV⽂件的第⼀个tag,并且只有⼀个,跟在File Header后

在这里插入图片描述

从上图可以得到:

  • 第一个PreviousTagSize值是0
  • MetaData Tag 的类型是12
  • 记录的信息有duration(5.12秒)、width(768)、height(320)、videodatarate(码率207.260)、framerate(帧率25)
3.5.2.Audio Tag

⾳频Tag Data区域开始的:

  • 第⼀个字节包含了⾳频数据的参数信息
  • 第⼆个字节开始为⾳频流数据

注意:这两个字节属于tag的data部分,不是header部分。

第⼀个字节为⾳频的信息格式如下:

FieldTypeComment
⾳频格式 SoundFormatUB40 = Linear PCM, platform endian 2 = MP3 10 = AAC
采样率 SoundRateUB2对于AAC总是3(这个参数对于AAC意义不⼤)
采样精度 SoundSizeUB10 = snd8Bit 1 = snd16Bit 此参数仅适⽤于未压缩的格式,压缩后的格式都是将其设为1
⾳频声道 SoundTypeUB10 = sndMono 单声道 1 = sndStereo ⽴体声,双声道 (对于AAC总是1)

第⼆个字节开始为⾳频数据(需要判断该数据是真正的⾳频数据,还是⾳频config信息)

3.5.3.Video Tag

视频Tag Data开始的:

  • 第⼀个字节包含视频数据的参数信息

  • 第⼆个字节开始为视频流数据

第⼀个字节包含视频信息,格式如下:

在这里插入图片描述

第⼆个字节开始为视频数据 :

在这里插入图片描述

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

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

相关文章

视频监视计划和设计软件丨IP Video System Design Tool功能简介

本软件提供快速轻松地设计现代视频监视系统之新方式 产品功能 • 降低寻找更好的视频摄像机位置的成本时,增加您的安全系统效能。 • 极短时间内,即可计算出精确的摄像机镜头焦距长度与视角。 • 使用2D和3D建模,检查每台摄像机的视野并寻…

新应用——合同管理应用,实现合同无纸化管理

合同管理应用,是建立在低代码技术基础上,结合企业的管理方式,为企业提供决策、计划、控制与经营绩效评估的全方位、系统化的合同管理解决方案。百数合同管理系统应用提供了从合同模板、合同签订、合同收付款和合同发票管理、合同归档&#xf…

我是如何两个月通过软件设计师的!

软设刚过,分享下经验 个人感觉不是很难,我都不好意思说我没怎么复习,本来以后自己要二战了,没想到,成绩还挺惊喜,大概是因为最后几天冲刺到点子上了。 攻略: 搜集资料,搜集考试相…

一、Kubernetes介绍

文章目录1.常见容器编排工具2.kubernetes简介3.kubernetes组件4.kubernetes概念1.常见容器编排工具 Swarm:Docker自己的容器编排工具Mesos:Apache的一个资源统一管控的工具,需要和Marathon结合使用Kubernetes:Google开源的的容器…

vector的实现和使用中的常见错误

文章目录实现构造函数时的调用模糊实现insert函数时的迭代器失效使用erase函数时的迭代器失效实现reserve函数使用memcpy函数导致的浅拷贝实现构造函数时的调用模糊 vector的构造函数有这四种,其中有两种在实例化的时候会有调用模糊的问题&#xff1a; vector<int> v(10…

SpringBoot自定义配置的提示

文章目录1. 引入依赖2. 开启 IDEA 配置3. 使用 ConfigurationProperties 自定义配置4. 编译项目&#xff0c;自动生成 spring-configuration-metadata.json 文件文件中的属性值介绍5. 可以看到有提示了官方文档&#xff1a;https://docs.spring.io/spring-boot/docs/2.2.2.RELE…

机器视觉(七):图像分割

目录&#xff1a; 机器视觉&#xff08;一&#xff09;&#xff1a;概述 机器视觉&#xff08;二&#xff09;&#xff1a;机器视觉硬件技术 机器视觉&#xff08;三&#xff09;&#xff1a;摄像机标定技术 机器视觉&#xff08;四&#xff09;&#xff1a;空域图像增强 …

whistle的使用【前端抓包】

前言 抓包工具看起来只是测试要用的东西&#xff0c;其实对前端作用也很多&#xff0c;因为我们也要模拟请求、mock数据、调试。站在巨人肩膀上永远不亏! whistle能解决的痛点 一、看请求不方便 跳页、支付时候上一页的请求结果看不到&#xff0c;h5、小程序newWork不能在电…

Raki的读paper小记:Continual Learning of Natural Language Processing Tasks: A Survey

第一次写综述的小记&#xff0c;也将是我读完的第一篇综述&#xff08; 最开始因为可乐老师的原因&#xff0c;接触到了持续学习&#xff0c;然后从一开始的音频到自己读了一些ICLR的paper找idea做NLP的持续学习&#xff0c;然后做了自己第一个粗糙的工作&#xff0c;在杰哥的…

Hadoop高手之路9-Azkaban工作流管理器

文章目录Hadoop高手之路9-Azkaban工作流管理器一、工作流概述1. 工作流简介2. 常见的工作流调度工具1) Azkaban2) Oozie二、Azkaban简介1. Azkaban组成结构2. Azkaban的部署模式1) solo-server mode&#xff08;独立服务器模式&#xff09;2) two server mode&#xff08;双服务…

8Manage SRM:使用采购管理软件进入现代化模式

在企业运营发展中&#xff0c;采购组织一直是一个非常重要的部门&#xff0c;它会直接影响企业的采购成本效益。在采购活动中&#xff0c;如果采用传统线下的采购方式&#xff0c;容易导致采购信息不集中&#xff0c;效率低&#xff0c;出错率高&#xff0c;最终损害企业的利益…

社区发现系列02-算法介绍

hello, 大家好&#xff0c;欢迎来到阿君聊风控&#xff0c;我是阿君&#xff08;一名有7年互金和电商风控经验的算法工程师&#xff09;。在上篇文章https://blog.csdn.net/u010569893/article/details/128565829?spm1001.2014.3001.5502 中我们了解到可以用社区发现技术来对图…

全面兼容各端的动画库PAG,对标Lottie

感谢Tencent 开源了PAG库&#xff0c;终于有了国人自己的动画库了&#xff0c;该库兼容&#xff1a;移动端&#xff0c;桌面端&#xff0c;&#xff0c;WEB端&#xff0c;还有小程序端&#xff0c;真可谓用心了&#xff0c;而且PAG库相对其他库&#xff0c;使用的pag文件更小&a…

《UEFI内核导读》SecCore与PeiCore简介(I)

敬请关注&#xff1a;“固件C字营 SecCore也被称之为VTF&#xff0c;被映射到Boot Firmware Volume (BFV)&#xff0c;BFV的地址被放置在0xFFFFFFE0连续的4个字节&#xff08;小端模式&#xff09;。 SecCore 是一个FFS firmware file&#xff0c;其文件末端地址与于BFV的末端…

磨金石教育摄影技能干货分享|摄影拼贴技法的运用与效果

河南省-黄阳惠智-《那是山吗》画面中是一片群山景象。我们看上去感觉像是画出来的&#xff0c;又像是电脑做的图。其实这是摄影师用了中国山水画的特有表现手法&#xff0c;对桂林山水的景象&#xff0c;进行了拼贴在创造。作者用一些非山非水的现代物品&#xff0c;像织女一样…

【记录一】gis理论

gis地图相关一、gis 理论知识二、fianlshell连接服务器连接服务器命令行记录三、geoserver地图服务器初识geoserver添加新图层最近图层样式修改图层样式新增编辑图层的样式四、git上传代码查看远程地址上传代码时新建tag一、gis 理论知识 二、fianlshell连接服务器 连接服务器…

【小知识点】免费头像API,用 Python Flask 动态生成一个汉字头像

本案例是 爬虫训练场 项目的衍生案例&#xff0c;用于渲染用户头像&#xff0c;大家也可以将该接口用于其它目的。 本文会使用随机汉字生成技术&#xff0c;如未掌握&#xff0c;可以查看 Python 随机生成一个汉字 文章目录基础环境配置加载本地 txt 文件&#xff0c;用于随机生…

打包安卓apk后的V1和V2签名

前言&#xff1a;打包apk后上架之前需要进行加固&#xff0c;加固后生成的apk文件需要进行重新签名&#xff1b;单独的apk文件可以使用基于JDK&#xff08;需要安装java jdk&#xff09;和SDK&#xff08;需要下载android studio 开发工具&#xff09;的命令进行手动签名。安装…

【Maven】核心概念

Maven的核心概念一、Maven工程中约定的目录结构二、仓库管理&#x1f3b6;仓库的概述&#x1f3b6;仓库的分类本地仓库所在位置的设置重写更改本地仓库路径&#xff0c;不使用默认路径有什么好处呢&#xff1f;&#x1f3b6;Maven对仓库的使用三、POM工程的唯一标识依赖&#x…

数据结构与算法:泛型初学习

1.包装类 java中的数据类型int&#xff0c;double等不是对象&#xff0c;无法通过向上转型获取到Object提供的方法&#xff0c;而像String却可以&#xff0c;只因为String是一个对象而不是一个类型。基本数据类型由于这样的特性&#xff0c;导致无法参与转型&#xff0c;泛型&…