(海康SDK多路视频预览)C++ DLL回调C#方法,方法内创建数组时提示,对已销毁委托进行了回调

问题描述

在海康SDK中,我想实现多路视频预览,然后在回调的C#方法中取流进行操作,现在的问题是:我在回调的方法内创建数组,过一会就会提示CallbackOnCollectedDelegate错误,但是单路预览回调就不存在这个问题,多路预览会出现。

问题相关代码
    /// <summary>
    /// 监控预览
    /// </summary>
    /// <param name="channelNumber">通道号</param>
    public void PrevView(int channelNumber)
    {
        if (m_lUserID < 0)
            return;

        CHCNetSDK.NET_DVR_PREVIEWINFO lpPreviewInfo = new CHCNetSDK.NET_DVR_PREVIEWINFO();
        //lpPreviewInfo.hPlayWnd = RealPlayWnd.Handle;      //预览窗口 live view window
        lpPreviewInfo.lChannel = channelNumber;             //预览的设备通道 the device channel number
        lpPreviewInfo.dwStreamType = 1;                     //码流类型:0-主码流,1-子码流,2-码流3,3-码流4,以此类推
        lpPreviewInfo.dwLinkMode = 0;                       //连接方式:0- TCP方式,1- UDP方式,2- 多播方式,3- RTP方式,4-RTP/RTSP,5-RSTP/HTTP 
        lpPreviewInfo.bBlocked = true;                      //0- 非阻塞取流,1- 阻塞取流
        lpPreviewInfo.dwDisplayBufNum = 15;                 //播放库显示缓冲区最大帧数

        IntPtr pUser = IntPtr.Zero;     //用户数据 user data 

        lpPreviewInfo.hPlayWnd = IntPtr.Zero;       //预览窗口 live view window
        //m_ptrRealHandle = RealPlayWnd.Handle;

        if (channelNumber == 1)
        {
            RealData = new CHCNetSDK.REALDATACALLBACK(RealDataCallBackNew);//预览实时流回调函数 real-time stream callback function 
        }
        else
        {
            RealData = new CHCNetSDK.REALDATACALLBACK(RealDataCallBackNew2);//预览实时流回调函数 real-time stream callback function 
        }

        int m_lRealHandle_temp = CHCNetSDK.NET_DVR_RealPlay_V40(m_lUserID, ref lpPreviewInfo, RealData, pUser);

        if (m_lRealHandle_temp < 0)
        {
            iLastErr = CHCNetSDK.NET_DVR_GetLastError();
            str = "NET_DVR_RealPlay_V40 failed, error code= " + iLastErr; //预览失败,输出错误号 failed to start live view, and output the error code.
            return;
        }
        else
        {
            //预览成功
            //DebugInfo("NET_DVR_RealPlay_V40 succ!");

            //自定义代码
            VideoInfo v = new VideoInfo();
            v.RealHandle = m_lRealHandle_temp;
            videoList.Add(m_lRealHandle_temp, v);
        }
    }

    /// <summary>
    /// 预览回调
    /// </summary>
    /// <param name="lRealHandle"></param>
    /// <param name="dwDataType"></param>
    /// <param name="pBuffer"></param>
    /// <param name="dwBufSize"></param>
    /// <param name="pUser"></param>
    public void RealDataCallBackNew2(Int32 lRealHandle, UInt32 dwDataType, IntPtr pBuffer, UInt32 dwBufSize, IntPtr pUser)
    {
        byte[] outputData = new byte[Convert.ToInt32(dwBufSize)];

        //Marshal.Copy(pBuffer, outputData, 0, Convert.ToInt32(dwBufSize));
        //将PS码流转H264格式
        //GetH264FromPS(outputData);
    }
    
运行结果及报错内容

img

我的解答思路和尝试过的方法

1、如果只调用一次PrevView()方法进行预览,始终不会报错,如果调用2次,就会报上面的错误;
2、尝试过使用固定长度数组,如byte[] outputData = new byte[10],不会报错,如果使用byte[] outputData = new byte[1000],过几秒钟就会报错。

我想要达到的结果

在回调方法中成功创建数组,接收返回的码流数据。

你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答


本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。


因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。