FLV文件格式解析
2016-06-27 17:48
316 查看
最近要用到flv,整理了一些flv格式的资料,供参考。 flv文件主要由两部分组成:header和body。
header部分记录了flv的类型、版本等信息,是flv的开头,一般都差不多,占9bytes。具体格式如下:
FLV的header长度为9byte
FLV Body的内容长度是固定的,格式如下:
| F(8) | L(8) | V(8) | Version(8) | TypeFlagsReserved(5) | TypeFlagsAudio(1)| TypeFlagsReserved(1) | TypeFlagsVideo(1) | DataOffset(32) |
前三个字节为FLV,十六进制表示为 0x46 0x4C 0x56。
Version为FLV的版本号,一般为0x01。
TypeFlagsReserved为保留位,均为0
TypeFlagsAudio为FLV文件中是否包括音频数据,1是有,0是没有。
TypeFlagsVideo为FLV文件中是否包括视频数据,1是有,0是没有。
DataOffset为FLV Header的长度,为固定值0x00000009。
举个栗子:
一个只包含音频的FLV的Header的16进制表示为:0x46 0x4C 0x56 0x01 0x04 0x00 0x00 0x00 0x09
一个只包含视频的FLV的Header的16进制表示为:0x46 0x4C 0x56 0x01 0x01 0x00 0x00 0x00 0x09
一个包含音视频的FLV的Header的16进制表示为:0x46 0x4C 0x56 0x01 0x05 0x00 0x00
0x00 0x09
body部分由一个个Tag组成,每个Tag的下面有一块4bytes的空间,用来记录这个tag的长度,这个后置用于逆向读取处理,他们的关系如下图:
![](https://img-blog.csdn.net/20160627174318523?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
即:
| PreviousTagSize0(32) | Tag1(PreviousTagSize1) |PreviousTagSize1(32) | Tag2 | ……| PreviousTagSizeN-1(32) | TagN(previousTagSizeN)| previousTagSizeN(32) |
PreviousTagSize0为0x00000000。
Tag为每一个内容,目前包括音频、视频、脚本。
previousTagSize为前一个Tag的长度。
每个Tag由也是由两部分组成的:Tag Header和Tag Data。Tag Header里存放的是当前Tag的类型、数据区(Tag Data)长度等信息,具体如下:
FLV Tag Format :
| TagType(8) | DataSize(24) | Timestamp(24) |TimestampExtended(8) | StreamID(24) | Data(DataSize) |
数据区根据Tag类型的不同可分为三种,音频数据、视频数据和脚本数据。
第一个byte是音频的信息,格式如下。
第2byte开始就是音频流数据了。
和音频数据一样,第一个byte是视频信息,格式如下:
最后附上flv官方手册:video_file_format_spec_v10
1.header
header部分记录了flv的类型、版本等信息,是flv的开头,一般都差不多,占9bytes。具体格式如下:文件类型 | 3 bytes | “FLV” |
版本 | 1 byte | 一般为0x01 |
流信息 | 1 byte | 倒数第一位是1表示有视频,倒数第三位是1表示有音频,倒数第二、四位必须为0 |
header长度 | 4 bytes | 整个header的长度,一般为9;大于9表示下面还有扩展信息 |
FLV Body的内容长度是固定的,格式如下:
| F(8) | L(8) | V(8) | Version(8) | TypeFlagsReserved(5) | TypeFlagsAudio(1)| TypeFlagsReserved(1) | TypeFlagsVideo(1) | DataOffset(32) |
前三个字节为FLV,十六进制表示为 0x46 0x4C 0x56。
Version为FLV的版本号,一般为0x01。
TypeFlagsReserved为保留位,均为0
TypeFlagsAudio为FLV文件中是否包括音频数据,1是有,0是没有。
TypeFlagsVideo为FLV文件中是否包括视频数据,1是有,0是没有。
DataOffset为FLV Header的长度,为固定值0x00000009。
举个栗子:
一个只包含音频的FLV的Header的16进制表示为:0x46 0x4C 0x56 0x01 0x04 0x00 0x00 0x00 0x09
一个只包含视频的FLV的Header的16进制表示为:0x46 0x4C 0x56 0x01 0x01 0x00 0x00 0x00 0x09
一个包含音视频的FLV的Header的16进制表示为:0x46 0x4C 0x56 0x01 0x05 0x00 0x00
0x00 0x09
2.body
body部分由一个个Tag组成,每个Tag的下面有一块4bytes的空间,用来记录这个tag的长度,这个后置用于逆向读取处理,他们的关系如下图:即:
| PreviousTagSize0(32) | Tag1(PreviousTagSize1) |PreviousTagSize1(32) | Tag2 | ……| PreviousTagSizeN-1(32) | TagN(previousTagSizeN)| previousTagSizeN(32) |
PreviousTagSize0为0x00000000。
Tag为每一个内容,目前包括音频、视频、脚本。
previousTagSize为前一个Tag的长度。
2.1.Tag
每个Tag由也是由两部分组成的:Tag Header和Tag Data。Tag Header里存放的是当前Tag的类型、数据区(Tag Data)长度等信息,具体如下:名称 | 长度 | 介绍 |
---|---|---|
Tag类型 | 1 bytes | 8:音频 9:视频 18:脚本 其他:保留 |
数据区长度 | 3 bytes | 在数据区的长度 |
时间戳 | 3 bytes | 整数,单位是毫秒。对于脚本型的tag总是0 |
时间戳扩展 | 1 bytes | 将时间戳扩展为4bytes,代表高8位。很少用到 |
StreamsID | 3 bytes | 总是0 |
数据区(data) | 由数据区长度决定 | 数据实体 |
| TagType(8) | DataSize(24) | Timestamp(24) |TimestampExtended(8) | StreamID(24) | Data(DataSize) |
2.2.Tag Data
数据区根据Tag类型的不同可分为三种,音频数据、视频数据和脚本数据。
2.2.1.音频数据
第一个byte是音频的信息,格式如下。名称 | 长度 | 介绍 |
---|---|---|
音频格式 | 4 bits | 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 11 = Speex 14 = MP3 8-Khz 15 = Device-specific sound |
采样率 | 2 bits | 0 = 5.5-kHz 1 = 11-kHz 2 = 22-kHz 3 = 44-kHz 对于AAC总是3 |
采样的长度 | 1 bit | 0 = snd8Bit 1 = snd16Bit 压缩过的音频都是16bit |
音频类型 | 1 bit | 0 = sndMono 1 = sndStereo 对于AAC总是1 |
2.2.2.视频数据
和音频数据一样,第一个byte是视频信息,格式如下:名称 | 长度 | 介绍 |
---|---|---|
帧类型 | 4 bits | 1: keyframe (for AVC, a seekable frame) 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 |
编码ID | 4 bits | 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 |
相关文章推荐
- 编写一个删除C语言程序中所有注释语句的程序
- Ubuntu下FastDFS安装以及配置
- CSS常见效果代码总结
- Java垃圾回收(Garbage Collection, GC)机制
- 字符串1—字符串的旋转
- Spring中使用Jcaptcha实现校验码验证
- 论移动办公系统的强势崛起
- IOS-APP提交上架应用AppStore
- php 练习题-session与 cookie的 取值赋值
- oracle中的替换函数replace和translate函数
- 【杭电oj】2080 - 夹角有多大II(向量夹角,反三角函数)
- android-Camera.Parameters
- 看门狗定时器在DA14580 中的用法
- Realsense 手势跟踪
- JavaWeb学习总结(十三)——使用Session防止表单重复提交
- 【SSM框架】Spring + Springmvc + Mybatis 基本框架搭建集成教程
- Swift if条件判断
- 查找两个字符串a,b中的最长公共子串
- thinkphp 3.2.3 单字符方法汇总
- 【C#中的as和强制转换的区别】