海康威视SDK二次开发占用CPU过高
客户需要做一个摄像头预览界面,需要同时预览九个摄像头,并且需要选择单个摄像头之后可以全屏观看。
之前按照网上一些开发资料和海康SDK手册做的。画面很清晰,但是CPU和GPU占用太高。
同时九个画面CPU直接拉到了50%-70%,画面还偶尔会花,或者卡屏,程序还会出现无响应的情况。况且客户的电脑估计还没有我的配置高。这样是肯定不行的。
后面在网上找了一下原因,真找到了解决方法:https://blog.csdn.net/WZAHD/article/details/118996098
按照上面的思路,果然同时九个画面展示,CPU只占了原来的10%不到。画面也不是很模糊,不仔细看和原来根本没有区别,云台控制也不卡了,画面也变得流畅起来。
主要是将预览设置的配置修改。改了码流和连接方式。
/// <summary> /// 预览设置 /// </summary> CHCNetSDK.NET_DVR_PREVIEWINFO lpPreviewInfo = new CHCNetSDK.NET_DVR_PREVIEWINFO() { //预te览的设备通道 lChannel = 1, //码流类型:0-主码流,1-子码流,2-码流3,3-码流4,以此类推 dwStreamType = 1,//原来此处是 0 //连接方式:0- TCP方式,1- UDP方式,2- 多播方式,3- RTP方式,4-RTP/RTSP,5-RSTP/HTTP dwLinkMode = 4,//原来此处是0 //0- 非阻塞取流,1- 阻塞取流 bBlocked = true, //播放库播放缓冲区最大缓冲帧数 dwDisplayBufNum = 5, byProtoType = 0, byPreviewMode = 0 };
在需要大屏展示的时候,就先将视频停止预览,修改预览配置之后再重新预览。
/// <summary> /// 主预览的时候切换取码流和连接方式 /// </summary> /// <param name="Success"></param> /// <param name="Message"></param> public void StartMainPlay(out bool Success,out string Message) { StopPaly(out bool Success2, out string Message2); lpPreviewInfo.dwStreamType = 0; lpPreviewInfo.dwLinkMode = 0; lpPreviewInfo.hPlayWnd = ShowPicBox.Handle; PlayID = CHCNetSDK.NET_DVR_RealPlay_V40(ConnectID, ref lpPreviewInfo, null, pUser); if (PlayID < 0) { ILastErr = CHCNetSDK.NET_DVR_GetLastError(); Message = "预览失败。错误代码:" + ILastErr; Success = false; } else { int p = CHCNetSDK.NET_DVR_GetRealPlayerIndex(PlayID); PlayCtrl.PlayM4_RenderPrivateData(p, 2, false); Playing = true; Message = ""; Success = true; } }