FLV-初学总结

news2025/2/26 0:33:18

FLV-初学总结

从零开始仅学习了一下午的总结,本文非常稚嫩…
本文为纯初学者的学习记录,为了方便理解,内容未必严谨,可以用作纯新手的入门了解篇。本文主要的参考链接如下⬇️

  • 详细了解FLV:FLV官方文档(Version 10.1)

  • 简单明了的解释FLV协议:稀土掘金:FLV协议5分钟入门浅析

  • 图片形式介绍FLV协议:CSDN:FLV格式详解

  • 案例解析FLV协议:简书:flv文件分析

1. FLV是什么?(简介)

FLV(Flash Video),是一种流媒体的格式,Youtube等视频网站都是通过Flash作为视频播放载体,支撑这些视频网站的技术基础就是——Flash 视频(FLV) 。

国内使用FLV视频格式的网站/应用 包括,淘宝直播,抖音视频,bilibili,土豆,(好像只有爱奇艺不是,但我不是很确定)。

看不懂官方英文简介可以看中文简介。

官方简介(简洁版) Flash video formats FLV, F4V, and SWF (Shockwave Flash) are designed for Flash Player, but they’re commonly used to stream video on YouTube. Flash is not supported by iOS devices.

官方简介(正式版):The FLV video format was developed by Adobe Systems for its Flash Player. It was created to embed video streams in Adobe applications and for use with a Flash plug-in, which made it a popular choice for streaming videos on YouTube. It was designed to offer users consistency and compatibility with other Adobe programs when editing and storing video files, and was notable for its interleaved audio, video, and metadata packets.

百度百科FLV (略有改动):FLV 是一种Adobe公司设计开发的流媒体视频格式,它利用了网页上广泛使用的Flash Player 平台,将视频整合到Flash动画中。也就是说,网站的访问者只要能看Flash动画,自然也能看FLV格式视频,而无需再额外安装其它视频插件,FLV视频的使用给视频传播带来了极大便利。

2. FLV协议构成(Header + Body(tags))

简单来说,FLV由(FLV)header和(FLV)body组成,body由一些tags组成。

FLV = header + body;

header主要包含一些标识,body则由一些tags组成⬇️

FLV body = tag0size + tag1 + tag1size + tag1 ... + tag(n-1)size + tagn 

body中的tags是什么?——可以直接理解为 音/视频内容

body tags分为三种类型:

  • Video Tag:存放视频相关数据;
  • Audio Tag:存放音频相关数据;
  • Script Tag:存放音视频元数据;

3. FLV header

通常来讲,一个协议的头部,是这个协议的标识,版本号,偏移等内容,FLV header也不例外。

FLV header = Signature(3 Byte)+Version(1 Byte)+Flags(1 Bypte)+DataOffset(4 Byte)

即FLV header组成为:标识(固定为FLV三个字符) —— 版本号 —— 内容标识 ——Header字段长度;

其中内容标识Flags,标识的是视频、音频的存在情况,第0位和第2位,分别表示 video tags与 audio tags存在的情况,(1表示存在,0表示不存在)。比如,如果Flags = 0x05,也就是00000101,代表既有视频tags,也有音频tags。

FLV header的内容示例

UI8 = unsigned int 8, UB[5] = unsigned byte (1字节)中的第5bit

Field              Type         Comment
Signature          UI8          Signature byte always 'F' (0x46)
Signature          UI8          Signature byte always 'L' (0x4C)
Signature          UI8          Signature byte always 'V' (0x56)
Version            UI8          File version (for example, 0x01 for FLV
version 1)
TypeFlagsReserved  UB[5]        Must be 0
TypeFlagsAudio     UB[1]        Audio tags are present
TypeFlagsReserved  UB[1]         Must be 0
TypeFlagsVideo     UB[1]         Video tags are present
DataOffset         UI32          Offset in bytes from start of file to start of body (that is, size of header version 1 always is 9)

PS:这里我暂时没搞明白,为什么全是UB[1],按理说是写错了,TypeFlagsAudio应该是UB[2],TypeFlagsVideo应该是UB[0],但是全网都是采用这个数据,我怕是我自己理解错了,因此没进行改动。

4. FLV file body

前面已经说过,body由一些tags组成。

FLV file body = tag0size + tag1 + tag1size + tag1 ... + tag(n-1)size + tagn 

tags则由tag header + tag body组成。

tag_i_size 的大小:

  • tag0size = 0;
  • FLV version 1中,tag header 长度为11B。因此tag_i_size = tag_i_tag_body_size + 11。

4.1 tag header

FLV version 1中的tag header固定长度为11B,tag的主要内容如下⬇️

Field              	Type         			Comment

TagType							UI8								8:audio, 9:video, 18:script data, others:reserved

DataSize						UI24							tag body size

Timestamp						UI24							相对于第一个tag的时间戳(毫秒),第一个tag的Timestamp为0

TimestampExtended		UI8								时间戳的扩展字段,当Timestamp的3个字节不够时,启用这个字段,代表高8位

StreamID						UI24							Must be 0

//如上所示,tag header共11B
//注意,Data并不是tag header的内容,而是tag body的内容
Data								取决于TagType			(Tag的具体内容)TagType=8: AUDIODATA, TagType=9: VIDEODATA, TagType=18: SCRIPTDATAOBJECT

Tag内容主要取决于TagType

  • audio
  • video
  • script data
  • others(reserved)

注意:接下来的内容并非原创,主要是为了本文的内容完整性,均来自官方文档截图,对应FLV官方文档(Version 10.1)第70~78页。 如果以后有新的想法,可能会对此部分进行修改或解释。

4.2 Audio Tags

image-20230221160921662

image-20230221160932375

image-20230221160909255

4.2.1 AACAudio Tags

image-20230221161044076

image-20230221161055940

4.3 Vedio Tags

image-20230221160541688

image-20230221160633069

4.4 ScriptData Tags

ScriptData的内容主要是存放FLV相关的元数据,比如创建时间、时长、视频帧率、视频宽度、视频高度、音频采样率…,相对比Audio和Video复杂得多,这里本文没有给出详细截图,详见FLV官方文档(Version 10.1)吧。。。。

image-20230221161448292

5. 再次强调

本文为纯初学者的学习记录,为了方便理解,内容未必严谨,可以用作纯新手的入门了解篇。本文主要的参考链接如下⬇️

  • 详细了解FLV:FLV官方文档(Version 10.1)

  • 简单明了的解释FLV协议:稀土掘金:FLV协议5分钟入门浅析

  • 图片形式介绍FLV协议:CSDN:FLV格式详解

  • 案例解析FLV协议:简书:flv文件分析

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

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

相关文章

面向对象之三大特性(二)

5. 面向对象三大特性 继承、多肽、封装 5.1 继承 类的继承与现实生活中的父、子继承关系一样。被继承的类称为父类、基类或超类,继承者称为子类。Python 继承分为:单继承和多继承(继承多个类)。 class Parent1:pass class Par…

分析称勒索攻击在非洲、中东与中国增长最快

Orange Cyberdefense(OCD)于 2022 年 12 月 1 日发布了最新的网络威胁年度报告。报告中指出,网络勒索仍然是头号威胁 ,也逐渐泛滥到世界各地。 报告中的网络威胁指的是企业网络中的某些资产被包括勒索软件在内的攻击进行勒索&…

Qt中修改界面类的类名时需要注意的几个修改点

有些时候因为一些原因,需要修改Qt中创建的界面类,需要特别注意几个修改点。 比如将test类修改为test2类 修改test.h名称为test2.h文件;修改test.cpp名称为test2.cpp文件;修改test.ui名称为test2.ui文件;修改pro文件中…

前端Docker部署方案

一、Docker容器和镜像概念 首先明确镜像和容器的概念。我们可以用 docker 构建一个镜像,这个镜像可以导入导出,用于传输,重复利用。然后如果把他 run 起来,则称为一个容器。容器是运行时,会包括运行时上下文&#xff…

Vue基础14之TodoList组件自定义事件、全局事件总线、TodoList全局事件总线

Vue基础14TodoList-组件自定义事件先改Header和Footer子组件,List先不考虑App.vueMyHeader.vueMyFooter.vue全局事件总线实现思路正规写法main.jsApp.vueStudent.vueSchool.vue总结:全局事件总线(GlobalEventBus)TodoList案例&…

【Java闭关修炼】MyBatis-接口代理的方式实现Dao层

【Java闭关修炼】MyBatis-接口代理的方式实现Dao层实现规则代码实现代理对象分析接口代理方式小结实现规则 映射配置文件中的名称空间必须和Dao层接口的全类名相同映射配置文件的增删改查标签的id属性必须和Dao层接口方法的参数相同映射配置文件中的增删改查标签的parameterTyp…

【C进阶】数据的存储

文章目录:star:1. 数据类型:star:2. 整形在内存中的存储2.1 存储规则2.2 存储模式2.3 验证大小端模式:star:3. 数据范围3.1 整形溢出3.2 数据范围的求解3.3 练习:star:4. 浮点型在内存中的存储4.1 浮点数的存储规则4.2 练习5. :star::star:总结(思维导图)⭐️1. 数据类型 在了…

独立产品灵感周刊 DecoHack #048 - 优秀独立开发产品推荐

如果有关注我的 Twitter 的朋友应该看到了,我上周末研究了两天 AI 画图,现在用 Ai 做图太强了,上周又升级 Stable Diffusion 玩了一下,和我去年试的时候相比强大了好多,而且插件LoRA模型玩法都还在快速迭代&#xff0c…

超详细解读!数据库表分区技术全攻略

更多内容可以关注微信公众号:老程序员刘飞 分区的定义 分区是一种数据库优化技术,它可以将大表按照一定的规则分成多个小表,从而提高查询和维护的效率。在分区的过程中,数据库会将数据按照分区规则分配到不同的分区中&#xff0…

【Linux】调试工具gdb的使用

环境:centos7.6,腾讯云服务器Linux文章都放在了专栏:【Linux】欢迎支持订阅🌹前言在前文,我们已经讲解了vim工具以及gcc/g的使用,我们可以进行编写代码以及编译代码了,但是还没有学习如何在Linu…

贪心--跳跃问题/拼接问题

跳跃问题 判断能否从数轴的最左端跳跃到最右边 变形:最少跳跃次数 45.跳跃游戏 题目链接 给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标。 示…

博客界的至高神:属于自己的WordPress网站,你值得拥有!

【如果暂时没时间安装,可以直接跳转到最后先看展示效果】 很多朋友都想有一个对外展示的窗口,在那里放一些个人的作品或者其他想对外分享的东西。大部分人选择了在微博、公众号等平台,毕竟这些平台流量大,我们可以很轻易地把自己…

Jectpack -- Navigation了解与简单使用

简介 Navigation是一个可简化的Android导航的库和插件,换句话说,Navigation是用来规范管理Fragment的切换的,并且是通过可视化的方式来进行管理的。 ![[Pasted image 20230210083913.png]] 正常的跳转方法(其实有kotlin以后,代…

【性能测试基础】,从0到实战(手把手教,非常实用)

一、性能基础什么是性能测试--->本质?基于协议来模拟用户发送的请求(业务模拟),对服务器形成一定负载。关注点:时间性能、空间性能与界面无关性能测试分类性能测试(狭义)性能测试方法是通过模拟生产环境…

【C++】多线程

多任务处理有两种形式,即:多进程和多线程。 基于进程的多任务处理是程序的并发执行。基于线程的多任务处理是同一程序的片段的并发执行 文章目录1. 多线程介绍2. Windows多线程1. 多线程介绍 每一个进程(可执行程序)都有一个主线…

AcWing1027. 方格取数

AcWing1027. 方格取数设有 NN 的方格图,我们在其中的某些方格中填入正整数,而其它的方格中则放入数字0。如下图所示:某人从图中的左上角 A 出发,可以向下行走,也可以向右行走,直到到达右下角的 B 点。在走过…

SpringBoot+Vue前后端分离管理系统02:前端

前端环境搭建 1、node环境 C:\Windows\system32>node -v v12.13.0C:\Windows\system32>npm -v 6.12.0 2、下载vue-admin-template 官网:介绍 | vue-element-admin 项目初始化 1、安装依赖 在刚才下载的vue-admin-template-4.4.0目录下以管理员方式运行c…

Robot Framework + Selenium2Library环境下,结合Selenium Grid实施分布式自动化测试

最近一段时间,公司在推行自动化测试流程,本人有幸参与了自定义通用控件的关键字封装和脚本辅助编写、数据驱动管理、测试用例执行管理等一系列工具软件的研发工作,积累了一些经验,在此与大家做一下分享,也算是做一个总…

SQL零基础入门学习(四)

SQL零基础入门学习(三) SQL INSERT INTO 语句 INSERT INTO 语句用于向表中插入新记录。 SQL INSERT INTO 语法 INSERT INTO 语句可以有两种编写形式。 第一种形式无需指定要插入数据的列名,只需提供被插入的值即可: INSERT …

ImageCombiner设计源码详解

前言在前面的博客中介绍了一款Java的海报生成器ImageCombiner,原文地址:拿来就用的Java海报生成器ImageCombiner(一),在博文中简单介绍了一下代码以及一个真实的生成案例。但是对源码的介绍不多,本文就针对源码进行深入…