FLV封装格式

FLV封装格式是由⼀个⽂件头(FLV header)和 ⽂件体(FLV body)组成。其中FLV body由若干对的previous tag size + tag组成,previous tag size占用4个字节 记录了前一个tag的大小,用于逆向读取处理。flv header后的第一个previous tag size的大小为0。

Tag⼀般可以分为3种类型:脚本(帧)数据类型、⾳频数据类型、视频数据。FLV数据以⼤端序进行存储。

FLV header 位数说明:

位域 位宽 说明
Signature 3 * 8 文件标识,分别为“F”, “L”, "V"(0x46,0x4C,0x56)
Version 1 * 8 版本标识,目前为0x01
TypeFlags 1 * 8 前5位和第7位为保留位必须为0,第6位表示是否存在音频,第8位表示是否存在视频
DataOffset 4 * 8 从FLV header起始位置到File body起始位置的字节数,版本1为9个字节

tag body说明:

位域 位宽 说明
PreviousTagSize 4 * 8 前一个tag的长度
TagType 1 * 8 t该ag的类型,音频(0x08)、视频(0x09)和script data(0x12),其他类型值为保留位
DataSize 3 * 8 该tag的data部分大小
Timestamp 3 * 8 该tag的时间戳
TimestampExtended 1 * 8 时间戳的扩展字节,24位不够时将扩展为32位
Tag Data DataSize * 8 不同类型的tag的data部分结构互不相同,但header部分的结构是一样的

flv⽂件中Timestamp和TimestampExtended拼出来的是dts。也就是解码时间。Timestamp和TimestampExtended拼出来dts单位为ms。(如果不存在B帧,当然dts等于pts)

CompositionTime 表示PTS相对于DTS的偏移值, 在每个视频tag的第14~16字节,显示时间(pts) = 解码时间(tag的第5~8字节) + CompositionTime CompositionTime的单位也是ms

Script data脚本数据是描述视频或⾳频的信息的数据,如宽度、⾼度、时间、采样、声道、频率、编码等,⼀个⽂件中通常只有⼀个元数据

FLV解析架构图
Script Tag Data结构
FIeld Type Comment
Type U8 第1个字节表示第一个AMF包类型,⼀般总是0x02,表示字符串
Value_size U16 标识字符串的⻓度,⼀般总是0x000A(“onMetaData”⻓度)
Value U8 * 10 为具体的字符串,⼀般为“onMetaData”(6F,6E,4D,65,74,61,44,61,74,61)
Type U8 第二个表示AMF包类型,⼀般总是0x08,表示数组
ECMAArrayLength U32 表示数组元素的个数,后⾯即为各数组元素的封装,数组元素为元素名称和值组成的对。
数据对元素个别例子
Audio Tag Data结构
FIeld Type Comment
SoundFormat UB4 音频格式,10 为AAC,0为PCM,2为MP3
SoundRate UB2 采样率,0 = 5.5KHz,1 = 11kHz, 2 = 22.05kHz, 3 = 44.1kHz,对于AAC总是3。但实际上AAC是可以⽀持到48khz以上的频率(这个参数对于AAC意义不⼤)。
SoundSize UB1 1代表16位,0代表8位,此参数仅适⽤于未压缩的格式,压缩后的格式都是将其设为1
SoundType UB1 0 = sndMono, 1 = sndStereo ⽴体声,对于AAC总是1
音频数据 U8 * n 音频数据

例如:


Audio Tag Data结构 例子
Video Tag Data结构
FIeld Type Comment
帧类型 UB4 1: keyframe (for AVC, a seekable frame)——h264的IDR,关键帧,2: inter frame (for AVC, a non- seekable frame)——h264的普通帧
编码ID UB4 7: AVC
视频数据 U8 * n 视频数据

例如:


Video Tag Data结构 例子

你可能感兴趣的:(FLV封装格式)