FLV文件结构解析

1. FLV文件格式相对于MP4,简单很多。

FLV Header(9Bytes) + FLV Body

a比特: 1:有音频; 0:无音频

v比特: 1:有视频; 0:无视频   如果音视频都有这个字节为0x05

‘F‘|‘L‘|‘V‘|0x01|0b00000a0v| 0x00 00 00 09|

|                                         |

版本字节一般为0x01      头长度 固定为9

FLV Body由一系列的Tag组成,每个tag的结构如下:

{ 0x00000000| tag_header0| tag_data0 } | {tag_size0| tag_header1 | tag_data1 } | {tag_size1| tag_header2 | tag_data2 } |...

tag_size(n) = tag_data_size(n-1) + 11

解析完一个tag后,读取下4个字节,可以比较下看是不是前帧完全解码完毕。

除了可以验证码流外,还有什么样的好处促使FLV格式采用这种方式呢?不太清楚。

0x00000000| { tag_header0| tag_data0  | tag_size0} | { tag_header1 | tag_data1 | tag_size1} |...

Tag body也可以这样看,编码时按照: 数据头 数据体 数据大小 三部分来划分,更适合一些。下面各个tag都是按照这个结构来写的。

Tag header 11Bytes

|1Byte Tag类型                                |  只支持3类, 0x08音频; 0x09视频;0x12脚本

|3Byte data_size数据区长度         |  纯数据长度,不包括头信息的15字节

|3Byte timestamp 时间戳               |  最终的时间戳 = (timestamp_ex<< 24) | timestamp

|1Byte timestamp_ex扩展时间戳 |  最终时间戳的高8位。不知道为什么定义成这样,可能是因为标准扩展

|3Byte StreamID                             |  总为0

Tag Data data_size字节

|Tag数据段,长度为data_size...  |  音视频或者脚本数据。

|4Byte PreviousTagSize               |  是前一个Tag数据长度,第一个Tag此数据段为0.

2. 视频Tag

视频数据的第一个字节定义视频信息:

高4比特定义帧格式:1 关键帧; 2 内部帧(非IDR帧);3可丢弃内部帧(仅对H.263有用)

低4比特定义编码器:2:H.263, 4: VP6, 7:H264; ...

对于264的视频FLV,这个字节一般为 0x17或者0x27.

3. 音频tag

音频数据的第一个字节定义视频信息:

高4比特定义音频编码格式:0 Linear PCM, 1: ADPCM, 2: MP3, 10:AAC ..

第4,3两比特定义采样率: 0 5.5KHz, 1 11KHz, 2 22KHz, 3 44KHz. 对于AAC该值总为3

第2比特定义采样大小: 0 8比特,1 16比特

第1比特定义声道数: 0 单声道,1 立体声

4. 脚本tag

理论上不需要解析脚本Tag就可以解码FLV文件,它只是提供了一些信息记录。

脚本Tag里面的类型比较多,格式也不一样。

Number 类,记录一个8字节double数据。|0x00|8字节data|.

Boolean类,记录一个1字节布尔型数据。|0x01|1字节data|.

String类,记录一个变长字符串数据。  |0x02|2字节 字符串长度 N| N字节字符串内容|.

注意读取完字符串后加一个‘\0‘字符串结束符号。因此字符串申请的时候,长度为N+1.

ECMA array type, 记录一些数据对。

|0x08| 4字节 数组长度 N|2字节 字符串长度 m1 | m1字节字符串内容|1字节 data1 type | X字节 data1 | ...

|2字节 字符串长度 Nm| Nm字节字符串内容|1字节 dataN type| X字节 dataN|

有N个数据对                  元素名    (长度|数据)                               元素值(类型|数据)

一般用这个记录一些音视频信息,例如:

0x0008                         "duration"                   0x00      8字节double

0x0005                            "width"                     0x00      8字节double

0x0006                           "stereo"                    0x01      1字节boolean型

Strict array type类,记录一组数据。

|0x0A|4字节 数组长度 N| 1字节 data1 type| X字节 data1 | ...

|1字节 dataN type| X字节 dataN|

有N个数据,      每个数据的类型    数据值

一般会用这个类记录关键帧的偏移地址和对应的pts值。类型都是 Number类,即X=8字节double型

Object type, 记录对象数据。一般用它来做keyframes的数据存储起始。

5.keyframes字段

FLV没有像mp4一样定义stbl,FLV文件如果做快进,seek等操作会比较麻烦。

业内通用做法是在脚本Tag里面增加keyfrmes object类。一般定义为:

|00 09| 9字节 "keyframes"|00 0D| 13字节 "filepositions"|0A| 4字节关键字数目 N|00|8字节 关键帧1偏移地址| ...

|00|8字节 关键帧N偏移地址|

|00 05| 5字节 "times"               |0A| 4字节关键字数目 N|00|8字节 关键帧1时间| ...

|00|8字节 关键帧N时间|

有了各个关键帧的偏移地址和时间,做Seek操作的时候就方便的多。

6. 读取8字节double型,这个牵扯浮点型的存储结构问题,蛮罗嗦,没看明白,但找到下面一段代码可以实现转换。

uint64_t v = get_8bytes();

if(v+v > 0xFFEULL<<52) return 0.0/0.0;

double x = ldexp(((v&((1LL<<52)-1)) + (1LL<<52)) * (v>>63|1), (v>>52&0x7FF)-1075);

7. FLV结构里面,数据长度有3字节和4字节限制,不会像Mp4一样出现8字节长度。

3字节最大表示16M数据,4字节最大是4G数据。

一个Video Tag里面的NALU长度不能超过16M字节。

时间: 2024-08-02 06:56:25

FLV文件结构解析的相关文章

FLV文件格式解析

FLV文件格式解析 媒体格式分析之flv -- 基于FFMPEG

Android学习心得(15) --- Dex文件结构解析(1)

我在博客上发表一些我的Android学习心得,希望对大家能有帮助. 这一篇我们讲述一下Android可执行文件dex的结构解析. 参考Leb128数据类型 Android学习心得(5) --- dex数据类型LEB128 参考实例分析学习理解dex文件结构Android学习心得(15) --- Dex文件结构解析(1) 1.Dex背景 Android应用开发和Dalvik虚拟机Android应用所使用的编程语言是Java语言,在编译时使用JDK将Java源程序编程成标准的Java字节码文件. 而

.Mo翻译文件结构解析

.Mo翻译文件结构解析 .mo文件是.po文件经msgfmt编译后生成的翻译文件, 便于程序阅读. 我这段时间折腾了下i18n, 根据Gettext的文档研究了一下Mo文件的结构, 在C#上实现了mo文件的解析和浏览, 现把.mo的结构和基于Winform实现的Mo查看器分享给大家. 结构 整型均为4字节(Int32), 下面不再标注 位置 标识 说明 0 Magic 用于识别Mo文件, 值为0x950412de或0xde120495 4 Major&Minor Revision 两个16位整型

MPEG-2 文件结构解析

代码实现:mpeg-2文件分析器代码实现 一个完整的MPEG-2文件就是一个PS流文件. MPEG-2文件的构造格式如下图: 自己找个mpg文件打开,可以看到文件以0x0000 01B9结束(有些文件不标准没有),即MPEG_Program_end_code,之前有很多个0x0000 00BA字段,即为program pack的开始标志,program pack包的构造如下: 可以看出program pack由3部分组成:pack_header+system_header+PES_packets

PE文件结构解析

说明:本文件中各种文件头格式截图基本都来自看雪的<加密与解密>:本文相当<加密与解密>的阅读笔记. 1.PE文件总体结构 PE文件框架结构,就是exe文件的排版结构.也就是说我们以十六进制打开一个.exe文件,开头的那些内容就是DOS头内容,下来是PE头内容,依次类推. 如果能认识到这样的内含,那么"exe开头的内容是不是就直接是我们编写的代码"(不是,开头是DOS头内容)以及"我们编写的代码被编排到了exe文件的哪里"(在.text段,.t

Android学习心得(16) --- Dex文件结构实例解析(2)

我在博客上发表一些我的Android学习心得,希望对大家能有帮助. 这一篇我们讲述一下通过一个实例来分析dex文件结构和组成. 参考Leb128数据类型 Android学习心得(5) --- dex数据类型LEB128 参考实例分析学习理解dex文件结构Android学习心得(15) --- Dex文件结构解析(1) 参考baksmali工具使用Android学习心得(4) --- MAC下smali文件编写与运行 1.编译 我们通过一个例子来分析dex文件的构成 创建一个Hello.java文

bmp文件格式详细解析

先区分几个概念:16色和16位色一样吗? 不一样! 颜色位数,即是用多少位字节表示的值,每一位可以表示0和1两值.通常图片的颜色深度,简称色深,就是用位数来表示的,所以,我通常会看到8位色,16位色,24位色和32位色.而我们在其它地方看到的又是16色,256色,16777216色等等,这些怎么一回事呢? 16色即代表16种颜色,256色即256种颜色,8位色就是用8个位来表示的颜色,即2的8次方,就是256色,16位色2的16次方,就是65536色,24位即16777216色,32位即4294

硕鼠FLV视频下载软件0.4.7.6去广告绿色版

硕鼠是由著名FLV在线解析网站官方制作的专业FLV下载软件.提供土豆.优酷.我乐.酷六.新浪.搜狐.CCTV等90个主流视频网站的解析+下载+合并/转换一条龙服务.(支持网站不断更新中) 硕鼠支持多线程下载,可智能选择地址,自动命名,FLV/MP4自动合并,智能分类保存,特色的“一键”下载整个专辑的功能,无需人工干预,并集成了转换工具可将下载文件批量转换为3gp,AVI,MP4等格式. 特点 专业的解析引擎,强大的批量下载能力,全面的后期处理工具.,绿色轻盈小巧,无插件,无恶意代码 00.绿色版

一篇文章带你搞懂DEX文件的结构

DEX文件就是Android Dalvik虚拟机运行的程序,关于DEX文件的结构的重要性我就不多说了.下面,开练! 建议:不要只看,跟着我做.看再多遍不如自己亲自实践一遍来的可靠,别问我为什么知道.泪崩ing..... 首先,我们需要自己构造一个dex文件,因为自己构造的比较简单,分析起来比较容易.等你简单的会了,难的自然也就懂了. 0x00■  构造DEX文件 首先,我们编写一个简单的Java程序,如下: public class HelloWorld { int a = 0; static