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

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

一、引言

从《音视频入门基础: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.kler.cn/news/328059.html

相关文章:

  • 【STM32单片机_(HAL库)】4-1【定时器TIM】定时器中断点灯实验
  • 【漏洞复现】JeecgBoot 积木报表 queryFieldBySql sql注入漏洞
  • 【进阶OpenCV】 (2)--Harris角点检测
  • 衡水中学资料大全-重构版(状元、学霸笔记)
  • .NET MAUI(.NET Multi-platform App UI)下拉选框控件
  • UE5: Content browser工具编写02
  • 【抽代复习笔记】29-群(二十三):生成子群的两道例题及子群陪集的定义
  • hdlbits系列verilog解答(Exams/m2014 q3)-77
  • 【qt】QQ仿真项目1
  • 【洛谷】P4551 最长异或路径 的题解
  • 自然语言处理的应用领域有哪些?
  • 【漏洞复现】孚盟云oa AjaxSendDingdingMessage接口 存在sql注入漏洞
  • 云计算 Cloud Computing
  • 前端——DOM与BOM总结
  • macOS开发环境配置与应用
  • vant 数据校验
  • 华为OD机试 - 最长回文字符串 - 贪心算法(Python/JS/C/C++ 2024 E卷 100分)
  • ZYNQ: GPIO 之 MIO 控制 LED 实验
  • Qt(9.28)
  • 深入理解 `strtok()` 函数:字符串分割的艺术
  • go语言 常用的web框架
  • Ansible学习之ansible-pull命令
  • LLaMA: 开源大语言模型的革新者
  • react是一种语言?
  • PHP中的PEAR是什么
  • Metasploit渗透测试之服务端漏洞利用
  • 【基于spring-cloud-gateway实现自己的网关过滤器】
  • 通过 IPv6 进行远程 ADB 调试
  • 《RabbitMQ篇》基本概念介绍
  • 用于多模态MRI重建的具有空间对齐的深度展开网络|文献速递--基于多模态-半监督深度学习的病理学诊断与病灶分割