音视频入门基础:FLV专题(9)——Script Tag简介

一、SCRIPTDATA

根据《video_file_format_spec_v10_1.pdf》第75页到76页,如果某个Tag的Tag header中的TagType值为18,表示该Tag为Script Tag(脚本Tag,又称Data Tag、SCRIPTDATA tag)。这时如果Filter的值不为1表示未加密,不需要预处理,则StreamID之后紧接着的就是SCRIPTDATA。也就是说这时Tag header之后的是SCRIPTDATA:

所以,未加密的情况下,一个Script Tag = Tag header + SCRIPTDATA。

根据《video_file_format_spec_v10_1.pdf》第80页,SCRIPTDATA包含可选的加密元数据和脚本有效负载。加密的情况下,SCRIPTDATA的Body为EncryptedBody;未加密的情况下,SCRIPTDATA的Body为ScriptTagBody。这里我们主要讲解未加密的情况:

所以,未加密的情况下,SCRIPTDATA = ScriptTagBody

二、ScriptTagBody

根据《video_file_format_spec_v10_1.pdf》第80页,ScriptTagBody包含以Action Message Format(AMF)编码的SCRIPTDATA。AMF是一种用于数据交换的开放标准,旨在简化数据传输和解析过程。ScriptTagBody由Name和Value组成,这两个属性都是SCRIPTDATAVALUE类型的:

所以,ScriptTagBody = Name + Value

三、SCRIPTDATAVALUE类型

根据《video_file_format_spec_v10_1.pdf》第80页到81页,SCRIPTDATAVALUE类型由一个8位(1字节)的Type和一个ScriptDataValue组成。其中Type属性用来指定ScriptDataValue的类型,根据Type值的不同,ScriptDataValue的类型也不同:

四、ScriptTagBody的Name属性

由上文我们可以知道,ScriptTagBody由Name和Value组成。 Name属性指定方法或对象名称,为SCRIPTDATAVALUE类型。Name对应的Type的值必为2,所以Name对应的ScriptDataValue属性必为SCRIPTDATASTRING类型:

根据《video_file_format_spec_v10_1.pdf》第83页,SCRIPTDATASTRING类型用来记录存贮不超过65535个字符的字符串数据。SCRIPTDATASTRING类型由一个16位(2字节)的StringLength属性和一个存贮字符数据的StringData属性组成。其中StringLength属性用来指定要存贮的字符串的长度,单位为字节;StringData属性存贮实际的字符串数据(不超过65535个字符):

所以, 

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

五、ScriptTagBody的Value属性

ScriptTagBody的Value属性指定了AMF参数或对象的属性,为SCRIPTDATAVALUE类型。Value对应的Type的值必为8,所以Value对应的ScriptDataValue属性必为SCRIPTDATAECMAARRAY类型:

根据《video_file_format_spec_v10_1.pdf》第81页,SCRIPTDATAECMAARRAY类型存储一个ECMA数组。SCRIPTDATAECMAARRAY类型由一个32位(4字节)的ECMAArrayLength一个由每个元素都为SCRIPTDATAOBJECTPROPERTY类型的数组构成的Variables和一个SCRIPTDATAOBJECTEND类型的List Terminator组成:

所以,

ScriptTagBody的Value = 1字节的值为2的Type + 4字节的ECMAArrayLength + Variables数组 + List Terminator

(一)ECMAArrayLength属性

SCRIPTDATAECMAARRAY类型的ECMAArrayLength属性指定ECMA数组中的元素个数。

(二)Variables属性

SCRIPTDATAECMAARRAY类型的Variables属性是一个数组,该数组的每个元素都为SCRIPTDATAOBJECTPROPERTY类型。数组中的每个元素由变量名称(PropertyName)和变量的值(PropertyData)组成。根据《video_file_format_spec_v10_1.pdf》第82页,PropertyName为上文提到过的SCRIPTDATASTRING类型,而PropertyData为上文提到过的SCRIPTDATAVALUE类型:

所以,

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

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

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

(三)List Terminator属性

List Terminator属性是SCRIPTDATAOBJECTEND类型,为终止符。根据《video_file_format_spec_v10_1.pdf》第82页,SCRIPTDATAOBJECTEND类型用来终止SCRIPTDATAOBJECTPROPERTY类型的数组。SCRIPTDATAOBJECTEND类型固定3字节,值必须为0,0,9:

所以,

ScriptTagBody的Value = 1字节的值为8的Type + 4字节的ECMAArrayLength + Variables数组 + List Terminator

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

六、onMetaData

根据《video_file_format_spec_v10_1.pdf》第84页,FLV文件的元数据对象应该在名称为“onMetadata”的SCRIPTDATA tag(Script Tag)中携带。也就是说FLV文件中存在一个特殊的Script Tag,它的ScriptTagBody中的Name属性中的StringData属性存贮“onMetadata”字符串,而它的ScriptTagBody中的Value属性中的Variables数组中的每个元素都分别为一个元数据属性。用来存贮当前文件的一些基本信息,比如视频和音频的编解码器ID、视频的分辨率、文件大小、文件总时长、创建日期等:

根据上图,对于名称为“onMetadata”的Script Tag,其Variables数组中的元素(可用的属性)
根据创建FLV文件的软件而有所不同。典型的属性包括:

1.audiocodecid:音频编解码器ID。根据《video_file_format_spec_v10_1.pdf》第76页,可以看到FLV文件中的音频压缩编码格式可以为PCM、MP3......AAC等:

2.audiodatarate:音频码率,单位为kilobits per second,即Kbps。

3.audiodelay:音频编解码器引入的延迟,以秒为单位。

4.audiosamplerate:音频采样率,单位为Hz。

5.audiosamplesize:音频采样位数。

6.canSeekToEnd:表示最后一帧视频是否为关键帧,能否跳转到最后。

7.creationdate:该FLV文件的创建日期和时间。

8.duration:该FLV文件的总时长,以秒为单位。

9.filesize:该FLV文件的总大小,以字节为单位。

10.framerate:视频帧率。

11.height:视频分辨率的高,以像素为单位。

12.stereo:表示音频是否是立体声。

13.videocodecid:视频编解码器ID。根据《video_file_format_spec_v10_1.pdf》第78页,可以看到FLV文件中的视频压缩编码格式可以为H.263,VP6......AVC(即H.264)等:

14.videodatarate:视频码率,单位为kilobits per second,即Kbps。

15.width:视频分辨率的宽,以像素为单位。

除了《video_file_format_spec_v10_1.pdf》第84页表格中显示的属性外,某些软件(比如FFmpeg)生成的FLV文件中,其名称为“onMetadata”的Script Tag的Variables数组中的可用元素可能还有:

1.major_brand:表示“最好”基于哪种格式来解析当前的文件。

2.minor_version:提供 major_brand 的说明信息,比如版本号。

3.compatible_brands:文件兼容的brand列表。

4.encoder:编码器。

七、总结

1.如果某个Tag的Tag header中的TagType值为18,表示该Tag为Script Tag(脚本Tag,又称Data Tag、SCRIPTDATA tag)。

2.未加密的情况下,

一个Script Tag = Tag header + SCRIPTDATA;

SCRIPTDATA = ScriptTagBody;

ScriptTagBody = Name + Value;

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

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

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

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

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

3.FLV文件中存在一个特殊的Script Tag,它的ScriptTagBody中的Name属性中的StringData属性存贮“onMetadata”字符串,而它的ScriptTagBody中的Value属性中的Variables数组中的每个元素都分别为一个元数据属性。用来存贮当前文件的一些基本信息,比如视频和音频的编解码器ID、视频的分辨率、文件大小、文件总时长、创建日期等。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UG NX二次开发(C++)-建模-采用NXOpen获取拉伸特征的信息

文章目录 1、前言2、创建一个特征3 采用NXOpen来实现拉伸特征信息的获取1、前言 UG NX二次开发过程中,大部分初学者喜欢用UFun函数来实现UG NX二次开发的功能,因为相较于NXOpen,UFun函数简单易懂;但是有时UFun函数如果初始值设置不好,出现的错误也比较难排查。比如对于拉…

Spark SQL分析层优化

导读:本期是《深入浅出Apache Spark》系列分享的第四期分享,第一期分享了Spark core的概念、原理和架构,第二期分享了Spark SQL的概念和原理,第三期则为Spark SQL解析层的原理和优化案例。本次分享内容主要是Spark SQL分析层的原理…

Redis篇(Redis原理 - 数据结构)(持续更新迭代)

目录 一、动态字符串 二、intset 三、Dict 1. 简介 2. Dict的扩容 3. Dict的rehash 4. 知识小结 四、ZipList 1. 简介 2. ZipListEntry 3. Encoding编码 五、ZipList的连锁更新问题 六、QuickList 七、SkipList 八、RedisObject 1. 什么是 redisObject 2. Redi…

用 API 实现 AI 视频摘要:动手制作属于你的 AI 视频小助手

AI 视频摘要想必你一定不陌生,在各大视频平台,比如 B 站,评论区的 AI 视频小助手就如雨后春笋般遍地都是。 今天,让我们来填了这“护城河”,站到墙上看一看它的全貌。 简而言之,AI 视频摘要的工作流程如下&…

基于Spring Boot+Unipp的中考体测训练小程序(协同过滤算法、图形化分析)【原创】

🎈系统亮点:协同过滤算法、图形化分析; 一.系统开发工具与环境搭建 1.系统设计开发工具 后端使用Java编程语言的Spring boot框架 项目架构:B/S架构 运行环境:win10/win11、jdk17 前端: 技术:框…

研究生如何利用ChatGPT帮助开展日常科研工作?

小白可做!全自动AI影视解说一键成片剪辑工具https://docs.qq.com/doc/DYnl6d0FLdHp0V2ll 作为当代研究生,科研工作三部曲----读文献、开组会、数据分析。无论哪一个,都令研究生们倍感头疼,简直就是梦魇。每当看到导师发来的消息&a…

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

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

HarmonyOS/OpenHarmony 如何将rawfile中文件复制到沙箱中

关键词:h5离线加载、HarmonyOS、OpenHarmony、文件操作、复制、解压 当下有一个场景,需要离线加载 h5离线资源zip包,并实现资源包的动态更新,那么仅靠 $rawfile并不能实现该功能,那么我们该如何实现? 我们…

YOLO11改进|注意力机制篇|引入MLCA轻量级注意力机制

目录 一、MLCA注意力机制1.1MLCA注意力介绍1.2MLCA核心代码 五、添加MLCA注意力机制5.1STEP15.2STEP25.3STEP35.4STEP4 六、yaml文件与运行6.1yaml文件6.2运行成功截图 一、MLCA注意力机制 1.1MLCA注意力介绍 MLCA(Multi-Level Channel Attention,多级通…

【前端安全】js逆向之微信公众号登录密码

❤️博客主页: iknow181 🔥系列专栏: 网络安全、 Python、JavaSE、JavaWeb、CCNP 🎉欢迎大家点赞👍收藏⭐评论✍ 随着发展,越来越多的登录页面添加了密码加密的措施,使得暴力破解变得不在简单&a…

SpringBoot教程(安装篇) | Docker Desktop的安装(Windows下的Docker环境)

SpringBoot教程(安装篇) | Docker Desktop的安装(Windows下的Docker环境) 前言如何安装Docker Desktop资源下载安装启动(重点)1. 检查 bcdedit的hypervisorlaunchtype是否为Auto2. 检查CPU是否开启虚拟化3.…

c#增删改查 (数据操作的基础)

//数据操作无非4种 //增删改查 是数据操作的基础 int[] ints { 110, 120, 119 }; //1. 查 在这里就是获取数组中的数据 int num ints[1]; //将数组中的某个元素取出来 Console.WriteLine(num); //2. 改 将数据从…

[大语言模型-论文精读] 利用多样性进行大型语言模型预训练中重要数据的选择

[大语言模型-论文精读] 利用多样性进行大型语言模型预训练中重要数据的选择 论文信息: Harnessing Diversity for Important Data Selection in Pretraining Large Language Models Authors: Chi Zhang, Huaping Zhong, Kuan Zhang, Chengliang Chai, Rui Wang, X…

python之认识变量

1、变量 1.1、定义 字面意思来看,会发生改变的量称为变量。 相反的,如果有一个不会发生改变的量,它应该称为不变量,即常量。 1.2、引入变量的原因 主要是为了方便程序员动态的管理、操控数据。 1.3、变量的三要素 名称 类型…

【Verilog学习日常】—牛客网刷题—Verilog企业真题—VL64

时钟切换 描述 题目描述: 存在两个同步的倍频时钟clk0 clk1,已知clk0是clk1的二倍频,现在要设计一个切换电路,sel选择时候进行切换,要求没有毛刺。 信号示意图: 波形示意图: 输入描述: …

Oracle bbed编译安装及配置

1. 什么是bbed ? Oracle Block Brower and EDitor Tool,是一个可以对oracle data block进行查看,编辑修改的内置工具。对于bbed,oracle本身是不提供支持的。 2. 如何编译bbed环境? 10g版本: 1) 编译bbed cd $ORACL…

物联网智能项目全面解析

目录 引言 一、物联网概述 1.1 什么是物联网 1.2 物联网的历史与发展 二、物联网智能项目分类 三、关键组件与技术 3.1 传感器和执行器 3.2 连接技术 3.3 数据处理与分析 3.4 用户界面 四、物联网智能项目案例分析 4.1 智能家居 4.2 智慧城市 4.3 工业物联网 4.4…

Python编码系列—Python状态模式:轻松管理对象状态的变化

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

SSM环卫人员管理平台—计算机毕业设计源码36412

目 录 摘要 1 绪论 1.1背景及意义 1.2国内外研究概况 1.3研究内容 1.4 ssm框架介绍 1.5论文结构与章节安排 2 环卫人员管理平台系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1数据增加流程 2.2.2数据修改流程 2.2.3数据删除流程 2.3 系统功能分析 2.3.1 功能性…

达梦8-数据守护集群主备故障实验和脑裂处理

实验1:将内网断开,查看主备库状态,并测试数据同步情况 测试环境 ##主库信息 内网IP-[MAL_HOST 192.168.50.100] 外网IP-[MAL_INST_HOST 192.168.101.11] 主库实例名-[DM01] ##备库信息 内网IP-[MAL_HOST 192.168.50.110] 外网IP-[MAL_INS…