您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

FLV协议5分钟入门浅析

时间:2019-08-12 11:10:44  来源:  作者:



FLV协议简介

FLV(Flash Video)是一种流媒体格式,因其体积小、协议相对简单,很快便流行开来,并得到广泛的支持。

常见的HTTP-FLV直播协议,就是使用HTTP流式传输通过FLV封装的音视频数据。对想要了解HTTP-FLV的同学来说,了解FLV协议很有必要。

概括地说,FLV 由 FLV header 跟 FLV file body 两部分组成,而 FLV file body 又由多个 FLV tag组成。

FLV = FLV header + FLV file body FLV file body = PreviousTagSize0 + Tag1 + PreviousTagSize1 + Tag2 + ... + PreviousTagSizeN-1 + TagN

FLV tag又分为3种类型:

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

在实际讲解FLV协议前,首先对单位进行约定:

类型定义0x...16进制数据SI8有符号8位整数SI16有符号16位整数SI24有符号24位整数SI32有符号32位整数STRINGSequence of Unicode 8-bit characters (UTF-8), terminated with 0x00 (unless otherwise specified)UI8无符号8位整数UI16无符号16位整数UI24无符号24位整数UI32无符号32位整数xxx [ ]类型为xxx的数组xxx [n]类型为xxx的数组,数组长度为n

FLV header

FLV header由如下字段组成,其中:

  1. 前三个字节内容固定是FLV
  2. 最后4个字节内容固定是9(对FLV版本1来说)

字段字段类型字段含义SignatureUI8签名,固定为'F' (0x46)SignatureUI8签名,固定为'L' (0x4c)SignatureUI8签名,固定为'V' (0x56)VersionUI8版本,比如 0x01 表示 FLV 版本 1TypeFlagsReservedUB[5]全为0TypeFlagsAudioUB[1]1表示有audio tag,0表示没有TypeFlagsReservedUB[1]全为0TypeFlagsVideoUB[1]1表示有video tag,0表示没有DataOffsetUI32FLV header的大小,单位是字节

FLV file body

FLV file body很有规律,由一系列的TagSize和Tag组成,其中:

  1. PreviousTagSize0 总是为0;
  2. tag 由tag header、tag body组成;
  3. 对FLV版本1,tag header固定为11个字节,因此,PreviousTagSize(除第1个)的值为 11 + 前一个tag 的 tag body的大小;

字段字段类型字段含义PreviousTagSize0UI32总是0Tag1FLVTAG第1个tagPreviousTagSize1UI32前一个tag的大小,包括tag headerTag2FLVTAG第2个tag.........PreviousTagSizeN-1UI32第N-1个tag的大小TagNFLVTAG第N个tagPreviousTagSizeNUI32第N个tag的大小,包含tag header

FLV tags

FLV tag由 tag header + tag body组成。

tag header如下,总共占据11个字节:

字段字段类型字段含义TagTypeUI8tag类型

8:audio

9:video

18:script data

其他:保留DataSizeUI24tag body的大小TimestampUI24相对于第一个tag的时间戳(单位是毫秒)

第一个tag的Timestamp为0TimestampExtendedUI8时间戳的扩展字段,当 Timestamp 3个字节不够时,会启用这个字段,代表高8位StreamIDUI24总是0Data取决于根据TagTypeTagType=8,则为AUDIODATA

TagType=9,则为VIDEODATA

TagType=18,则为SCRIPTDATAOBJECT

In playback, the time sequencing of FLV tags depends on the FLV timestamps only. Any timing mechanisms built into the payload data format are ignored.

Audio tags

定义如下所示:

字段字段类型字段含义SoundFormatUB[4]音频格式,重点关注 **10 = AAC **

0 = Linear PCM, platform endian

1 = ADPCM

2 = MP3

3 = Linear PCM, little endian

4 = Nellymoser 16-kHz mono

5 = Nellymoser 8-kHz mono

6 = Nellymoser

7 = G.711 A-law logarithmic PCM 8 = G.711 mu-law logarithmic PCM 9 = reserved

10 = AAC

11 = Speex

14 = MP3 8-Khz

15 = Device-specific sound

SoundRateUB[2]采样率,对AAC来说,永远等于3

0 = 5.5-kHz

1 = 11-kHz

2 = 22-kHz

3 = 44-kHzSoundSizeUB[1]采样精度,对于压缩过的音频,永远是16位

0 = snd8Bit

1 = snd16BitSoundTypeUB[1]声道类型,对Nellymoser来说,永远是单声道;对AAC来说,永远是双声道;

0 = sndMono 单声道

1 = sndStereo 双声道SoundDataUI8[size of sound data]如果是AAC,则为 AACAUDIODATA;

其他请参考规范;

备注:

If the SoundFormat indicates AAC, the SoundType should be set to 1 (stereo) and the SoundRate should be set to 3 (44 kHz). However, this does not mean that AAC audio in FLV is always stereo, 44 kHz data. Instead, the Flash Player ignores these values and extracts the channel and sample rate data is encoded in the AAC bitstream.

AACAUDIODATA

当 SoundFormat 为10时,表示音频采AAC进行编码,此时,SoundData的定义如下:

字段字段类型字段含义AACPacketTypeUI80: AAC sequence header

1: AAC rawDataUI8[n]如果AACPacketType为0,则为AudIOSpecificConfig

如果AACPacketType为1,则为AAC帧数据

The AudioSpecificConfig is explained in ISO 14496-3. Note that it is not the same as the contents of the esds box from an MP4/F4V file. This structure is more deeply embedded.

关于AudioSpecificConfig

伪代码如下:参考这里

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
复制代码

定义如下:

字段字段类型字段含义AudioObjectTypeUB[5]编码器类型,比如2表示AAC-LCSamplingFrequencyIndexUB[4]采样率索引值,比如4表示44100SamplingFrequencyIndexUB[4]采样率索引值,比如4表示44100ChannelConfigurationUB[4]声道配置,比如2代表双声道,front-left, front-right

Video tags

定义如下:

字段字段类型字段含义FrameTypeUB[4]重点关注1、2:

1: keyframe (for AVC, a seekable frame) —— 即H.264的IDR帧;

2: inter frame (for AVC, a non- seekable frame) —— H.264的普通I帧;

3: disposable inter frame (H.263 only)

4: generated keyframe (reserved for server use only)

5: video info/command frameCodecIDUB[4]编解码器,主要关注 7(AVC)

1: JPEG (currently unused)

2: Sorenson H.263

3: Screen video

4: On2 VP6

5: On2 VP6 with alpha channel 6: Screen video version 2

7: AVCVideoData取决于CodecID实际的媒体类型,主要关注 7:AVCVIDEOPACKE

2: H263VIDEOPACKET

3: SCREENVIDEOPACKET

4: VP6FLVVIDEOPACKET

5: VP6FLVALPHAVIDEOPACKET

6: SCREENV2VIDEOPACKET

7: AVCVIDEOPACKE

AVCVIDEOPACKE

当 CodecID 为 7 时,VideoData 为 AVCVIDEOPACKE,也即 H.264媒体数据。

AVCVIDEOPACKE 的定义如下:

字段字段类型字段含义AVCPacketTypeUI80: AVC sequence header

1: AVC NALU

2: AVC end of sequenceCompositionTimeSI24如果AVCPacketType=1,则为时间cts偏移量;否则,为0DataUI8[n]1、如果如果AVCPacketType=1,则为AVCDecoderConfigurationRecord

2、如果AVCPacketType=1=2,则为NALU(一个或多个)

3、如果AVCPacketType=2,则为空

这里有几点稍微解释下:

  1. NALU:H.264中,将数据按照特定规则格式化后得到的抽象逻辑单元,称为NALU。这里的数据既包括了编码后的视频数据,也包括视频解码需要用到的参数集(PPS、SPS)。
  2. AVCDecoderConfigurationRecord:H.264 视频解码所需要的参数集(SPS、PPS)
  3. CTS:当B帧的存在时,视频解码呈现过程中,dts、pts可能不同,cts的计算公式为 pts - dts/90,单位为毫秒;如果B帧不存在,则cts固定为0;

PPS、SPS这里先不展开。

Script Data Tags

Script Data Tags通常用来存放跟FLV中音视频相关的元数据信息(onMetaData),比如时长、长度、宽度等。它的定义相对复杂些,采用AMF(Action Message Format)封装了一系列数据类型,比如字符串、数值、数组等。

字段字段类型字段含义ObjectsSCRIPTDATAOBJECT[]任意数目的 SCRIPTDATAOBJECTSCRIPTDATAOBJECTENDUI24永远是9,标识着Script Data的结束

SCRIPTDATAOBJECT 定义如下:

字段字段类型字段含义ObjectNameSCRIPTDATASTRING对象的名字ObjectDataSCRIPTDATAVALUE对象的值

SCRIPTDATAVALUE 的定义如下:

字段字段类型字段含义TypeSCRIPTDATASTRING变量类型:

0 = Number type

1 = Boolean type

2 = String type

3 = Object type

4 = MovieClip type

5 = Null type

6 = Undefined type

7 = Reference type 8 = ECMA array type 10 = Strict array type 11 = Date type

12 = Long string typeECMAArrayLength如果Type为8(数组),则为UI32数组长度ScriptDataValueIf Type == 0 DOUBLE

If Type == 1 UI8

If Type == 2 SCRIPTDATASTRING

...(有点长,可以参考规范)变量的值ScriptDataValueTerminator如果Type==3,则为SCRIPTDATAOBJECTEND

如果 Type==8,则为SCRIPTDATAVARIABLEENDObject、Array的结束符

可以看到,Script Data Tag 的定义相对复杂,下面通过onMetaData进行进一步讲解。

onMetaData

onMetaData中包含了音视频相关的元数据,封装在Script Data Tag中,它包含了两个AMF。

第一个AMF:

  • 第1个字节:0x02,表示字符串类型
  • 第2-3个字节:UI16类型,值为0x000A,表示字符串的长度为10(onMetaData的长度);
  • 第4-13个字节:字符串onMetaData对应的16进制数字(0x6F 0x6E 0x4D 0x65 0x74 0x61 0x44 0x61 0x74 0x61);

第二个AMF:

  • 第1个字节:0x08,表示数组类型;
  • 第2-5个字节:UI32类型,表示数组的长度,onMetaData中具体包含哪些属性是不固定的。
  • 第6个字节+:比如duration,则:
  • 第6-9个字节:0x0008,表示长度为8个字节;
  • 第10-17个字节:0x6475 7261 7469,表示 duration 这个字符串;
  • 第18个字节:0x00,表示为数值类型;
  • 第19-26个字节:0x...,表示具体的时长;

更多onMetaData字段的定义:

字段字段类型字段含义durationDOUBLE文件的时长widthDOUBLE视频宽度(px)heightDOUBLE视频高度(px)videodatarateDOUBLE视频比特率(kb/s)framerateDOUBLE视频帧率(帧/s)videocodecidDOUBLE视频编解码器ID(参考Video Tag)audiosamplerateDOUBLE音频采样率audiosamplesizeDOUBLE音频采样精度(参考Audio Tag)stereoBOOL是否立体声audiocodecidDOUBLE音频编解码器ID(参考Audio Tag)filesizeDOUBLE文件总得大小(字节)

写在后面

FLV协议本身不算复杂,理解上的困难,更多时候来自音视频编解码相关的知识,比如H.264、AAC相关知识,建议不懂的时候自行查下。此外,FLV的字节序为大端序,在做协议解析的时候一定要注意。

本文为讲解方便,部分内容可能不够严谨,如有错漏敬请指出。

相关链接

video_file_format_spec_v10.pdf www.adobe.com/content/dam…

MPEG-4 Part 3 en.wikipedia.org/wiki/MPEG-4…

flv文件分析 www.jianshu.com/p/e290dca02…

H.264再学习 -- 详解 H.264 NALU语法结构 blog.csdn.net/qq_29350001…



Tags:FLV协议   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
FLV协议简介FLV(Flash Video)是一种流媒体格式,因其体积小、协议相对简单,很快便流行开来,并得到广泛的支持。常见的HTTP-FLV直播协议,就是使用HTTP流式传输通过FLV封装的音视频...【详细内容】
2019-08-12  Tags: FLV协议  点击:(254)  评论:(0)  加入收藏
▌简易百科推荐
本文分为三个等级自顶向下地分析了glibc中内存分配与回收的过程。本文不过度关注细节,因此只是分别从arena层次、bin层次、chunk层次进行图解,而不涉及有关指针的具体操作。前...【详细内容】
2021-12-28  linux技术栈    Tags:glibc   点击:(3)  评论:(0)  加入收藏
摘 要 (OF作品展示)OF之前介绍了用python实现数据可视化、数据分析及一些小项目,但基本都是后端的知识。想要做一个好看的可视化大屏,我们还要学一些前端的知识(vue),网上有很多比...【详细内容】
2021-12-27  项目与数据管理    Tags:Vue   点击:(2)  评论:(0)  加入收藏
程序是如何被执行的  程序是如何被执行的?许多开发者可能也没法回答这个问题,大多数人更注重的是如何编写程序,却不会太注意编写好的程序是如何被运行,这并不是一个好...【详细内容】
2021-12-23  IT学习日记    Tags:程序   点击:(9)  评论:(0)  加入收藏
阅读收获✔️1. 了解单点登录实现原理✔️2. 掌握快速使用xxl-sso接入单点登录功能一、早期的多系统登录解决方案 单系统登录解决方案的核心是cookie,cookie携带会话id在浏览器...【详细内容】
2021-12-23  程序yuan    Tags:单点登录(   点击:(8)  评论:(0)  加入收藏
下载Eclipse RCP IDE如果你电脑上还没有安装Eclipse,那么请到这里下载对应版本的软件进行安装。具体的安装步骤就不在这赘述了。创建第一个标准Eclipse RCP应用(总共分为六步)1...【详细内容】
2021-12-22  阿福ChrisYuan    Tags:RCP应用   点击:(7)  评论:(0)  加入收藏
今天想简单聊一聊 Token 的 Value Capture,就是币的价值问题。首先说明啊,这个话题包含的内容非常之光,Token 的经济学设计也可以包含诸多问题,所以几乎不可能把这个问题说的清...【详细内容】
2021-12-21  唐少华TSH    Tags:Token   点击:(10)  评论:(0)  加入收藏
实现效果:假如有10条数据,分组展示,默认在当前页面展示4个,点击换一批,从第5个开始继续展示,到最后一组,再重新返回到第一组 data() { return { qList: [], //处理后...【详细内容】
2021-12-17  Mason程    Tags:VUE   点击:(14)  评论:(0)  加入收藏
什么是性能调优?(what) 为什么需要性能调优?(why) 什么时候需要性能调优?(when) 什么地方需要性能调优?(where) 什么时候来进行性能调优?(who) 怎么样进行性能调优?(How) 硬件配...【详细内容】
2021-12-16  软件测试小p    Tags:性能调优   点击:(20)  评论:(0)  加入收藏
Tasker 是一款适用于 Android 设备的高级自动化应用,它可以通过脚本让重复性的操作自动运行,提高效率。 不知道从哪里听说的抖音 app 会导致 OLED 屏幕烧屏。于是就现学现卖,自...【详细内容】
2021-12-15  ITBang    Tags:抖音防烧屏   点击:(25)  评论:(0)  加入收藏
11 月 23 日,Rust Moderation Team(审核团队)在 GitHub 上发布了辞职公告,即刻生效。根据公告,审核团队集体辞职是为了抗议 Rust 核心团队(Core team)在执行社区行为准则和标准上...【详细内容】
2021-12-15  InfoQ    Tags:Rust   点击:(25)  评论:(0)  加入收藏
相关文章
    无相关信息
最新更新
栏目热门
栏目头条