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为代表的是音频格式:

转换成十进制后的值 代表的格式
0 Linear PCM
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

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

类型
0 5.5-kHz
1 11-kHz
2 22-kHz
3 44-kHz

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

类型
0 snd8Bit
1 snd16Bit

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

类型
0 sndMono
1 sndStereo

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

  • 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文件,对照文章进行转换学习。

如果你对音视频开发感兴趣可以关注公号:思想觉悟

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,588评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,456评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,146评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,387评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,481评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,510评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,522评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,296评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,745评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,039评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,202评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,901评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,538评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,165评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,415评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,081评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,085评论 2 352

推荐阅读更多精彩内容

  • 简介 FLV(Flash Video)是现在非常流行的流媒体格式,由于其视频文件体积轻巧、封装播放简单等特点,使其...
    第八区阅读 22,074评论 22 33
  • 简介 FLV(Flash Video)是现在非常流行的流媒体格式,由于其视频文件体积轻巧、封装播放简单等特点,使其...
    轻口味阅读 1,089评论 0 0
  • FLV封装格式 FLV(Flash Video)是Adobe公司推出的一种流媒体格式,由于其封装后的音视频文件体积...
    _zzbb阅读 7,989评论 3 11
  • FLV是一个二进制文件,简单来说,其是由一个文件头(FLV header)和很多tag组成(FLV body)。 ...
    zjjcc阅读 3,061评论 1 3
  • 目录 概述 flv文件主体结构 Tag介绍 开源的解析软件 参考阅读 参考 [1] FLV and F4V Fil...
    smallest_one阅读 1,078评论 0 2