zw28323 2021-12-04 16:21 采纳率: 0%
浏览 26
已结题

(海康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],过几秒钟就会报错。

我想要达到的结果

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

  • 写回答

1条回答 默认 最新

  • 有问必答小助手 2021-12-06 11:24
    关注

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


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


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

    评论

报告相同问题?

问题事件

  • 系统已结题 12月12日
  • 创建了问题 12月4日

悬赏问题

  • ¥15 我这模型写的不对吗?为什么lingo解出来的下面影子价格这一溜少一个变量
  • ¥50 树莓派安卓APK系统签名
  • ¥15 maple软件,用solve求反函数出现rootof,怎么办?
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题
  • ¥20 求一个html代码,有偿
  • ¥100 关于使用MATLAB中copularnd函数的问题
  • ¥20 在虚拟机的pycharm上
  • ¥15 jupyterthemes 设置完毕后没有效果
  • ¥15 matlab图像高斯低通滤波