FLV 文件格式分析

前言

flv 是 flash video 的缩写,是 Adobe Flash payler 支持的一种流媒体播放格式。flv 是一种层级格式,除了一个 flv header 外,剩下全是由 一个个 tag 组成。tag 是由 tag 头和 tag 数据组成。tag 类型分为音频、视频、脚本,一共三种类型。每一种数据类型又有自己的 tag 头。本文下来就简单分析一下 flv 文件格式。

FLV 文件头格式

FLV 文件有 9 个字节的文件头,文件以 3 字节签名 0x46、0x4C、0x 56 开始,分别是 ‘F’、’L’、’V’ 三个字母的 ascii 编码。版本号是 1。文件头中还有 flag 标记,表面是否有音频、视频 tag。

下来以音频、视频为例,分析一下 FLV 格式的 header、tag。

音频 tag 格式

如上图,除了 9 字节的公共文件头外,body 部分就是一个个 tag 组成的。每一个 tag 都有 15 字节的 tag 头。字段说明如下:

  • PreviousTagSize,是 4 字节长度,表面之前的 Tag 的长度,包含了 tag 头和 tag 数据。第一个 tag ,此值是 0。
  • TagType,是 1 字节长度。音频:8, 视频:9
  • DataSize , 是 3 字节长。flv tag 的数据长度,其实如图里 audio tag 头及其数据长度。
  • Timestamp,是 3 字节长。时间戳,貌似 flv 播放需要。
  • TimestampExtended, 是对 Timestamp 长度的扩展,当时间长度 3 字节不能表示的时候,启用扩展字段。
  • StreamID ,3 字节长,都填 0.

flv tag 的 body 部分其实就是音频的 tag 部分了,图中每一个字段都有简单说明。具体每一个参数都有很多取值,取值的详细说明参考 [1] 中标明的 flv 规范音频 tag 部分。

对于 AACPacketType = 0 的情况,音频数据是 AudioSpecificConfig 格式,此格式在 ISO/IEC 14496-3 2009 中第一,可惜下载不到此文档。可以参考 wiki 给的格式:

Audio Specific Config:

5 bits: object type
if (object type == 31)6 bits + 32: object type
4 bits: frequency index
if (frequency index == 15)24 bits: frequency
4 bits: channel configuration
var bits: AOT Specific Config

如果是 AACPacketType = 1 的情况,那么后续数据都是 AAC 格式了。

视频 tag 格式

视频 tag 格式和音频格式 flv 文件头、flv tag 头都相同,不再说明。video tag 也不再详细说明,可以参考 [1] 中标明的 flv 规范视频 tag 部分。

这里需要说明一下的是,当 flv 包含的是 h264 的时候,CodecID 值是 7。在 H264 视频流开始的第一个 NALU 数据,需要发送 SPS、PPS 类型的数据。此时,AVCPacketType 会填 0,SPS/PPS 是包含在 AVCDecoderConfigurationRecord 结构中,格式如下:

aligned(8) class AVCDecoderConfigurationRecord {unsigned int(8) configurationVersion = 1;unsigned int(8) AVCProfileIndication;unsigned int(8) profile_compatibility;unsigned int(8) AVCLevelIndication;bit(6) reserved = ‘111111’b;unsigned int(2) lengthSizeMinusOne;bit(3) reserved = ‘111’b;unsigned int(5) numOfSequenceParameterSets;// SPS 个数for (i=0; i< numOfSequenceParameterSets; i++) {unsigned int(16) sequenceParameterSetLength ;// SPS 字节长度bit(8*sequenceParameterSetLength) sequenceParameterSetNALUnit;}unsigned int(8) numOfPictureParameterSets;for (i=0; i< numOfPictureParameterSets; i++) {unsigned int(16) pictureParameterSetLength;// PPS 自己长度bit(8*pictureParameterSetLength) pictureParameterSetNALUnit; // PPS bit 流}if( profile_idc == 100 || profile_idc == 110 ||profile_idc == 122 || profile_idc == 144 ){bit(6) reserved = ‘111111’b;unsigned int(2) chroma_format;bit(5) reserved = ‘11111’b;unsigned int(3) bit_depth_luma_minus8;bit(5) reserved = ‘11111’b;unsigned int(3) bit_depth_chroma_minus8;unsigned int(8) numOfSequenceParameterSetExt;for (i=0; i< numOfSequenceParameterSetExt; i++) {unsigned int(16) sequenceParameterSetExtLength;bit(8*sequenceParameterSetExtLength) sequenceParameterSetExtNALUnit;}}
}

关于此格式,详细参考 H.264-AVC-ISO_IEC_14496-15 5.2.4.1 节。

如果是后续的视频图像 slice ,那么 AVCPacketType 都会设置为 1。

总结

本文我们描述了 flv 文件头格式,AAC 和 AVC 的 flv tag。如果以 flv 格式推送 rtmp 流,AAC 和 AVC 都要加上 audio tag 和 video tag,但是图中标明的FLV TAG 头没有包含。

本文算是 flv 格式学习的笔记、总结吧。flv 格式虽然结构简单,但是也有很多字段,每一个字段取值也有很多,这些细节需要参考具体的规范。

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

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

相关文章

WEB渗透—反序列化(七)

Web渗透—反序列化 课程学习分享&#xff08;课程非本人制作&#xff0c;仅提供学习分享&#xff09; 靶场下载地址&#xff1a;GitHub - mcc0624/php_ser_Class: php反序列化靶场课程&#xff0c;基于课程制作的靶场 课程地址&#xff1a;PHP反序列化漏洞学习_哔哩哔_…

交换机的VRRP主备配置例子

拓朴如下&#xff1a; 主要配置如下&#xff1a; [S1] vlan batch 10 20 # interface Vlanif10ip address 10.1.1.1 255.255.255.0vrrp vrid 1 virtual-ip 10.1.1.254vrrp vrid 1 priority 200vrrp vrid 1 preempt-mode timer delay 20 # interface Vlanif20ip address 13.1.1…

2-Python与设计模式--工厂类相关模式

2-Python与设计模式–工厂类相关模式 一、快餐点餐系统 想必大家一定见过类似于麦当劳自助点餐台一类的点餐系统吧。在一个大的触摸显示屏上&#xff0c; 有三类可以选择的上餐品&#xff1a;汉堡等主餐、小食、饮料。当我们选择好自己需要的食物&#xff0c;支付完成后&…

@RequestMapping,@GetMapping,@PostMapping 的区别(详解)

HTTP请求方法 HTTP请求方法一共有9种&#xff0c;为 GET、POST、HEAD、OPTIONS、PUT、PATCH、DELETE、TRACE、CONNECT。 GET 【获取资源】本质就是发送一个请求来取得服务器上的某一资源。资源通过一组HTTP头和呈现数据&#xff08;如HTML文本&#xff0c;或者图片或者视频等…

我们为什么要进行敏捷开发培训

敏捷开发是一种以人为核心、迭代、循序渐进的软件开发方法。它强调团队合作、客户需求和适应变化。进行敏捷开发培训其实有多种原因&#xff0c;我整理了一些&#xff0c;可以作为参考&#xff1a; 理解敏捷原则和实践&#xff1a; 敏捷开发不仅是一种方法论&#xff0c;更是一…

IDEA的安装与删除插件

不小心安装了一个英文转中文的插件&#xff0c;看不习惯&#xff0c;决定重新变回英文 先点击这个settings的安装 然后就看到这个下面这张图了 如果是安装就点install&#xff0c;不用了就和我一样把这个勾给去掉

MUI框架从新手入门【webapp开发教程】

文章目录 MUI -最接近原生APP体验的高性能前端框架APP开发3.25 开发记录miu框架介绍头部/搜索框&#xff1a;身体>轮播图轮播图设置数据自动跳转&#xff1a;九宫格图片九宫格图文列表底部选项卡按钮选择器手机模拟器 心得与总结&#xff1a;MUI框架在移动应用开发中的应用M…

openGauss学习笔记-133 openGauss 数据库运维-例行维护-日维护检查项

文章目录 openGauss学习笔记-133 openGauss 数据库运维-例行维护-日维护检查项133.1 检查openGauss状态133.2 检查锁信息133.3 统计事件数据133.4 对象检查133.5 SQL报告检查133.6 备份133.7 基本信息检查 openGauss学习笔记-133 openGauss 数据库运维-例行维护-日维护检查项 …

数据结构——利用堆进行对数组的排序

今天文章的内容是关于我们如何利用堆的特性对我们的数组进行排序&#xff0c;还有就是我们的TopK的问题&#xff0c;这次我们放在的是文件种&#xff0c;我们放入一亿个数字&#xff0c;然后我们取出一亿个数字中最大的十个数&#xff0c;利用上章堆的问题进行解决。 首先就是我…

计算机基础知识详细讲解

目录 一、计算机硬件 CPU&#xff08;中央处理器&#xff09;&#xff1a;负责执行计算机指令和处理数据。 内存&#xff08;RAM&#xff09;&#xff1a;用于临时存储程序和数据。 硬盘&#xff1a;用于永久性存储数据和文件。 显示器&#xff1a;用于显示图形界面和输出信…

【SQL Server2019SSMS】安装 | 卸载手册

目录 &#x1f4cb;前言 ⛳️【SQL Serverssms】安装 1. SQL Server自定义安装 2. SSMS安装 ⛳️【SQL Server】卸载 &#x1f4cb;前言 &#x1f308;个人主页&#xff1a;Sarapines Programmer &#x1f525; 系列专栏&#xff1a;本期文章收录在《宝藏工具使用手册》&am…

git日历坐标系? 手动实现github活跃/贡献图

git日历坐标系? 手动实现github活跃/贡献图 前言 在使用github或gitlab时&#xff0c;我们总能发现&#xff0c;我们一年内的活跃度能够通过一张图直观地展现出来&#xff0c;那么你是否好奇它是如何实现的&#xff0c;最近工作中也遇到这样类似的需求&#xff0c;刚开始打算…

区块链介绍

区块链提供了比特币的公共账本&#xff0c;这是一个有序的、带有时间戳的交易记录。这个系统用于防止重复消费和修改之前的交易记录。 Introduction 比特币网络中的每个完全节点都独立存储只包含该节点验证的块的区块链。当多个节点在他们的区块链中都有相同的块时&#xff0…

uboot环境变量配置

uboot默认环境变量配置启动 进入uboot/include/configs目录下面 打开 xxxxconfig.h&#xff08;自定义uboot头文件名&#xff09;&#xff0c;配置文件中有很多的定义&#xff0c;根据具体的情况定义 根据配置&#xff0c;编译uboot uboot的自定义配置 在uboot下面的board.c…

00TDI 这件红色大衣也太适合过年穿了

分享女儿的时尚穿搭—红色大衣 这款大衣非常厚实 摸起来很软糯的触感 复合了660-700g绵羊绒 厚实度堪比一件厚实的羽绒服 门禁处做了立体的爱心装饰 精致又可爱&#xff01;&#xff01;&#xff01;

C++ String 字符串系列转换

// 宽字符转UTF8 ,处理字符乱码 std::string EncodeUtf8(std::wstring in) { std::string s(in.length() * 3 1, ); size_t len ::WideCharToMultiByte(CP_UTF8, 0, in.c_str(), in.length(), &s[0], s.length(), NULL, NULL); s.resize(len); return s; } /…

java--单继承、Object

java是单继承的&#xff0c;java中的类不支持多继承&#xff0c;但是支持多层继承。 反证法&#xff1a; 如果一个类同时继承两个类&#xff0c;然后两个类中都有同样的一个方法&#xff0c;哪当我创建这个类里的方法&#xff0c;是调用哪父类的方法 所以java中的类不支持多继…

Spring的@Feign源码分析

首先是开启Feign的注解EnableFeignClientsFeignClient EnableFeignClients会导入FeignClientsRegistrar类&#xff0c; FeignClientsRegistrar里面会解析EnableFeignClients注解&#xff0c;把里面配置的路径解析&#xff0c; 找到带有FeignClient注解的接口&#xff0c;注意是…

【Linux】:信号的产生

信号 一.前台进程和后台进程1.前台进程2。后台进程3.总结 二.自定义信号动作接口三.信号的产生1.键盘组合键2.kill信号进程pid3.系统调用1.kill函数2.raise函数3.abort函数 四.异常五.软件条件六.通过终端按键产生信号 一.前台进程和后台进程 1.前台进程 一个简单的代码演示 …

提高SQL语句执行效率的8个方法

提高SQL语句执行效率的8个方法 在日常的数据库操作中&#xff0c;如何提高SQL语句的执行效率是每个程序员都需要关注的问题&#xff0c;SQL语句的执行效率对系统的性能有着重要影响&#xff0c;本文将介绍8种提高SQL语句执行效率的方法。 合理使用索引 索引介绍 索引是数据…