FLV格式详解

本文是什么

FLV (Flash Video) 是由Adobe公司开发的一种非常流行的视频格式,其简单的内容组成非常适合用于流媒体传输。虽然现如今这种格式已经开始被弃用,但因为各种原因,一部分企业仍然继续使用这种格式来进行流媒体传输。学习FLV格式也有利于学习同样是由Adobe公司开发的实时传输协议RTMP (Real-Time Messaging Protocol)。因此本文将会介绍FLV文件是如何组织音视频信息的。

正文

FLV文件由FLV文件头以及多个Tag组成,其中的各种信息是以大端的方式进行存储。简单来说FLV文件=FLV文件头+FLV文件体(Tag0+Tag1+...+TagN)。

FLV文件头

FLV的文件头固定为9个字节大小。
第0-2个字节是文件签名,值为FLV。
第3个字节为文件的版本,目前只有1。
第4个字节就被分为了4个部分,其中第0-4位作为保留值,值为0;第5位表示是否有音频Tag,0为没有,1为有。第6位也被用作保留值;第7位表示是否具有视频Tag,同样是0为没有,1为有。
第5-8个字节表示数据偏移,其实就是FLV文件头的大小,值固定为9。

FLV文件体

FLV文件体有许多个Tag拼接而成。从这种结构来看,FLV文件确实非常适合用于流媒体中,每个Tag之间都相对独立,易于切分。每个Tag由4字节大小的前一个Tag大小和当前Tag主体组成,也就是Tag=前一个Tag大小+当前Tag主体。
每个Tag由多个固定的字段组成。
第0个字节表示这个Tag的类型,8为音频,9为视频,18为文本数据,其他值进行了保留。
第1-3个字节表示数据部分的大小。
第4-6个字节表示时间戳。
第7个字节为扩展时间戳,与时间戳共同使用就可以表示32位的时间,其中扩展时间戳表示高位,时间戳表示低位。
第8-10个字节为流ID,这个值一直为0。
后面的字节都是数据,是什么类型的数据由前面的Tag类型指示,长度由前面的数据大小指示。数据部分也有固定的字段对这个数据进行更近一步的说明。

音频数据

第0-3位表示了音频的格式,值见下表。

类型
0 线性PCM,大小端与平台相关
1 ADPCM
2 MP3
3 线性PCM,小端
4 Nellymoser 16KHz 单声道
5 Nellymoser 8KHz 单声道
6 NellyMoser
7 G.711 A-law 对数PCM
8 G.711 mu-law 对数PCM
9 保留
10 AAC
11 Speex
14 MP3 8KHz
15 设备相关类型

第4-5位表示声音的采样率,值见下表

采样率
0 5.5KHz
1 11KHz
2 22KHz
3 44KHz

第6位表示每次采样的大小,或者叫做位深。0为8bit,1为16bit。
第7位为声音通道数。0为单通道,1为双通道。
如果声音的格式为AAC,则还会多占用1个字节来表示这个音频数据是AAC序列头还是AAC原始数据。剩余的部分就都是音频的数据了。

视频数据

第0-3位表示帧的类型,值见下表。

帧类型
1 关键帧,I帧 H264
2 P帧或B帧 H264
3 H263
4 生成关键帧,服务器使用
5 视频信息,命令帧

第4-7位为编码器ID,值见下表。

帧类型
1 JPEG,未使用
2 Sorenson H263
3 Screen Video
4 On2 VP6
5 带Alpha通道的On2 VP6
6 Screen Video 2
5 H264

同样,如果编码器类型为H264,则同样会占用4个字节。
第0个字节表示H264包的类型。0为H264序列头,1为NALU,2为H264序列结尾。
第1-3个字节表示为一个时间差值,是一个有符号数,如果视频中有B帧,这个值表示B帧PTS和DTS之间的差值。剩余的部分就是视频数据了。

文本数据

第0个字节表示数据的类型,为AMF格式。剩余的数据则根据AMF格式进行解析。

结尾

以上就是FLV文件的组成,可以看出其格式相对还是比较简单的,这也是为什么FLV比较适合作为流媒体格式的原因。FLV文件=FLV文件头+FLV文件体。FLV文件头对文件进行了十分简单的描述。FLV文件体又由多个Tag组成,Tag中又有固定字段对Tag的属性进行描述,而在Tag的数据中又根据Tag类型有更加详细的数据描述。了解FLV文件的组成不仅方便我们操作FLV文件,也利于对RTMP协议的了解。

posted on 2023-12-22 23:30  winterYANGWT  阅读(76)  评论(0编辑  收藏  举报