从零开始仅学习了一下午的总结,本文非常稚嫩…
本文为纯初学者的学习记录,为了方便理解,内容未必严谨,可以用作纯新手的入门了解篇。本文主要的参考链接如下⬇️
详细了解FLV:FLV官方文档(Version 10.1)
简单明了的解释FLV协议:稀土掘金:FLV协议5分钟入门浅析
图片形式介绍FLV协议:CSDN:FLV格式详解
案例解析FLV协议:简书: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视频的使用给视频传播带来了极大便利。
简单来说,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分为三种类型:
通常来讲,一个协议的头部,是这个协议的标识,版本号,偏移等内容,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],但是全网都是采用这个数据,我怕是我自己理解错了,因此没进行改动。
前面已经说过,body由一些tags组成。
FLV file body = tag0size + tag1 + tag1size + tag1 ... + tag(n-1)size + tagn
tags则由tag header + tag body组成。
tag_i_size 的大小:
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
注意:接下来的内容并非原创,主要是为了本文的内容完整性,均来自官方文档截图,对应FLV官方文档(Version 10.1)第70~78页。 如果以后有新的想法,可能会对此部分进行修改或解释。
ScriptData的内容主要是存放FLV相关的元数据,比如创建时间、时长、视频帧率、视频宽度、视频高度、音频采样率…,相对比Audio和Video复杂得多,这里本文没有给出详细截图,详见FLV官方文档(Version 10.1)吧。。。。
本文为纯初学者的学习记录,为了方便理解,内容未必严谨,可以用作纯新手的入门了解篇。本文主要的参考链接如下⬇️
详细了解FLV:FLV官方文档(Version 10.1)
简单明了的解释FLV协议:稀土掘金:FLV协议5分钟入门浅析
图片形式介绍FLV协议:CSDN:FLV格式详解
案例解析FLV协议:简书:flv文件分析