在之前两篇关于SkeyeRTMPClient扩展支持HEVC(H.265)解决方案的文章中,我们已经完成了对H265的支持,本文主要阐述将H26和H265支持兼容起来,实现不同视频编码格式的自适应兼容适配。
1. 根据CodecId判断数据编码类型
根据视频编码ID判断视频编码类型,如果视频编码ID==FlvCodeId_Hevc(12),则判断视频编码格式为H265,反之则为H264(因为目前我们只支持这两种编码格式的视频推送),如下代码所示:
parser_VideoTag *video_tag = (parser_VideoTag*)(buf+parser_offset);
FlvCodeId video_code_id = (FlvCodeId)(video_tag->code_id&0x0f);
if (video_code_id == FlvCodeId_Hevc)
{
av_frame.u32AVFrameFlag = SKEYE_SDK_VIDEO_CODEC_H265;// HEVC;
}
else
{
av_frame.u32AVFrameFlag = SKEYE_SDK_VIDEO_CODEC_H264;// 默认h264, 其他类型是否需要判断?!;
}
2. 数据帧头部判断
根据FLV/RTMP扩展支持H265标准,支持HEVC的VideoTagHeader定义如下图所示:
即 当CodecID == 12时,AVCPacketType为HEVCPacketType:
-
如果HEVCPacketType为0,表示HEVCVIDEOPACKET中存放的是HEVC sequence header;
-
如果HEVCPacketType为1,表示HEVCVIDEOPACKET中存放的是HEVC NALU;
-
如果HEVCPacketType为2,表示HEVCVIDEPACKET中存放的是HEVC end of sequence,即HEVCDecoderConfigurationRecord;
而当CodecID == 7时,AVCPacketType为AVCPacketType:
-
如果AVCPacke