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协议的了解。