当前位置: 首页 > news >正文

音视频入门基础:FLV专题(10)——Script Tag实例分析

一、引言

在《音视频入门基础:FLV专题(9)——Script Tag简介》中对FLV文件的Script Tag进行了简介。下面用一个具体的例子来对Script Tag进行分析。

二、Script Tag的Tag header实例分析

用notepad++打开《音视频入门基础:FLV专题(2)——使用FFmpeg命令生成flv文件》中生成的FLV文件,下图红框中的就是第一个Tag的Tag header。可以看到Tag header为0x12 0x00 0x01 0x73 0x00 0x00 0x00 0x00 0x00 0x00 0x00。关于Tag header定义可以参考:《音视频入门基础:FLV专题(7)——Tag header简介》:

红框中的Tag header的第1个字节为0x12,即0b00010010。所以Filter的值为0,表示该Tag未加密。TagType为0x12,表示该Tag为脚本Tag(Script Tag)。

红框中第2到第4个字节为0x00 0x01 0x73,即十进制的371。所以整个Tag data的长度为371字节,由于该Tag为Script Tag,它的Tag data就是SCRIPTDATA。而从《音视频入门基础:FLV专题(9)——Script Tag简介》中可以知道,未加密的情况下,Script Tag的Tag header之后就是SCRIPTDATA。SCRIPTDATA的首地址为0x18,所以SCRIPTDATA最后一个字节的地址 = 0x18 + 0x000173(十进制的371) - 1 = 0x18A。所以下图红框中的就是该Script Tag的SCRIPTDATA,即该Script Tag的ScriptTagBody:

三、Script Tag的ScriptTagBody实例分析

(一)ScriptTagBody的Name属性

从《音视频入门基础:FLV专题(9)——Script Tag简介》中可以知道,ScriptTagBody = Name + Value;

ScriptTagBody的Name = 1字节的值为2的Type + 2字节的StringLength + 可变长的StringData。

所以下图红框中的“0x02”为Name的Type,表示ScriptDataValue的类型为String(字符串):

所以下图红框中的“0x00 0x0A”为Name的StringLength,表示要存贮的字符串的长度为0x000A个字节,也就是十进制的10个字节:

所以下图红框中的“onMetaData”,总共10个字节为Name的StringData,表示该Tag是一个名称为“onMetadata”的Script Tag:

(二)ScriptTagBody的Value属性

从《音视频入门基础:FLV专题(9)——Script Tag简介》中可以知道,

ScriptTagBody的Value = 1字节的值为8的Type + 4字节的ECMAArrayLength + Variables数组 + 3字节的终止符(值固定为0,0,9)。

所以下图红框中的“8”为Value的Type,表示ScriptDataValue的类型为ECMA数组:

下图红框中的“0x00 0x00 0x00 0x10”为Value的ECMAArrayLength ,表示ECMA数组中的元素个数为0x10个,也就是16个:

下图红框中的“0x00 0x00 0x09”为Value的3字节的终止符:

下图红框中的为Value的Variables数组。 从《音视频入门基础:FLV专题(9)——Script Tag简介》中可以知道,名称为“onMetadata”的Script Tag中,其Variables数组中的每个元素都分别为一个元数据属性,用来存贮当前文件的一些基本信息,比如视频和音频的编解码器ID、视频的分辨率、文件大小、文件总时长、创建日期等:

四、onMetaData的Variables数组实例分析

从《音视频入门基础:FLV专题(9)——Script Tag简介》中可以知道,Variables属性是一个数组。

Variables数组中某个元素 = PropertyName + PropertyData;

Variables数组中某个元素的PropertyName =  2字节的StringLength + 可变长的StringData;

Variables数组中某个元素的PropertyData = 1字节的值为0到12的Type + ScriptDataValue;

下图红框中的“0x00 0x08”为Variables数组中第一个元素的PropertyName中的StringLength,表示该元素要存贮的字符串的长度为0x0008个字节,也就是十进制的8个字节:

所以下图红框中的“duration”,总共8个字节为PropertyName的StringData,表示该元数据属性存贮的是该FLV文件的总时长,以秒为单位:

下图红框中的“0x00”为Variables数组中第一个元素的PropertyData中的Type,值为0表示ScriptDataValue为DOUBLE类型:

根据《swf-file-format-spec.pdf》第16页,DOUBLE类型为双精度(64位)兼容IEEE标准754。64位表示存贮DOUBLE类型数据需要占用8个字节:

所以下图红框中的“0x40 0x29 0xCC 0xCC 0xCC 0xCC 0xCC 0xCC”为该DOUBLE类型数据:

由 在线IEEE浮点二进制计算器工具 - ToolTT在线工具箱 中的IEEE 754标准浮点计算器,可以算出来“0x40 0x29 0xCC 0xCC 0xCC 0xCC 0xCC 0xCC”对应的十进制浮点数为12.9。所以Variables数组中duration元数据属性的值为12.9,表示该FLV文件的总时长为12.9秒:

Variables数组中的其它元数据属性读取方式跟duration差不多,以此类推。

五、用flvAnalyser工具分析Script Tag

用flvAnalyser工具可以直接显示Script Tag的SCRIPTDATA:

下图红框中的为ScriptTagBody的Name:

下图红框中的为ScriptTagBody的Value的ECMAArrayLength,表示ECMA数组中的元素个数为16个:

下图红框中的为ScriptTagBody的Value的Variables数组,可以看到正好有16个元素:

下图红框中的为ScriptTagBody的Value的3字节的终止符:

相关文章:

音视频入门基础:FLV专题(10)——Script Tag实例分析

一、引言 在《音视频入门基础:FLV专题(9)——Script Tag简介》中对FLV文件的Script Tag进行了简介。下面用一个具体的例子来对Script Tag进行分析。 二、Script Tag的Tag header实例分析 用notepad打开《音视频入门基础:FLV专题…...

国外问卷调查匠哥已经不带人了,但是还可以交流

国外问卷调查匠哥已经不带人了,但是还可以来和匠哥交流, 为啥不带人了呢? 从今年年初开始,匠哥在带学员的过程中发现: 跟往年同样的收费,同样的教学,甚至我付出的时间精力比以前还多&#xff…...

Linux 进程的基本概念及描述

目录 0.前言 1. 什么是进程 1.1 进程的定义与特性 1.2 进程与线程的区别 2.描述进程 2.1 PCB (进程控制块) 2.2 task_struct 3.查看进程 3.1 查看进程信息 3.1.1 /proc 文件系统 3.1.2 ps 命令 3.1.2 top 和 htop 命令 3.2 获取进程标识符 3.2.1使用命令获取PID 3.2.2 使用C语言…...

【C++】透过STL源代码深度剖析vector的底层

✨ Blog’s 主页: 白乐天_ξ( ✿>◡❛) 🌈 个人Motto:他强任他强,清风拂山冈! 🔥 所属专栏:C深入学习笔记 💫 欢迎来到我的学习笔记! 参考博客:【C】透过STL源…...

ubuntu 开启root

sudo passwd root#输入以下命令来给root账户设置密码 sudo passwd -u root#启用root账户 su - root#要登录root账户 root 开启远程访问: 小心不要改到这里了:sudo nano /etc/ssh/ssh_config 而是:/etc/ssh/sshd_config sudo nano /etc/ssh…...

使用 Llama 3.1 和 Qdrant 构建多语言医疗保健聊天机器人的步骤

长话短说: 准备好深入研究: 矢量存储的复杂性以及如何利用 Qdrant 进行高效数据摄取。掌握 Qdrant 中的集合管理以获得最佳性能。释放上下文感知响应的相似性搜索的潜力。精心设计复杂的 LangChain 工作流程以增强聊天机器人的功能。将革命性的 Llama …...

【Linux-基础IO】如何理解Linux下一切皆文件磁盘的介绍

目录 如何理解Linux系统上一切皆文件 1.物理角度认识磁盘 2.对磁盘的存储进行逻辑抽象 磁盘寻址 3.磁盘中的寄存器 如何理解Linux系统上一切皆文件 计算机中包含大量外设,操作系统想要管理好这些外设,就必须对这些外设进行先描述再组织&#xff0c…...

Golang | Leetcode Golang题解之第436题寻找右区间

题目: 题解: func findRightInterval(intervals [][]int) []int {n : len(intervals)type pair struct{ x, i int }starts : make([]pair, n)ends : make([]pair, n)for i, p : range intervals {starts[i] pair{p[0], i}ends[i] pair{p[1], i}}sort.…...

微服务SpringSession解析部署使用全流程

目录 1、SpringSession简介 2、实现session共享的三种方式 1、修改Tomcat配置文件 2、Nginx负载均衡策略 3、redis统一存储 0、准备工作 1、本地服务添加依赖 2、修改本地服务配置文件 3、添加application.properties文件 4、添加nacos - redis配置 5、修改本地项目…...

自动驾驶 3DGS 学习笔记

目录 street_gaussians gsplat依赖项 运行报错: python>3.9 SGD: Street View Synthesis with Gaussian Splatting and Diffusion Prior 差分高斯光栅化 diff-gaussian-rasterization street_gaussians https://github.com/zju3dv/street_gaussians gsp…...

【C++笔试强训】如何成为算法糕手Day5

学习编程就得循环渐进,扎实基础,勿在浮沙筑高台 循环渐进Forward-CSDN博客 目录 循环渐进Forward-CSDN博客 第一题:游游的you 思路: 第二题:腐烂的苹果 思路: 第三题:孩子们的游戏 思路&…...

【Qt】无IDE的Gui程序快速开始

Qt安装 在 Windows 上安装 Qt 的步骤如下: 下载 Qt 安装程序 访问 Qt 的官方网站:Qt Downloads。点击“Download”按钮,下载 Qt Online Installer(在线安装程序)。 运行安装程序 双击下载的 QtInstaller.exe 文件…...

Python编码系列—Python备忘录模式:掌握对象状态保存与恢复技术

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…...

linux常用命令汇编(持续更新)

一、用户提示符 # root账号提示符 $ 普通用户提示符 二、关闭计算机 shutdown(安全有序地关闭计算机) 语法:shutdown [options] [time] [message] shutdown -h now #立即关机(--halt/终止) shutdown -r now #重…...

AI面试指南:AI工具总结评测,助力求职季

AI面试指南:AI工具总结评测,助力求职季 摘要: 在竞争激烈的AI领域秋招季,准备充分并借助高效工具是提升面试通过率的关键。本文主要介绍一些针对秋招的AI面试工具和学习资源,分为简历优化、面试助手、手撕代码练习三个…...

大二考核题解

大二考核题解 题号题目考察知识点A有意思的监考二分答案B海绵宝宝的数独DFSC走楼梯递推D碱基配对kmpE好简单的题啊,写它!最短路 写在前面: 整体难度不大,代码能力需要一些,正常来说至少要会3题以上 A 有意思的监考 …...

深入解析:Kubernetes 如何使用 etcd 作为配置中心和注册中心

在 Kubernetes 中,etcd 是核心的分布式存储组件,负责存储和管理集群的所有配置信息、状态数据以及服务注册信息。etcd 的高可用性和强一致性使得它成为 Kubernetes 的 “source of truth”,确保集群能够动态、高效地管理资源,并保…...

MQ高级:RabbitMQ小细节

在之前的学习中,我们只介绍了消息的发送,但是没有考虑到异常的情况,今天我们就介绍一些异常情况,和细节的部分。 目录 生产者可靠性 生产者重连 生产者确认 MQ可靠性 持久化 Lazy Queue 消费者可靠性 消费者确认机制 失…...

期权卖方怎么选择权利金高的品种,期货VIX高低对行情有什么影响

VIX指数——全称为芝加哥期权交易所市场波动率指数,俗称恐慌指数。 是衡量波动性的重要指标。VIX指数上升,预期未来市场波动性会增加。VIX指数下降,预期未来市场波动性会降低。 期货VIX指数最新价格排序 期权卖方尽量选择期货VIX指数在25以…...

内存对齐的原理和使用

1. 什么是内存对齐? 内存对齐是指将数据存储在内存中时,按照数据类型的大小,将数据放在特定的内存边界上。例如,4 字节的 int 通常放在能够被 4 整除的地址上,8 字节的 double 则放在能被 8 整除的地址上。 2. 为什么…...

告别答辩PPT焦虑:百考通AI如何智能化解你的毕业展示难题

当你终于为论文画上最后一个句号,准备迎接毕业的曙光时,答辩PPT的制作却往往成为压垮学生的最后一根稻草。面对这份看似简单却暗藏玄机的任务,百考通AI为你提供智能解决方案。 深夜,当你的论文最后一个字终于落定,一种…...

BMS工程师必看:实测案例解析50-108MHz频段超标如何整改(滤波/接地/屏蔽实战)

BMS工程师实战指南:50-108MHz频段EMC超标问题深度解析与整改方案 当你在实验室看到传导骚扰测试曲线在50-108MHz频段持续突破GB/T18655-2010三级限值时,那种焦虑感每个BMS工程师都深有体会。这不是简单的测试失败,而是产品设计中隐藏的高频噪…...

PiliPlus:用Flutter重新定义你的B站观影体验

PiliPlus:用Flutter重新定义你的B站观影体验 【免费下载链接】PiliPlus PiliPlus 项目地址: https://gitcode.com/gh_mirrors/pi/PiliPlus 在众多视频平台中,B站以其独特的社区文化和丰富内容生态深受用户喜爱。然而,官方客户端的一些…...

对比体验Taotoken平台不同大模型在创意生成上的差异

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 对比体验Taotoken平台不同大模型在创意生成上的差异 对于内容创作者而言,大模型是激发灵感、提升效率的得力工具。然而…...

大模型“开源”迷思:小白与程序员必看,收藏这份避坑指南!

大模型“开源”并非简单代码开放,涉及权重、数据、训练方法等多维度。文章详解不同协议(如MIT、Apache-2.0、GPL、AGPL等)对企业商业化的影响,强调理解协议边界至关重要。从开放权重到真正开源,企业需关注协议对商用、…...

AI如何重塑科学创新:从构思成本坍塌到知识组合爆炸

1. 科学创新的范式转移:从“不确定性”到“风险”在过去的科研实践中,我们常常面临一个根本性的困境:不确定性。这并非指我们不知道某个实验的结果,而是指我们连可能的结果是什么、其发生的概率有多大,都无从知晓。这就…...

PHP反序列化漏洞实战:从CTFshow F5杯‘eazy-unserialize’两道题,到文件包含与协议利用的完整避坑指南

PHP反序列化漏洞实战:从CTF题目到真实漏洞利用的深度解析 在CTF竞赛中,PHP反序列化漏洞一直是Web安全方向的热门考点。这类漏洞不仅考验选手对PHP语言特性的理解,更要求具备将多个知识点串联运用的能力。本文将以一道典型CTF题目为例&#xf…...

从Packet Tracer到EVE-NG:网络小白进阶实战,手把手教你用VMware部署第一个思科拓扑

从Packet Tracer到EVE-NG:网络工程师的虚拟化进阶指南 当你已经能够熟练使用Cisco Packet Tracer完成CCNA级别的实验,却发现这个教学工具无法满足你对真实网络环境模拟的渴望时,是时候考虑升级你的网络实验平台了。EVE-NG作为当前最强大的网…...

从零构建Telegram天气机器人:Python异步编程与API集成实战

1. 项目概述:一个能聊天的天气机器人 如果你用过Telegram,大概率会见过或者用过一些机器人。它们能帮你查新闻、翻译、管理任务,甚至陪你聊天。今天要聊的这个项目, imkarimkarim/Telegram-Weather-Bot ,就是一个典型…...

词达人自动化工具:如何用智能技术将30分钟学习任务压缩到3分钟完成?

词达人自动化工具:如何用智能技术将30分钟学习任务压缩到3分钟完成? 【免费下载链接】cdr 微信词达人,高正确率,高效简洁。支持班级任务及自选任务 项目地址: https://gitcode.com/gh_mirrors/cd/cdr 在当今数字化教育环境…...