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

ops/2024/12/22 20:46:43/

一、引言

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

在FLV header之后,FLV文件剩下的部分应由PreviousTagSize和Tag组成。FLV文件 = FLV header + PreviousTagSize0 + Tag1 + PreviousTagSize1 + Tag2 + ...+... + PreviousTagSizeN-1 + TagN + PreviousTagSizeN。本文对Tag的Tag header进行简介。

二、Tag header

根据《video_file_format_spec_v10_1.pdf》第75页,一个FLV tag(简称Tag)包含音频、视频或脚本的元数据(metadata),可选的加密元数据和有效负载:

Tag有三种类型:音频Tag,视频Tag和脚本Tag。但不管是哪种Tag都包含Reserved、Filter、TagType、DataSize、Timestamp、TimestampExtended、StreamID这几个属性。所以我们一般称每个Tag都包含的公共部分(Reserved + Filter + TagType + DataSize + Timestamp + TimestampExtended + StreamID)为Tag header。这些属性加起来总共11个字节,所以Tag header固定为11字节。

一个Tag = Tag header + Tag data。也就是说:除了Tag header,一个Tag剩下的部分就是Tag data。

注意FLV的官方文档《video_file_format_spec_v10_1.pdf》和FFmpeg源码中是没有Tag header和Tag data的概念的,这两个概念是FLV分析工具flvAnalyser里面提出来的:

Tag header的第1个字节等于Reserved + Filter + TagType:

Reserved:占2位(8位等于1个字节),为保留位。值必须是0。

Filter:占1位。表示是否对报文进行过滤。0:未加密,不需要预处理;1:加密。

TagType:占5位。该Tag的类型。值为8:音频Tag;值为9:视频Tag;值为18:脚本Tag。

DataSize:Tag header的第2到第4个字节为DataSize,为属性StreamID之后的那个字节到该Tag结尾的字节数,也就是Tag data的长度,单位为字节。DataSize的值等于整个Tag的长度 - 11,这个很容易理解,因为Tag header固定为11字节。

Timestamp:Tag header的第5到第7个字节为Timestamp。为该Tag的时间戳,单位为毫秒。第1个Tag的Timestamp总是为0。如果是脚本Tag,Timestamp就是0。

TimestampExtended:Tag header的第8个字节为TimestampExtended。为时间戳扩展,和上面的Timestamp一起让时间戳变成4字节以存储更长时间的flv时间信息。TimestampExtended作为时间戳的最高位。

StreamID:Tag header的第9到第11个字节为StreamID。值必须是0。

三、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的第1个字节为0x12,即0b00010010。所以Filter的值为0,表示该Tag未加密。TagType为0x12,表示该Tag为脚本Tag。

红框中第2到第4个字节为0x00 0x01 0x73,即十进制的371。所以整个Tag data的长度为371字节。

红框中第5到第8个字节为0x00 0x00 0x00 0x00。所以该Tag的整个时间戳为0。

用flvAnalyser工具可以直接显示Tag header的每个属性的值:


http://www.ppmy.cn/ops/120790.html

相关文章

网页前端开发之Javascript入门篇(4/9):循环控制

Javascript循环控制 什么是循环控制? 答:其概念跟 Python教程 介绍的一样,只是语法上有所变化。 参考流程图如下: 其对应语法: var i 0; // 设置起始值 var minutes 15; // 设置结束值(15分钟…

springboot基于Vue的电影在线预定与管理系统

目录 毕设制作流程功能和技术介绍系统实现截图开发核心技术介绍:使用说明开发步骤编译运行代码执行流程核心代码部分展示可行性分析软件测试详细视频演示源码获取 毕设制作流程 (1)与指导老师确定系统主要功能; (2&am…

51单片机应用开发(进阶)---数码管+按键+蜂鸣器(电磁炉显示模拟)

实现目标 1、加强数码管、按键的学习,实现数码显示变量数据(四位数的显示); 2、4位数码2个按键无源蜂鸣器实现模拟电磁炉功率调节及显示; 一、内容描述 功能描述:1、开机显示电磁炉功率300,每…

Python知识点:如何使用Nvidia Jetson与Python进行边缘计算

开篇,先说一个好消息,截止到2025年1月1日前,翻到文末找到我,赠送定制版的开题报告和任务书,先到先得!过期不候! 如何使用Nvidia Jetson与Python进行边缘计算 Nvidia Jetson平台是专为边缘计算设…

如何给一张图像判断失真类型?

判断失真类型 类型 类型 模糊失真: 表现:图像细节不清晰,边缘模糊,整体看起来像是被一层薄雾笼罩。 原因:可能是由对焦不准确、相机抖动、快门速度过慢或景深过浅等原因造成。 判断方法:观察图像中的细节是…

【游戏模组】星际争霸1代模组燃烧之地,泰伦帝国对决UED。特效华丽兵种巨多特别好玩

各位星际争霸1代的粉丝大家好,今天小编给大家带来一个星际争霸1代的模组,这个模组的名字叫燃烧之地,主要是2个阵营。玩家可以扮演UED或者泰伦帝国中的一个来进行比赛。 这个模组设定的世界线背景是在异虫入侵并随后被星灵消灭后,…

some 蓝桥杯题

12.反异或01串 - 蓝桥云课 (lanqiao.cn) #include "bits/stdc.h" #define int long long using namespace std; char c[10000000]; char s[10000000]; int cnt,Ans,mr,mid; int maxi; int p[10000000],pre[10000000]; signed main() {ios::sync_with_stdio(0);cin.t…

查看 Git 对象存储中的内容

查看 Git 对象存储中的内容 ls -C .git/objects/<dir>ls: 列出目录内容的命令。-C: 以列的形式显示内容。.git/objects/<dir>: .git 是存储仓库信息的 Git 目录&#xff0c;objects 是其中存储对象的子目录。<dir> 是对象存储目录下的一个特定的子目录。 此…