摄像机型号976
用浏览器能正常访问视频,表明摄像机设置正确。
我现在用VS2008开发MFC工程,刚做预览就碰到问题在界面上放了一个static Text控件,用这个控件显示视频,代码如下//初始化远程网络摄像机
NET_DVR_Init();
//注册设备
NET_DVR_DEVICEINFO_V30 struDeviceInfo;
//存放设备参数的结构体
memset(&struDeviceInfo, 0, sizeof(NET_DVR_DEVICEINFO_V30));
LONG lUserID = NET_DVR_Login_V30("192.168.0.64", 8000, "admin", "12345", &struDeviceInfo);
if (lUserID < 0)
{
//用户名密码错误
if (NET_DVR_GetLastError() == NET_DVR_PASSWORD_ERROR)
{
//处理错误信息
AfxMessageBox(_T("连接的用户名或者密码有错误\n"));
}
//连接到DVR的客户端达到最大
else if(NET_DVR_GetLastError() == NET_DVR_OVER_MAXLINK)
{
//处理错误信息
AfxMessageBox(_T("连接到DVR的客户端达到最大\n"));
}
} //启动预览
LONG m_lPlayHandle = -1;
NET_DVR_CLIENTINFO struPlayInfo;
//设置播放句柄为有效句柄
m_hWnd = GetDlgItem(IDC_STATIC_PREVIEWBG)->m_hWnd;
struPlayInfo.hPlayWnd = m_hWnd;
//预览通道号
struPlayInfo.lChannel = 1;
//最高位(31)为0表示主码流,为1表示子码流0~30位表示连接方式:0-TCP方式;1-UDP方式;2-多播方式;3-RTP方式;
struPlayInfo.lLinkMode = 0;
//请求码流过程是否阻塞,0:否,1:是
BOOL bPreviewBlock = false; 
//软解码实现过程
m_lPlayHandle = NET_DVR_RealPlay_V30(lUserID, &struPlayInfo, NULL, NULL, bPreviewBlock); if(m_lPlayHandle >=0)
{
//预览成功,重置I帧
NET_DVR_MakeKeyFrame(lUserID, struPlayInfo.lChannel); 
//单视频播放时缓冲区最大帧数,取值范围[1,50],设置网络延时和播放流畅度可以通过此接口来进行调节
DWORD m_iNetDelayBufNum = 15; 
NET_DVR_SetPlayerBufNumber(m_lPlayHandle,m_iNetDelayBufNum);
//其他预览参数控制
}
else
{
AfxMessageBox(_T("预览失败!\n"));
} //除非将焦点设置到控件,否则返回 TRUE
return TRUE;  
运行到红色代码出错,就是这一句“m_lPlayHandle = NET_DVR_RealPlay_V30(lUserID, &struPlayInfo, NULL, NULL, bPreviewBlock)”,出错信息“读取位置0X.......发生访问冲突”
请教如何正确修改?是不是设置的播放句柄有问题?
就是“ //设置播放句柄为有效句柄
m_hWnd = GetDlgItem(IDC_STATIC_PREVIEWBG)->m_hWnd;
struPlayInfo.hPlayWnd = m_hWnd;”

解决方案 »

  1.   

    NET_DVR_RealPlay_V30的参数都是什么?
      

  2.   

    楼上的,参数如下NET_DVR_RealPlay_V30
    实时预览。LONG NET_DVR_RealPlay_V30(
      LONG                     lUserID,
      LPNET_DVR_CLIENTINFO     lpClientInfo,
      fRealDataCallBack_V30    cbRealDataCallBack,
      void                     *pUser,
      BOOL                     bBlocked
    );
    Parameters
    lUserID :NET_DVR_Login()或NET_DVR_Login_V30()的返回值 
    lpClientInfo :预览参数 
    cbRealDataCallBack :码流数据回调函数 
    pUser :用户数据 
    bBlocked :请求码流过程是否阻塞:0-否;1-是 我原帖代码是根据海康自己提供的SDK接口的说明写的。它的说明里写的参数中间2个都是NULL
      

  3.   

    流程是正确的,GetSafeHwnd获取句柄试一下,BOOL和bool不要混用,确保camera是不是接在一通道,再不行NET_DVR_RealPlay_V30中参数传入回调函数试一下,另外检查一下NET_DVR_Init的返回值。
      

  4.   

    我直接在浏览器里输入192.168.0.64,视频可以看到
    NET_DVR_Init初始化是正确的,struPlayInfo的值也取到了
    lUserID的返回值为0,说明用户注册成功。就是到预览函数就出错了。
      

  5.   


        m_lPlayHandle = NET_DVR_RealPlay_V30(lUserID, &struPlayInfo, NULL, NULL, bPreviewBlock);
    很关键的一步,建议检查struPlayInfo是否有数据
      

  6.   

    设置多播IP地址
    struPlayInfo.sMultiCastIP = "";
    海康SDK里没提到,但是这个是需要设置的。