H265編碼在使用性上,相比H264有更大的功能性,因此越來越多的對視頻有需求的用戶或者項目團隊都要求能夠支持H265編碼格式。
鑑於近期越來越多的用戶提出國標GB28181視頻流媒體平臺EasyGBS對H265編碼格式接入的需求,我們已經對下級推送上來的H265流進行適配,本文來看一下適配的具體流程。
(1) 我們分析PS流中的H265編碼格式爲0x24
(2) 定義H265編碼推流格式爲0xAE
if (streamCodec == 0x10)
videoCodec = 0x0D; //MPEG4
else if (streamCodec == 0x1B)
videoCodec = 0x1C; //H264
else if(0x24 == streamCodec)
videoCodec = 0xAE; //H265
else{
printf("========>PSDemux_demuxMapStreamInfo streamCodec:[%d],unknow videoCodec\n", streamCodec);
}
在EasyRTMP推流已經支持H265的基礎上,我們需要對H265在EasyGBS內部推流做下適配。首先,因爲推流設置流媒體編碼類型的函數InitMetdata我們已經在初始化的時候就調用了,所以需要在庫內部做編碼格式兼容,兼容代碼如下:
if (thiz->u32VideoCodec == EASY_SDK_VIDEO_CODEC_H264)
{
GetH264SPSandPPS((char *)frame->pBuffer, frame->u32AVFrameLen, thiz->sps, &thiz->nSPSLen, thiz->pps, &thiz->nPPSLen, &startpos);
_TRACE_LOG("InitMetadata nSPSLen=%d, nPPSLen=%d, startpos=%d\n", thiz->nSPSLen, thiz->nPPSLen, startpos);
//int h264_nal_type = (buf[0]) & 0x1f;
if ( (thiz->sps[0] & 0x1f ) != 0x07 || (thiz->pps[0] & 0x1f ) != 0x08 )
{
GetH265VPSandSPSandPPS((char *)frame->pBuffer, frame->u32AVFrameLen, thiz->vps, &thiz->nVPSLen,thiz->sps, &thiz->nSPSLen, thiz->pps, &thiz->nPPSLen);
if ( (((unsigned char)thiz->vps[0] >> 1) & 0x3f) == 32 && (((unsigned char)thiz->sps[0] >> 1) & 0x3f) == 33 && (((unsigned char)thiz->pps[0] >> 1) & 0x3f) == 34 )
{
thiz->u32VideoCodec = EASY_SDK_VIDEO_CODEC_H265;
}
}
}
else
{
GetH265VPSandSPSandPPS((char *)frame->pBuffer, frame->u32AVFrameLen, thiz->vps, &thiz->nVPSLen,thiz->sps, &thiz->nSPSLen, thiz->pps, &thiz->nPPSLen);
_TRACE_LOG("InitMetadata nVPSLen=%d, nSPSLen=%d, nPPSLen=%d\n", thiz->nVPSLen, thiz->nSPSLen, thiz->nPPSLen);
//int h265_nal_type = (buf[0] >> 1) & 0x3f;
}
以上三步完成後,我們再運行EasyGBS即可實現,不管下級平臺推流視頻編碼格式是H264還是H265都可以完美的支持。