海康威视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;
        }
    }

 

posted @ 2022-09-14 11:29  坤机嘎嘎嘎  阅读(2203)  评论(0编辑  收藏  举报