问题描述
在海康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);
}
运行结果及报错内容
我的解答思路和尝试过的方法
1、如果只调用一次PrevView()方法进行预览,始终不会报错,如果调用2次,就会报上面的错误;
2、尝试过使用固定长度数组,如byte[] outputData = new byte[10],不会报错,如果使用byte[] outputData = new byte[1000],过几秒钟就会报错。
我想要达到的结果
在回调方法中成功创建数组,接收返回的码流数据。