FLV 格式详解资料整理,关键帧格式解析写入库等等

news2024/9/26 3:22:36

FLV 是一种比较简单的视频封装格式。大致可以分为 FLV 文件头,Metadata元数据,然后一系列的音视频数据。

资料够多:

FLV格式解析图

知乎用户 @Linux服务器研究 画了一张格式解析图,比较全,但默认背景是白色,太过刺眼。我用 photopea 改为黑暗模式,更适合程序员参考(请拖拽到新标签页,放大食用):

在这里插入图片描述

一个 C# 写的FLV转录库,我把他转换为 Java

Flv-streamer-2-file

作用是输入FLV视频流,实时解析,实时更新视频时长(duration)。

库是好库,c#也是好语言,但没有 Java 简单易懂。

理解一个格式,最好的方式就是用 Java 写个解析转换库。 —— ME

我将之转换为 Java ,添加写入关键帧索引的功能,一切竟然如此简单,宛若拨云见月。

Appxmod / Flv-stream-saver-java: Pure Java library to parse and save flv stream, with keyframes support.

关键帧索引

关键帧索引指的是:一系列关键帧的时间点,映射到 ==> 文件偏移。

关键帧索引位于 onMetadata 元数据。Metadata 是一个 AMF 编码的 EcmaArray ,可以把它当作一个有序的 HashMap<String, Object>。在上面的 Java 库中,我用 JSON 存储解析结果。

关键帧索引(keyframes)就存于 Metadata[“keyframes”] 之中,格式如下:

keyframes (AsObject)
– times (Strict Array)
– filepositions (Strict Array)

AsObject 类似于 EcmaArray,唯一区别是写入时,不写数组长度。

Strict Array 可以看作 ArrayList。数字以 double 方式存储。两个 Strict Array 的长度相等。

times 时间点的单位是秒。filepositions 文件位置的单位是字节,位置是关键帧的起始地址,即 previous tagsize。

关键帧是特殊的帧,有别于 inter frame 等。关键帧索引有助于快速 seek,但不是唯一因素。播放器的支持也很重要。有的即使没有索引,也能用二分法快速 seek 。

FLV 文件中,除了开头九个字节,其他都是TAG。TAG类型有 SCRIPTDATA,AUDIO,VIDDEO,类型标于 TAG HEADER 中。TAG HEADER 11个字节,仅靠 previous tagsize 4个字节,后面就是 TAGDATA。TAGDATA 又有自己的 HEADER 头,其中第一个字节标明当前是否是关键帧。若是,则此字节高数位四位等于1 ( byte>>4==1 )。

SCRIPTDATA 并非脚本,而是数据。Metadata 就是此类型的一个 TAG,一般位于文件头部位置,所以存储关键帧索引时,通过预留位置的方式,最大存储6000多个索引(大小可调)。

【 previous tag size / tag header / tag data 】

tag header 11个字节,其中也包含当前 tag data 的大小。与 previous tag size 不同的是,tag header 中的本TAG大小存储于其中 3 个字节,仅包括 tag data。 所以之后的 previous tag size == 本 tag_data.length + 11。

除了关键帧索引,还有 avc nalu 啥的有助于网络流媒体快速播放。太过复杂没有研究,但是参考链接中有人用 c# 研究了。

参考链接

全部链接见上面我写的 Java 库GitHub地址。

除了参考链接,还有一些在线或离线的FLV工具,可以查看 metaedata、查看关键帧等,编写过程离不开这些。
请添加图片描述

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

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

相关文章

2024年职业院校人工智能实训室方案解读(融入AIGC技术)

随着人工智能技术的飞速发展&#xff0c;职业院校作为技能型人才培养的重要基地&#xff0c;亟需加强人工智能实训室的建设&#xff0c;以应对市场需求和行业变革。该方案不仅涵盖了全面的人工智能教学内容&#xff0c;还融入了AIGC&#xff08;Artificial Intelligence Genera…

k8s笔记——kubebuilder实战

kubebuilder Kubebuilder 是一个基于 CRD 来构建 Kubernetes API 的框架&#xff0c;可以使用 CRD 来构建 API、Controller 和 Admission Webhook。 动机 目前扩展 Kubernetes 的 API 的方式有创建 CRD、使用 Operator SDK 等方式&#xff0c;都需要写很多的样本文件&#x…

​微图在线显示高程为什么与下载结果不一致

之前有客户向我们提出了在线显示的高程值和下载的数据高程值不一致的问题&#xff0c;这里解释一下不一致的原因。 在线显示 在线的情况分成两种&#xff0c;一种是浏览高程数据渲染地图&#xff0c;一种是非高程数据渲染地图&#xff0c;例如高清影像&#xff08;WGS84&…

小小GCD、LCM拿下拿下

目录 最大公约数&#xff08;GCD&#xff09; 最大公约数&#xff08;GCD&#xff09;求解&#xff1a; 一、辗转相除法 二、三目运算符 三、位运算 最大公约数&#xff08;GCD&#xff09;模板&#xff1a; 最大公约数&#xff08;GCD&#xff09;例题&#xff1a; 最…

SprinBoot+Vue酒店管理系统的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质…

安宝特方案 | 医疗AR眼镜,重新定义远程会诊体验

【AR眼镜&#xff1a;重新定义远程会诊体验】 在快速发展的医疗领域&#xff0c;安宝特医疗AR眼镜以其尖端技术和创新功能&#xff0c;引领远程会诊的未来&#xff0c;致力于为为医生和患者带来更高效、精准和无缝的医疗体验。 探索安宝特医疗AR眼镜如何在医疗行业中引领新风潮…

DolphinScheduler应用实战笔记

DolphinScheduler应用实战笔记 一、前言二、DS执行SQL或存储过程二、DS调用DataX同步数据三、DS调用HTTP接口四、DS依赖(DEPENDENT)节点五、DS SPARK 节点六、DS Flink 节点七、DS Flink 节点八、DS SQL 节点九、DS Java程序十、DS Python节点 一、前言 DolphinScheduler&…

Java实现在线聊天室

分为客户端和服务器端两个部分。服务器负责处理客户端之间的通信&#xff0c;客户端则提供一个用户界面来发送和接收消息。 技术栈 Java语言SocketSwingUI 要点 一个服务端&#xff0c;多台客户端每个客户端登录时输入用户名消息格式化&#xff1a;服务器接收到消息时&#…

数据资产管理:真能推动数据要素市场发展还是只是空谈?

数据资产管理&#xff1a;真能推动数据要素市场发展还是只是空谈&#xff1f; 前言数据资产管理 前言 数据已成为企业和组织的重要资产&#xff0c;其价值的充分发挥对于推动业务发展和提升竞争力至关重要。数据资产管理作为一种有效的管理手段&#xff0c;正逐渐受到广泛关注…

Open Source, Open Life 第九届中国开源年会论坛征集正式启动

中国开源年会 COSCon 是业界最具影响力的开源盛会之一&#xff0c;由开源社在2015年首次发起&#xff0c;而今年我们将迎来第九届 COSCon&#xff01; 以其独特定位及日益增加的影响力&#xff0c;COSCon 吸引了越来越多的国内外企业、高校、开源组织/社区的大力支持。与一般企…

java基础(1)数据类型,运算符,逻辑控制语句以及基本应用

目录 ​编辑 1.前言 2.正文 2.1数据类型与变量 2.1.1字面常量 2.1.2数据类型 2.1.3变量 2.1.3.1整型 2.1.3.2浮点型 2.1.3.3字符型 2.1.3.4布尔型 2.1.4类型转换与类型提升 2.1.4.1字符串的拼接 2.1.4.2整型转字符串 2.1.4.3字符串转整数 2.2运算符 2.2.1算术运…

小红书笔记数单日突破1.3万,8月全网都被这只猴子刷屏了!

8月20日早上10点&#xff0c;《黑神话&#xff1a;悟空》正式发布后立刻席卷全网&#xff0c;众多玩家在游戏正式发布后火速进入游戏界面&#xff0c;甚至有多家公司宣布放假让员工玩《黑神话悟空》&#xff0c;不论是玩游戏的、还是不玩游戏的&#xff0c;都为之献上巨大的关注…

一个让LLM更具创造力的“超级提示词“

1. “超级提示词” 开源项目简介 Github 上最近开源了一个名为 “超级提示词” (Super Prompt) 的项目&#xff0c;该项目旨在激发大语言模型&#xff08;LLM&#xff09;的创造力和发散思维。通过输入这些提示词&#xff0c;LLM 能够生成更多新颖的想法&#xff0c;对于需要创…

Linux网络:总结协议拓展

1. TCP/IP四层模型总结 2. 网络协议拓展 DNS协议&#xff08;地址解析协议&#xff09; TCP/IP使用IP地址和端口号来确定网络中一台主机的一个程序。 但是这样标定不方便记忆&#xff0c;于是开始引出主机名&#xff08;字符串&#xff09;&#xff0c;使用hosts文件来描述…

Monte Carlo方法解决强化学习问题

本文继续深入探讨蒙特卡罗 (MC)方法。这些方法的特点是能够仅从经验中学习,不需要任何环境模型,这与动态规划(DP)方法形成对比。 这一特性极具吸引力 - 因为在实际应用中,环境模型往往是未知的,或者难以精确建模转移概率。以21点游戏为例:尽管我们完全理解游戏规则,但通过DP方…

智慧教室无纸化同屏方案是否适用RTMP?

智慧教室无纸化方案技术背景 智慧教室无纸化方案是一种基于现代信息技术&#xff0c;旨在通过数字化手段实现教学过程的无纸化、智能化和高效化的解决方案。该方案以学生为中心&#xff0c;强调互动化的数字教学服务&#xff0c;旨在提升教学质量和学习效率&#xff0c;同时减…

SprinBoot+Vue宠物店管理系统的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质…

Comsol 双层薄板夹芯结构声辐射响应

阻尼双层板的声辐射特性可以通过以下原理进行解释&#xff1a; 1. 双层板的振动模态&#xff1a;当双层板受到外力作用时&#xff0c;会发生振动&#xff0c;其振动模态会影响其声辐射特性。在双层板内部&#xff0c;振动模态分为两种类型&#xff1a;弯曲模态和剪切模态。而在…

ADG切换异常

一、问题现象 备库切换主库的过程中&#xff1a; alter database commit to switchover to primary with session shutdown; 有一个进程始终是active状态&#xff0c;导致无法完成切换。 主库已切换成&#xff1a;RECOVERY NEEDED --备用数据库还没有接收到切换请求 SWITC…

(Lane Detection-3)PVALane————OpenLane数据集的SOTA模型

PVALane作为最新的SOTA模型&#xff0c;横空出世&#xff0c;让我们来一起仔细阅读这篇文章 提出问题 上图展示了当前Lane Detection中的主要问题&#xff1a; 受益于3D物体检测的成功&#xff0c;当前的3D车道线检测模型&#xff08;通常通过使用逆透视映射&#xff08;IPM&…