FLV文件格式官方规范详解
来源:互联网 发布:淘宝客店铺做裂变 编辑:程序博客网 时间:2024/05/29 10:54
FLV文件主要由两部分组成:header和body。
1.header
header部分记录了flv的类型、版本等信息,是flv的开头,一般都差不多,占9bytes。具体格式如下:文件类型3 bytes“FLV”版本1 byte一般为0x01流信息1 byte倒数第一位是1表示有视频,倒数第三位是1表示有音频,倒数第二、四位必须为0header长度4 bytes整个header的长度,一般为9;大于9表示下面还有扩展信息2.body
body部分由一个个Tag组成,每个Tag的下面有一块4bytes的空间,用来记录这个tag的长度,这个后置用于逆向读取处理,他们的关系如下图:
2.1.Tag
每个Tag由也是由两部分组成的:Tag Header和Tag Data。Tag Header里存放的是当前Tag的类型、数据区(Tag Data)长度等信息,具体如下:9:视频
18:脚本
其他:保留数据区长度3 bytes在数据区的长度时间戳3 bytes整数,单位是毫秒。对于脚本型的tag总是0时间戳扩展1 bytes将时间戳扩展为4bytes,代表高8位。很少用到StreamsID3 bytes总是0数据区(data)由数据区长度决定数据实体
2.2.Tag Data
数据区根据Tag类型的不同可分为三种,音频数据、视频数据和脚本数据。2.2.1.音频数据
第一个byte是音频的信息,格式如下。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 bits0 = 5.5-kHz
1 = 11-kHz
2 = 22-kHz
3 = 44-kHz
对于AAC总是3采样的长度1 bit0 = snd8Bit
1 = snd16Bit
压缩过的音频都是16bit音频类型1 bit0 = sndMono
1 = sndStereo
对于AAC总是1
AAC sequence header存放的是AudioSpecificConfig结构,该结构则在“ISO-14496-3 Audio”中描述。AudioSpecificConfig结构的描述非常复杂,这里我做一下简化,事先设定要将要编码的音频格式,其中,选择"AAC-LC"为音频编码,音频采样率为44100,于是AudioSpecificConfig简化为下表:
举例
下面蓝色的为AudioSpecificConfig部分:
000001e0h: 00 00 00 00 00 AF 0011 90 00 00 00 0F 09 00 02; .....?.?......
根据AudioSpecificConfig结构的定义:
- audioObjectType = (0x11 & 0xF8) >> 3 <- 取前5bit,结果为2
- samplingFrequencyIndex = ((0x11 & 0x7) << 1) | (0x90 >> 7)<- 取后4bit,结果为3
- channelConfiguration = (0x90 >> 3) & 0x0F <- 取后4bit,结果为2
- frameLengthFlag = (0x90 >> 2) & 0x01<- 取后1bit,结果为0
- dependsOnCoreCoder = (0x90 >> 1) & 0x01 <- 取后1bit,结果为0
- extensionFlag = 0x90 & 0x01 <- 最后1bit,结果始终为0
2.2.2.视频数据
和音频数据一样,第一个byte是视频信息,格式如下:2: inter frame (for AVC, a non-seekable frame)
3: disposable inter frame (H.263 only)
4: generated keyframe (reserved for server use only)
5: video info/command frame编码ID4 bits1: 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
AVCDecoderConfigurationRecord
AVC sequence header就是AVCDecoderConfigurationRecord结构,该结构在标准文档“ISO-14496-15 AVC file format”中有详细说明。
举例
上图并非自己画的,因此遗漏了sequenceParameterSetLength,pictureParameterSetLength
下面蓝色的部分就是 FLV 文件中的 AVCDecoderConfigurationRecord 部分:
00000130h: 00 00 00 17 00 00 00 00 01 4D 40 15 FF E1 00 0A ; .........M@.?.
00000140h: 67 4D 40 15 96 53 01 00 4A 20 01 00 05 68 E9 23 ; gM@.朣..J ...h?
00000150h: 88 00 00 00 00 2A 08 00 00 52 00 00 00 00 00 00 ; ?...*...R......
根据 AVCDecoderConfigurationRecord 结构的定义:
- configurationVersion = 01
- AVCProfileIndication = 4D
- profile_compatibility = 40
- AVCLevelIndication = 15
- lengthSizeMinusOne = FF <- 非常重要,是 H.264 视频中 NALU 的长度,计算方法是 1 + (lengthSizeMinusOne & 3),实际计算结果一直是4
- numOfSequenceParameterSets = E1 <- SPS 的个数,计算方法是 numOfSequenceParameterSets & 0x1F,实际计算结果一直为1
- sequenceParameterSetLength = 00 0A <- SPS 的长度
- sequenceParameterSetNALUnits = 67 4D 40 15 96 53 01 00 4A 20 <- SPS
- numOfPictureParameterSets = 01 <- PPS 的个数,一直为1
- pictureParameterSetLength = 00 05 <- PPS 的长度
- pictureParameterSetNALUnits = 68 E9 23 88 00 <- PPS
2.2.3脚本数据
该类型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所示。
首先介绍下脚本的数据类型。所有数据都是以数据类型+(数据长度)+数据的格式出现的,数据类型占1byte,数据长度看数据类型是否存在,后面才是数据。
其中数据类型的种类有:
- 0 = Number type
- 1 = Boolean type
- 2 = String type
- 3 = Object type
- 4 = MovieClip type
- 5 = Null type
- 6 = Undefined type
- 7 = Reference type
- 8 = ECMA array type
- 10 = Strict array type
- 11 = Date type
- 12 = Long string type
如果类型为String,后面的2bytes为字符串的长度(Long String是4bytes),再后面才是字符串数据;如果是Number类型,后面的8bytes为Double类型的数据;Boolean类型,后面1byte为Bool类型。
知道了这些后再来看看flv中的脚本,一般开头是0x02,表示String类型,后面的2bytes为字符串长度,一般是0x000a(“onMetaData”的长度),再后面就是字符串“onMetaData”。好像flv格式的文件都有onMetaData标记,在运行ActionScript的时候会用到它。后面跟的是0x08,表示ECMA Array类型,这个和Map比较相似,一个键跟着一个值。键都是String类型的,所以开头的0x02被省略了,直接跟着的是字符串的长度,然后是字符串,再是值的类型,也就是上面介绍的那些了。
- FLV文件格式官方规范详解
- FLV文件格式官方规范详解
- FLV文件格式官方规范详解
- FLV文件格式详解
- FLV文件格式详解
- FLV文件格式详解
- FLV文件格式详解
- FLV文件格式详解
- FLV文件格式
- flv文件格式
- FLV文件格式
- FLV文件格式
- FLV 文件格式
- FLV文件格式
- flv文件格式
- FLV文件格式
- SWF与FLV文件格式
- FLV文件格式分析
- 日期时间
- 转载 仿微信表情与软键盘冲突
- CentOs6.5上快速搭建ftp服务器
- 安装Android虚拟机Genymotion 的那些事
- 百度出品强大的Html5上传控件WebUploader-支持手机端
- FLV文件格式官方规范详解
- 熟悉Android Context与GetApplicationContext的区别及使用,能够解决内存泄漏问题
- 9Club Online Casino Weekly Slots Rebate Bonus
- JavaScript 原型中的哲学思想
- Android Device Monitor的File Explorer下不显示目录树的问题(AndroidStudio2.2,AVD 7.0)
- Chapter 2.Jolokia Architecture 结构:
- 写一个我自己的文件管理工具类
- 反射一
- error while loading shared libraries: libevent-2.0.so.5解决办法