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

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

一、引言

本文对FLV格式的FLV header进行简介,FLV文件的开头就是FLV header。

进行简介之前,请各位先从《音视频入门基础:FLV专题(1)——FLV官方文档下载》下载FLV的官方文档《video_file_format_spec_v10_1.pdf》和SWF的官方文档《swf-file-format-spec.pdf》。

《video_file_format_spec_v10_1.pdf》总共有89页,《swf-file-format-spec.pdf》总共有243页。本文下面所说的“页数”是指在pdf阅读器中显示的页数:

二、FLV的Simple data types

根据《video_file_format_spec_v10_1.pdf》第74页,FLV的Simple data types(简单数据类型)定义在SWF的官方文档中。Simple data types描述了FLV格式中的每个属性占用多少空间:

所以我们得翻阅SWF的官方文档《swf-file-format-spec.pdf》,该文档第15页到第20页描述了Simple data types(简单数据类型)。

第15页:

第18页:

其中:

SI8:有符号8位整数值。

SI16:有符号16位整数值。

SI32:32位带符号整数值。

SI8[n]:带符号的8位数组。n是数组元素的个数。

SI16[n]:带符号的16位数组。n是数组元素的个数。

UI8:无符号8位整数值。

UI16:无符号16位整数值。

UI32:无符号32位整数值。

UI8[n]:无符号的8位数组。n是数组元素的个数。

UI16[n]:无符号的16位数组。n是数组元素的个数。

UI24[n]:无符号的24位数组。n是数组元素的个数。

UI32[n]:无符号的32位数组。n是数组元素的个数。

UI64[n]:无符号的64位数组。n是数组元素的个数。

SB[nBits]:有符号的位值(nBits是用来存储值的位数)。
UB[nBits]:无符号的位值(nBits是用来存储值的位数)。

FB[nBits]:带符号的定点位值(nBits是用于存储值的位数)。

三、FLV header

根据《video_file_format_spec_v10_1.pdf》第74页,一个FLV文件应以FLV header为开始。可以看出来FLV header中的属性加起来总共占9个字节(Signature占3个字节,Version占1个字节,TypeFlagsReserved+TypeFlagsAudio+TypeFlagsReserved+TypeFlagsVideo占1个字节,DataOffset占4个字节,加起来总共9字节),所以FLV header为9字节:

Signature:FLV header的前3个字节为Signature,为文件格式标识。对于FLV格式,固定为“FLV”(0x46 0x4C 0x56)。

Version:FLV header的第4个字节为Version,为格式版本。对于FLV格式,值必须为1。

FLV header的第5个字节比较特殊:

第5个字节的前5位(8位等于1个字节)是保留位(TypeFlagsReserved),值必须是0。

第6位为音频类型标志(TypeFlagsAudio),值为1表示FLV文件中含有音频,值为0表示不含音频。

第7位也是保留位,值必须是0。
第8位为视频类型标志(TypeFlagsVideo),值为1表示FLV文件中含有视频,值为0表示不含视频。

所以如果FLV header第5个字节的值为0x04(二进制的0b00000100)表示该FLV文件中仅含有音频不含视频;第5个字节的值为0x01(二进制的0b00000001)表示该FLV文件中仅含有视频不含音频;第5个字节的值为0x05(二进制的0b00000101)表示该FLV文件中既含视频也含音频。

DataOffset:FLV header的第6到第9个字节为DataOffset。为整个FLV header的长度,单位为字节。值固定为9。

四、FLV File Body

根据《video_file_format_spec_v10_1.pdf》第74页至75页,在FLV header之后,FLV文件剩下的部分应由PreviousTagSize和Tag组成。FLV文件 = FLV header + PreviousTagSize0 + Tag1 + PreviousTagSize1 + Tag2 + ...+... + PreviousTagSizeN-1 + TagN + PreviousTagSizeN: 

PreviousTagSize0:FLV header之后紧接着的就是PreviousTagSize0,占4个字节,值必须为0。

五、FLV header实例分析

用notepad++打开《音视频入门基础:FLV专题(2)——使用FFmpeg命令生成flv文件》中生成的FLV文件,文件的开头(下图红框中的)就是FLV header。可以看到header为:0x46 0x4C 0x56 0x01 0x05 0x00 0x00 0x00 0x09。由于该FLV header的第5个字节的值为0x05,所以能推测出来该FLV文件中既含视频也含音频:

FLV header之后紧接着的就是PreviousTagSize0,值必须为0:

相关文章:

  • springBoot --> 学习笔记
  • USB 3.1 Micro-A 与 Micro-B 插头,Micro-AB 与 Micro-B 插座,及其引脚定义
  • 职业技能大赛-单元测试笔记(assertThat)分享
  • 阿里云kafka消息写入topic失败
  • web基础:域名、网页、HTML、web版本
  • 城市轨道交通网络客流大数据可视化分析系统----以某市交通网络客流数据为例
  • python select interpreter vscode 配置
  • 【RabbitMQ】消息堆积、推拉模式
  • 手机通过安装视频采集APP软件,采用国标28181方式注册到AS-V1000视频监控平台来播放实时监控视频画面
  • 甘蔗茎节检测系统源码分享
  • Spring Boot,在应用程序启动后执行某些 SQL 语句
  • vue初学随笔
  • web群集--rocky9.2部署zabbix服务端的详细过程
  • 【JavaEE】——线程的安全问题和解决方式
  • Vue3使用hiprint——批次打印条码
  • avalon2.2的VM生成过程
  • CSS相对定位
  • CSS中外联样式表代表的含义
  • Java读取Properties文件的六种方法
  • log4j2输出到kafka
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • PV统计优化设计
  • 闭包--闭包之tab栏切换(四)
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 分享一份非常强势的Android面试题
  • 技术发展面试
  • 两列自适应布局方案整理
  • 微信小程序设置上一页数据
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 硬币翻转问题,区间操作
  • 怎么将电脑中的声音录制成WAV格式
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • 带你开发类似Pokemon Go的AR游戏
  • # Redis 入门到精通(九)-- 主从复制(1)
  • #include到底该写在哪
  • #pragam once 和 #ifndef 预编译头
  • #传输# #传输数据判断#
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (C11) 泛型表达式
  • (ISPRS,2021)具有遥感知识图谱的鲁棒深度对齐网络用于零样本和广义零样本遥感图像场景分类
  • (k8s)kubernetes 部署Promehteus学习之路
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (简单) HDU 2612 Find a way,BFS。
  • (四)linux文件内容查看
  • (贪心 + 双指针) LeetCode 455. 分发饼干
  • (文章复现)基于主从博弈的售电商多元零售套餐设计与多级市场购电策略
  • (五)Python 垃圾回收机制
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (转)大道至简,职场上做人做事做管理
  • (转)大型网站架构演变和知识体系
  • (转)人的集合论——移山之道
  • 、写入Shellcode到注册表上线
  • .net core + vue 搭建前后端分离的框架