2017.11.6开始学习FFMPEG音视频编解码,通过学习雷霄骅文章
这一章着重阐释FLV封装格式,这一章中很多内容都是从别处归纳总结来的,备份留作学习笔记,以便以后参考开发用。
另:前阵子请了几天家,感冒的厉害,输了液打了针吃了药,现在还没完全好,废话不多数,开始学习笔记吧。
FLV封装格式:
FLV包括文件头(File Header)和文件体(File Body)两部分,其中文件体由一系列的Tag组成。因此一个FLV文件是如下两图结构。
其中,每个Tag前面还包含了Previous Tag Size字段,表示前面一个Tag的大小。Tag的类型可以是视频、音频和Script,每个Tag只能包含以上三种类型的数据中的一种。图2展示了FLV文件的详细结构。
下面详细介绍一下三种Tag的Tag Data部分的结构。
(a)Audio Tag Data结构(音频Tag)
音频Tag开始的第1个字节包含了音频数据的参数信息,从第2个字节开始为音频流数据。结构如图3所示。
图3.Audio Tag Data结构
第1个字节的前4位的数值表示了音频编码类型。如表1所示。
表1.音频编码类型
值
含义 |
|
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 |
14 |
MP3 8-Khz |
15 |
Device-specific sound |
第1个字节的第5-6位的数值表示音频采样率。如表2所示。
表2.音频采样率
值 |
含义 |
0 |
5.5kHz |
1 |
11KHz |
2 |
22 kHz |
3 |
44 kHz |
PS:从上表可以发现,FLV封装格式并不支持48KHz的采样率。
第1个字节的第7位表示音频采样精度。如表3所示。
表3.音频采样精度
值 |
含义 |
0 |
8bits |
1 |
16bits |
第1个字节的第8位表示音频类型。
表4. 音频类型
值 |
含义 |
0 |
sndMono |
1 |
sndStereo |
Video Tag Data结构(视频Tag)
视频Tag也用开始的第1个字节包含视频数据的参数信息,从第2个字节为视频流数据。结构如图4所示。
图4.Video Tag Data结构
第1个字节的前4位的数值表示帧类型。如表5所示。
表5.帧类型
值 |
含义 |
1 |
keyframe (for AVC,a seekable frame) |
2 |
inter frame (for AVC,a nonseekable frame) |
3 |
disposable inter frame (H.263 only) |
4 |
generated keyframe (reserved for server use) |
5 |
video info/command frame |
第1个字节的后4位的数值表示视频编码类型。如表6所示。
表6.视频编码类型
值 |
含义 |
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 |
Script Tag Data结构(控制帧)
该类型Tag又通常被称为Metadata Tag,会放一些关于FLV视频和音频的元数据信息如:duration、width、height等。通常该类型Tag会跟在File Header后面作为第一个Tag出现,而且只有一个。结构如图5所示。
图5.Script Tag Data结构
第一个AMF包:
第1个字节表示AMF包类型,一般总是0x02,表示字符串。第2-3个字节为UI16类型值,标识字符串的长度,一般总是0x000A(“onMetaData”长度)。后面字节为具体的字符串,一般总为“onMetaData”(6F,6E,4D,65,74,61,44,61,74,61)。
第二个AMF包:
第1个字节表示AMF包类型,一般总是0x08,表示数组。第2-5个字节为UI32类型值,表示数组元素的个数。后面即为各数组元素的封装,数组元素为元素名称和值组成的对。常见的数组元素如表7所示。
表7.常见MetaData
值 |
含义 |
duration |
时长 |
width |
视频宽度 |
height |
视频高度 |
videodatarate |
视频码率 |
framerate |
视频帧率 |
videocodecid |
视频编码方式 |
audiosamplerate |
音频采样率 |
audiosamplesize |
音频采样精度 |
stereo |
是否为立体声 |
audiocodecid |
音频编码方式 |
filesize |
文件大小 |
===================================================================================================================================
以上内容可用作编程参考用理论指导