音视频系列之FLV格式详解

FLV简介

FLV(Flash Video)是现在非常流行的流媒体格式,由于其视频文件体积轻巧、封装播放简单等特点,使其很适合在网络上进行应用,目前主流的视频网站很多都是使用了FLV格式。

另外RTMP和FLV格式有着友好的兼容性,在使用RTMP进行推流时,RTMP Packet中封装的音视频数据流,其实和FLV/tag封装音频和视频数据的方式是相同的。

FLV格式解析

首先我们来看一张图:

图片
flv格式

FLV封装格式是由一个文件头(flie header)和 文件体(file Body)组成。其中,FLV body由一对对的(Previous Tag Size字段 + tag)组成。

Previous Tag Size字段 排列在Tag之前,占用4个字节。Previous Tag Size记录了前面一个Tag的大小,用于逆向读取处理。

FLV header后的第一个Pervious Tag Size的值为0。

Tag一般可以分为3种类型:脚本(帧)数据类型、音频数据类型、视频数据。FLV数据以大端序进行存储。

我们通过一张图看下FLV的具体文件结构:

图片
FLV文件的详细内容结构
  • FLV header

FLV头占9个字节,用来标识文件为FLV类型,以及后续存储的音视频流。

FLV头由以下几部分组成:

1、 Signature(3 Byte)+Version(1 Byte)+Flags(1 Bypte)+DataOffset(4 Byte) 总共9个字节。

signature 占3个字节 固定FLV三个字符作为标示。一般发现前三个字符为FLV时就认为他是flv文件。二进制查看器中就是0x46 0x4C 0x56,代表FLV。

Version 占1个字节 标示FLV的版本号。一般是1。

Flags 占1个字节 内容标示。第0位和第2位,分别表示 video 与 audio 存在的情况.(1表示存在,0表示不存在)。比如tag是0x05,也就是二进制的00000101,代表既有视频,也有音频。

DataOffset 4个字节 表示FLV的header长度。目前第一版是9。

  • FLV Body

FLV的body部分是一系列的back-pointers+tag构成的。其中Back-pointer表示Previous Tag Size(前一个tag的字节数据长度),占4个字节。

tag分三种类型:video(视频),audio(音频),scripts(脚本数据)。

  • FLV Tag

每一个Tag也是由两部分组成:tag header 和 tag data。
Tag Header里存放的是当前tag的类型、数据区(tag data)的长度等信息。tag header一般占11个字节的内存空间。

具体内容如下:
1、 type 1个字节。8为Audio,9为Video,18为scripts。(8、9、18这些是使用type转换成十进制的结果)

2、 tag data size 3个字节。表示tag data的长度。从streamd id 后算起。

3、 Timestreamp 3个字节。时间戳。

4、 TimestampExtended 1个字节。时间戳扩展字段。

5、 stream id 3个字节。总是0。

  • Script Tag Data结构(脚本类型、帧类型)

该类型Tag又被称为MetaData Tag,存放一些关于FLV视频和音频的元信息,
比如:duration、width、height等。通常该类型Tag会作为FLV文件的第一个tag,并且只有一个,通常都是跟在FLV Header后。

该类型的Tag Data一般分为两个AMF包:

AMF(Action Message Format)是Adobe设计的一种通用数据封装格式,简单来说,AMF将不同类型的数据用统一的格式来描述。

第一个AMF包:
第1个字节表示AMF包类型,一般总是0x02,表示字符串。第2-3个字节为标识字符串的长度,一般总是0x000A(“onMetaData”长度)。后面字节为具体的字符串,一般总为“onMetaData”(6F,6E,4D,65,74,61,44,61,74,61)。

第二个AMF包:
第1个字节表示AMF包类型,一般总是0x08,表示数组。第2-5个字节为UI32类型值,表示数组元素的个数。后面即为各数组元素的封装,数组元素为元素名称和值组成的对。常见的数组元素如下表所示:

含义
duration时长
width视频宽度
heiht视频高度
video data rate视频码率
frame rate视频帧率
video codec id视频编码方式
audio sample rate音频采样率
audio sample size音频采样精度
stereo是否为立体声
audio codec id音频编码方式
filesize文件大小

这就是脚本类型数据的组成部分。

  • Audio Tag Data结构(音频类型)

音频Tag Data区域开始的第一个字节包含了音频数据的参数信息,从第二个字节开始为音频流数据。

其中第一个字节的1到4为代表的是音频格式:

转换成十进制后的值代表的格式
0Linear PCM
1ADPCM
2MP3
3Linear PCM, little endian
4Nellymoser 16-kHz mono
5Nellymoser 8-kHz mono
6Nellymoser
7G.711 A-law logarithmic PCM
8G.711 mu-law logarithmic PCM
9reserved
10AAC
11Speex
14MP3 8-Khz
15Device-specific sound

接着2位为采样率(对于AAC总是3):

类型
05.5-kHz
111-kHz
222-kHz
344-kHz

接着1位为采样的长度(压缩过的音视频都是16bit):

类型
0snd8Bit
1snd16Bit

最后1位为音频类型(对于AAC总是1):

类型
0sndMono
1sndStereo

从第二个字节开始的就是音频数据了。

  • video Tag Data结构(视频类型)

视频Tag Data和音频Tag Data一样,开始的第一个字节包含视频数据的参数信息,从第二个字节开始为视频流数据。

第一字节的前四位表示的是帧类型,值如下:

1: keyframe (for AVC, a seekable frame)——h264的IDR,关键帧,可重入帧。 
 2: inter frame (for AVC, a non- seekable frame)——h264的普通帧。 
 3: disposable inter frame (H.263 only)  
 4: generated keyframe (reserved for server use only)  
 5: video info/command frame

第一个字节的后四位表示的是编码id,值如下

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: AVC

第二个字节开始为视频数据。

结束

对于FLV的格式介绍就到此结束了,为了加深对FLV格式的理解,建议使用十六进制查看器打开一个flv文件,对照文章进行转换学习。

思想觉悟
思想觉悟

本文来自作者投稿,版权归原作者所有。如需转载,请注明出处:https://www.nxrte.com/jishu/13614.html

(0)

相关推荐

发表回复

登录后才能评论