FLV是一个二进制文件,简单来说,其是由一个文件头(FLV header)和很多tag组成
而每个tag又由tag header和tag data组成。
FLV文件头由9bytes组成:
typedef struct{
char Signature[3]; // 前3个bytes是文件类型,总是“FLV”,也就是(0x46 0x4C 0x56)。
char Version; // 0x01
char Flags; // 流信息 倒数第一位 0x01 :有视频 倒数第三位 0x4: 有音频 0x01|0x04=0x05 :全有
unsigned int DataOffset; // FLV 头长度 ; 9
}FLV_HEADER;
FLV header后面就是FLV body,FLV body由若干个tag 组成。
分析上图 第一个tag:
每一个tag第一部分是tag header,tag header长度为11bytes
,但是每个tag header前面有4bytes记录着上一个tag的长度 00 00 00 00
09 :视频
00 00 2D : datasize
00 00 00 00 :时间戳
00 00 00 :流信息
tag header 长度为: 11
1 // 09: 视频 08:音频
3 // 数据长度 length
3 // 时间戳
1 //扩展时间戳 0
3 // stream ID 000
typedef struct{
char type;
char size[3];
char time[3];
unsigned int reserved;
}TAG_HEADER; // tag head 头结构体
获取size大小算法:
int rel_size2(unsigned char *m)
{
int size=0;
size=((m[0]<<16)|(m[1]<<8)|(m[2]));
return size;
}