我们在做Windows平台Unity播放RTMP或RTSP的时候,遇到这样的问题,比如展会、安防监控等场景下,需要同时播放多路RTMP或RTSP流,这样对设备性能,提出来更高的要求。
虽然我们软解码,已经做的资源占有非常低了,但考虑到多路播放的情况,我们也设计了硬解码的接口,下面大概讲下,如何在Unity下开启硬解码:
检测系统是否支持硬解码
/* * 检查是否支持H264硬解码 * 如果支持的话返回NT_ERC_OK */ [DllImport("SmartPlayerSDK")] public static extern UInt32 NT_SP_IsSupportH264HardwareDecoder(); /* * 检查是否支持H265硬解码 * 如果支持的话返回NT_ERC_OK */ [DllImport("SmartPlayerSDK")] public static extern UInt32 NT_SP_IsSupportH265HardwareDecoder();
如果支持,设置H.264、H.265硬解码
/* * 设置H264硬解 * is_hardware_decoder: 1:表示硬解, 0:表示不用硬解 * reserve: 保留参数, 当前传0就好 * 成功返回NT_ERC_OK */ [DllImport("SmartPlayerSDK")] public static extern UInt32 NT_SP_SetH264HardwareDecoder(IntPtr handle, Int32 is_hardware_decoder, Int32 reserve); /* * 设置H265硬解 * is_hardware_decoder: 1:表示硬解, 0:表示不用硬解 * reserve: 保留参数, 当前传0就好 * 成功返回NT_ERC_OK */ [DllImport("SmartPlayerSDK")] public static extern UInt32 NT_SP_SetH265HardwareDecoder(IntPtr handle, Int32 is_hardware_decoder, Int32 reserve);
Unity环境下调用,是否支持硬解码,可以在Init后就调用:
uint isInited = NTSmartPlayerSDK.NT_SP_Init(0, IntPtr.Zero); if (isInited != 0) { Debug.LogError("调用NT_SP_Init失败.." + isInited.ToString()); return; } is_support_h264_hardware_decoder_ = NT.NTBaseCodeDefine.NT_ERC_OK == NT.NTSmartPlayerSDK.NT_SP_IsSupportH264HardwareDecoder(); is_support_h265_hardware_decoder_ = NT.NTBaseCodeDefine.NT_ERC_OK == NT.NTSmartPlayerSDK.NT_SP_IsSupportH265HardwareDecoder(); Debug.Log("isSupportH264decoder:" + is_support_h264_hardware_decoder_); Debug.Log("isSupportH265decoder:" + is_support_h265_hardware_decoder_);
如果检测到支持的话,设置下硬解码即可:
NTSmartPlayerSDK.NT_SP_SetH264HardwareDecoder(videoctrl[sel].player_handle_, is_support_h264_hardware_decoder_ ? 1 : 0, 0); NTSmartPlayerSDK.NT_SP_SetH265HardwareDecoder(videoctrl[sel].player_handle_, is_support_h265_hardware_decoder_ ? 1 : 0, 0);
如果系统支持硬解码,开启后,可以明显看到CPU占用,会有一定的改善,在多路播放的场景下,还是非常必要,感兴趣的开发者,可以参考设计。