接着上一篇继续分析Video Tag和Audio Tag相关内容。
Video Tag 视频Tag:
该Tag类型封装真实的视频裸数据,虽然支持H263、H264等编码类型的视频,但是现在主流还是H264,所以下面会重点分析如何将H264视频帧打进Flv方法。
Flv Parse 解析的结果如下:
previous tag1:
十六机制:0x00 00 01 37
十进制:311
因表示了前一个Metadata Tag的长度是311字节,这跟上篇分析结果是一致的;
Video tag header:
十六进制:0x09 00 00 2C 00 00 00 00 00 00 00
Tagtype:
十六进制:0x09
二进制:0000 1001
通过前1-2bit即知道非加密,后面4-8bit10010即十进制为9则为Video Tag类型;
DataSize:
十六进制:0x 00 00 2C
十进制:44
说明这个Video Tag的data字段长度为44字节;
Timestamp:
十六进制:0x 00 00 00
由于是第一个Video Tag该字段一般就是默认为0;
TimeStampExtended:
十六进制:0x 00 00 00
时间戳扩展字段也是默认为0;
Stream ID:
十六进制:0x 00 00 00
无论那种类型的Tag,一般默认为0;
Video Tag Data:
视频头:
在Video tag的Header后面按道理就是视频裸数据了,但是这里我们需要分析下第一个字节,判断视频数据的编码格式等信息,然后才知道视频裸数据是怎么打包进Video Tag的Data字段的,第一个Video Tag的Data部分如图所示:
视频头字段格式:
字段 |
占位 |
含义 |
Frame type帧类型 |
第一字节1-4bit位 |
十进制 1: keyframe (for AVC, a seekable frame)——h264的IDR,关键帧,可重入。 该关键帧时进行视频拖动 seek的关键; 2: inter frame (for AVC, a non- seekable frame)——h264的普通幀 ,比如P帧,B帧等 3: disposable inter frame (H.263 only) 4: generated keyframe (reserved for server use only) 5: video info/command frame |
Code ID编码ID |
第一字节4-8bit位 |
视频的编码类型: 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也就是说的H264 |
待分析数据第一字节:
十六进制:0x17 我们先分析Video Tag数据部分的第一个字节即视频头
Frame type:
十六进制:0x17
二进制:0001 0111
十进制:1
通过前面1-4bit位发现十进制为1,即认为是key frame;
CodeID:
十六进制:0x17
二进制:0001 0111
十进制:7
说明这个Video的编码格式AVC也就是常说的H264;
特别注意:
分析到这里,我们发现这个Video Tag的承载数据是AVC即H264编码格式的数据,一般情况下Flv承载的数据格式都是这种。那么就需要继续向下面分析后面的Packet Type字段。
Packet Typ数据格式:
字段 |
type |
Comment |
AVC packet Type 类型 |
1字节 |
0:AVC序列头 1:AVC NALU单元 2:AVC序列结束。低级别AVC不需要。 |