音视频入门基础: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字节的值为8的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、视频的分辨率、文件大小、文件总时长、创建日期等。
相关文章:

音视频入门基础: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表示未加…...
Vue页面,基础配置
最简单页面 日期范围及字符搜索,监听器处理日期范围搜索控件清空重置问题导出、导出文件文件名称带日期时间表格日期指定格式显示。。。 <template><div class"app-container"><el-form :model"queryParams" ref"queryForm…...

(杨辉三角) 攻防世界--->notsequence
学习笔记。(不想看可以直接跳正文。) 前言:仿佛又回到高中 - - 只不过,是以另一种形式再次出现。 学习思维为主,做题位次。(后面再补。) 前置知识: 什么是杨辉三角: 杨辉三角_百度百科 (bai…...

【CTF Web】Pikachu CSRF(get) Writeup(CSRF+GET请求+社会工程学)
CSRF(跨站请求伪造)概述 Cross-site request forgery 简称为“CSRF”,在CSRF的攻击场景中攻击者会伪造一个请求(这个请求一般是一个链接),然后欺骗目标用户进行点击,用户一旦点击了这个请求,整个攻击就完成…...
智能工厂的软件设计 作为“程序Program”的中台 之2
Q11、现在,我们再重新理解一下前面所说:三种中台(数据中台、技术中台和业务中台)作为这个整体的三个整子Holon,合起来是一个 融合了三分法( 三分部 的三个中台构成三段式 程序框架,分别用 <h…...

GB28181信令交互流程及Android端设备对接探讨
GB28181规范必要性 好多开发者在做比如执法记录仪、智能安全帽、智能监控等设备端视频回传技术方案选型的时候,不清楚到底是用RTSP、RTMP还是GB28181,对GB28181相对比较陌生,我们就GB28181规范的必要性,做个探讨: 实现…...

OpenCV视频I/O(14)创建和写入视频文件的类:VideoWriter介绍
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 视频写入器类。 该类提供了用于写入视频文件或图像序列的 C API。 cv::VideoWriter 类是 OpenCV 库中用于创建和写入视频文件的一个类。它提供了…...
c语言学习(书本目录)
关键字 变量 3.typedef的使用: 定义一个结构体,名字是Person: struct Person { char name[50]; int age; }; 给结构体取一个别名:struct Person---》Person typedef struct Person Person; 上面带标签的结构体等效于 …...

2024年最新版本神马TV8.5影视APP源码 293TV影视点播系统源码搭建教程 神马TV8.2加强版反编译教程 保姆级小白可搭建 完整版本视频教程
2024年最新版的神马TV影视APP源码,版本号8.5,提供了前所未有的定制化选项和高级功能。用户可以轻松更换应用的包名和名称,确保品牌个性化。此外,该应用采用了动态域名加密技术,增强了数据传输的安全性。它支持自动切换…...
衍生品交易的隐藏风险:认识CCR和xVA
作为一名资深的量化交易专家和金融自媒体人,我经常被问到:"衍生品交易真的像传说中那么危险吗?"这个问题背后,隐藏着许多投资者对金融市场的担忧和好奇。今天,让我们一起揭开衍生品交易中两个关键概念的面纱…...

我的项目管理生涯
1 前言 从好几年前就想写几篇关于自己职业生涯的文章了,一直由于各种原因没有写成,正好借新的工作机会,尤其是项目管理这段工作经历,计划通过这一二篇文章进行总结和反思一下,以期更顺利的开展相关工作或是自己能更上…...

ChatGPT Canvas:交互式对话编辑器
自两年前 ChatGPT 发布以来,主流 AI 均以对话形式进行交互。传统的对话式界面可以直观看到反馈结果,但在需要深度编辑和协作的项目中就略显局限。为了解决此问题,几个月前 Claude 就发布过 Artifacts 功能,用来拓展原有对话。而现…...

[Linux] Linux 的进程如何调度——Linux的 O(1)进程调度算法
标题:[Linux] Linux 的进程如何调度——优先级与进程调度 个人主页水墨不写bug 目录 一、前言 二、将要出现的概念 1.进程调度队列 2.位图 3.进程的优先级 三、Linux进程的调度过程 1.活动队列(*active指向的队列) 2.过期队列&#…...
Python使用Selenium动态爬取CSDN社区帖子的URL链接
前几天读了一篇CSDN社区的帖子,发现文章内容写得极好,值得借鉴学习。于是我想将那个社区的帖子都爬下来,但是那个社区发布的贴子挺多的,一直往下拉才到2022年5月的发布。于是我就只将5月份之前的爬下来就行,但是帖子是…...
【ShuQiHere】双系统指南:如何在 Linux 系统情况下安装 Windows 11,处理引导与网络问题 ️
【ShuQiHere】 🖥️💡 在安装 Windows 11 和 Linux 双系统时,常常会遇到各种棘手的问题,特别是在网络连接、BIOS 设置和引导修复方面。今天我将详细带你解决这些问题,让你顺利完成 Windows 11 安装,并恢复…...
jQuery EasyUI 扩展
jQuery EasyUI 扩展 引言 jQuery EasyUI 是一个流行的 HTML5 框架,用于构建交互式网页界面。它提供了一系列的 UI 组件,如布局、窗口、数据网格等,使得网页开发变得更加简单快捷。然而,尽管 EasyUI 功能丰富,但在某些特定场景下,开发者可能需要更多的定制化功能或组件。…...
408算法题leetcode--第24天
#378. 有序矩阵中第 K 小的元素 378. 有序矩阵中第 K 小的元素思路:值二分,如注释时间:O(log(r-l) * n);空间:O(1) class Solution { public:int check(vector<vector<int>>& matrix, int target){/…...

【CKA】二、节点管理-设置节点不可用
2、节点管理-设置节点不可用 1. 考题内容: 2. 答题思路: 先设置节点不可用,然后驱逐节点上的pod 这道题就两条命令,直接背熟就行。 也可以查看帮助 kubectl cordon -h kubectl drain -h 参数详情: –delete-empty…...
STM32中断编程指南:NVIC和中断优先级
在STM32微控制器编程中,中断是实现多任务处理和实时响应的关键技术。NVIC(Nested Vectored Interrupt Controller)是STM32中的中断控制器,负责管理中断请求、优先级和中断向量。本文将详细介绍STM32的NVIC配置和中断优先级设置&am…...

ThreadLocal底层原理及数据结构详解
ThreadLocal允许为每个线程创建独立的变量副本,使得同一个ThreadLocal对象在不同的线程中拥有不同的值。它的主要作用是在并发环境下提供线程隔离,避免多个线程共享同一个变量,从而减少线程间的相互干扰。 ThreadLocal的核心在于为每个线程维…...

CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...

视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...
Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?
Pod IP 的本质与特性 Pod IP 的定位 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如 10.244.1.2)无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”生命周期:与 Pod …...

通过MicroSip配置自己的freeswitch服务器进行调试记录
之前用docker安装的freeswitch的,启动是正常的, 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...

springboot 日志类切面,接口成功记录日志,失败不记录
springboot 日志类切面,接口成功记录日志,失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...

Linux中《基础IO》详细介绍
目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改,实现简单cat命令 输出信息到显示器,你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...