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脚本数据是描述视频或⾳频的信息的数据,如宽度、⾼度、时间、采样、声道、频率、编码等,⼀个⽂件中通常只有⼀个元数据
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 | 音频数据 |
例如:
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 | 视频数据 |
例如: