注意: 在flv中H.264码流中已经去除 0000001 等信息
VideoData的内容,同样包括VideoData Header和VideoData Body。
即VideoData Format:Video Header = | FrameType(4) | CodecID(4) |
VideoData = | FrameType(4) | CodecID(4) | VideoData(n) |
FrameType为数据类型,1为关键帧,2为非关键帧,3为h263的非关键帧,4为服务器生成关键帧,5为视频信息或命令帧。
CodecID为包装类型,1为JPEG,2为H263,3为Screen video,4为On2 VP6,5为On2 VP6,6为Screen videoversion 2,7为AVC。
VideoData为数据具体内容:
如果CodecID=2,为H263VideoPacket;
如果CodecID=3,为ScreenVideopacket;
如果CodecID=4,为VP6FLVVideoPacket;
如果CodecID=5,为VP6FLVAlphaVideoPacket;
如果CodecID=6,为ScreenV2VideoPacket;
如果CodecID=7,为AVCVideoPacket;
视频头信息占1字节 主要表示具体视频类型等信息
Frame Type 占用4位 视频帧类型
1 关键帧 (应用于AVC)
2非关键帧(应用于AVC)
3 h263的非关键帧
4 服务器生成关键帧
5 视频信息或命令帧
CodecID 占用4位 选用的标准
2 H.263
3 屏幕视频
4 VP6
5 VP6 并且有alpha通道
6 屏幕视频版本2
7 AVC(H.264)
视频头信息占1字节 主要表示具体视频类型等信息
如果当前为H.264编码
AVCVideoPacket同样包括Packet Header和Packet Body两部分:
AVCPacketType 占用1字节 仅在AVC时有此字段
0 AVC sequence header (SPS、PPS信息等)
1 AVC NALU
2 AVC end of sequence (lower level NALU sequence ender is
not required or supported)
CompositionTime 占用24位 相对时间戳 如果AVCPacketType=0x01, 为相对时间戳;其它,均为0; 该值表示当前帧的显示时间 tag的时间为解码时间 显示时间等于 解码时间 + CompositionTime
如果是头信息AVCPacketType=0
解析AVCDecoderConfigurationRecord
configurationVersion 配置版本 占用8位 一定为1
AVCProfileIndication profile_idc 占用8位 从H.264标准SPS第一个字段profile_idc拷贝而来 指明所用 profile
profile_compatibility 占用8位 从H.264标准SPS拷贝的冗余字节
AVCLevelIndication level_idc 占用8位 从H.264标准SPS第一个字段level_idc拷贝而来 指明所用 level
注意:AVCProfileIndication、profile_compatibility 、AVCLevelIndication就是拷贝SPS的前3个字节
reserved 保留位 占6位 值一定为'111111'
lengthSizeMinusOne 占用2位, 表示NAL单元头的长度 0 表示1字节 1表示2字节 2表示3字节 3 表示4字节
reserved 保留位 占3位 值一定为'111'
依次解析SPS、PPS
numOfSequenceParameterSets 占用5位 表示当前SPS的个数
for i = 0 ; < numOfSequenceParameterSets i++
sequenceParameterSetLength 占用16位 SPS占用的长度
解析当前SPS(详情见H.264标准)
numOfPictureParameterSets 占用8位 表示当前PPS的个数
for i = 0 ; < numOfPictureParameterSets i++
pictureParameterSetLength 占用16位 PPS占用的长度
解析当前PPS(详情见H.264标准)标准文档:
以下图选定区域的一个tag为例:
tag头信息:占11字节 09 00 00 30 00 00 00 00 00 00 00 视频数据(0x 09 size = 0x30 )
Frame Type 占用4位 视频帧类型 当前值:0x1 当前tag为关键帧
CodecID 占用4位 选用的标准 当前值:0x7 当前选用的为H.264编码标准
AVCPacketType 占用1字节 仅在AVC时有此字段 当前值:0x00 表示 AVC头信息
CompositionTime 占用24为相对时间戳 如果AVCPacketType=0x01, 为相对时间戳;其它,均为0;当前值:0x 00 00 00
解析AVCDecoderConfigurationRecord
configurationVersion 配置版本 占用8位 一定为1 当前值为:0x 01
AVCProfileIndication profile_idc 占用8位 从H.264标准SPS第一个字段profile_idc拷贝而来 指明所用 profile 当前值:0x64 表示所用的是high档次
profile_compatibility 占用8位 从H.264标准SPS拷贝的冗余字节 当前值:0x00
AVCLevelIndication level_idc 占用8位 从H.264标准SPS第一个字段level_idc拷贝而来 指明所用 level 当前值:0x1F
注意:AVCProfileIndication、profile_compatibility 、AVCLevelIndication就是拷贝SPS的前3个字节
reserved 保留位 占6位 值一定为'111111' 当前值:0xFF 前6位为 '111111'
lengthSizeMinusOne 占用2位, 表示NAL单元头的长度 0 表示1字节 1表示2字节 2表示3字节 3 表示4字节 当前值:‘11’ 表示占用4字节
reserved 保留位 占3位 值一定为'111' 当前值:0xE1 前3位为 '111'
numOfSequenceParameterSets 占用5位 表示当前SPS的个数 当前值:0xE1 后五位 ‘00001’ 表示当前就一个SPS
for i = 0 ; < numOfSequenceParameterSets i++
sequenceParameterSetLength 占用16位 SPS占用的长度 当前值:0x00 1B (占用27字节)
解析当前SPS(详情见H.264标准)(27字节:0x67 64 00 1F......18 31 84 60) 其中:0x67 表示sps 0x 64 00 1F 刚好是SPS的前三个字节
numOfPictureParameterSets 占用8位 表示当前PPS的个数 当前值;0x01
for i = 0 ; < numOfPictureParameterSets i++
pictureParameterSetLength 占用16位 PPS占用的长度 当前值:0x0005 (占用5个字节)
解析当前PPS(详情见H.264标准)(5字节:0x68 E8 43 BC B0) 其中:0x68 表示pps