前言
一直没有稳定的DVS供我测试用,朋友那边也是频频宕掉,所以延误至今,所幸还是出来了。此外非常遗憾的是没能用WPF实践成功,关键是IntPtr句柄设置不对,没法显示出来,为了保证进度也只好暂时放弃用WPF做显示。
提醒
欢迎转载,但请保留博客园(www.cnblogs.com)、农民伯伯(over140.cnblogs.com)的出处,谢谢合作:)
系列
1. C# 海康DVR客户端开发系列(1)—— 准备
2. C# 海康DVR客户端开发系列(2)—— 封装API
3. C# 海康DVR客户端开发系列(3)—— 连接DVR和图像预览
正文
一、截图
二、代码
#region
Member Variable
// 登录标识
private int lUserID = - 1 ;
// 预览标识
private int lRealHandle = - 1 ;
#endregion
#region Form
public frmMain()
{
InitializeComponent();
}
private void frmMain_Load( object sender, EventArgs e)
{
HCNetSDK.NET_DVR_Init();
HCNetSDK.NET_DVR_SetConnectTime( 5000 , 1 );
}
private void frmMain_FormClosing( object sender, FormClosingEventArgs e)
{
HCNetSDK.NET_DVR_Cleanup();
}
#endregion
#region 功能
/// <summary>
/// 登录DVS并预览
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnOpen_Click( object sender, EventArgs e)
{
#region New V30
NET_DVR_DEVICEINFO_V30 dev = new NET_DVR_DEVICEINFO_V30();
lUserID = HCNetSDK.NET_DVR_Login_V30( " 192.168.1.1 " , 8000 , " admin " , " 12345 " , out dev);
if (lUserID == - 1 )
{
MessageBox.Show( string .Format( " 登录DVS失败,错误码: {0} " , HCNetSDK.NET_DVR_GetLastError()), " 登录DVS失败 " , MessageBoxButtons.OK, MessageBoxIcon.Error);
return ;
}
NET_DVR_CLIENTINFO clientinfo = new NET_DVR_CLIENTINFO();
clientinfo.hPlayWnd = this .panel1.Handle; // 视频窗口
clientinfo.lChannel = 2 ; // 通道号
clientinfo.lLinkMode = 0 ;
clientinfo.sMultiCastIP = " 234.5.6.7 " ;
lRealHandle = HCNetSDK.NET_DVR_RealPlay_V30(lUserID, ref clientinfo, null , 1 , false );
if (lRealHandle == - 1 )
{
MessageBox.Show( string .Format( " 播放失败,错误码: {0} " , HCNetSDK.NET_DVR_GetLastError()));
return ;
}
#endregion
#region Old
// NET_DVR_DEVICEINFO dev = new NET_DVR_DEVICEINFO();
// lUserID = HCNetSDK.NET_DVR_Login("125.119.30.175", 8000, "admin", "12345", out dev);
// if (lUserID == -1)
// {
// MessageBox.Show(string.Format("登录DVS失败,错误码: {0}", HCNetSDK.NET_DVR_GetLastError()), "登录DVS失败", MessageBoxButtons.OK, MessageBoxIcon.Error);
// return;
// }
// NET_DVR_CLIENTINFO clientinfo = new NET_DVR_CLIENTINFO();
// clientinfo.hPlayWnd = this.panel1.Handle; // 视频窗口
// clientinfo.lChannel = 2; // 通道号
// clientinfo.lLinkMode = 0;
// clientinfo.sMultiCastIP = "234.5.6.7";
// lRealHandle = HCNetSDK.NET_DVR_RealPlay(lUserID, ref clientinfo);
// if (lRealHandle == -1)
// {
// MessageBox.Show(string.Format("播放失败,错误码: {0}", HCNetSDK.NET_DVR_GetLastError()));
// return;
// }
#endregion
}
/// <summary>
/// 停止预览并退出登录
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnClose_Click( object sender, EventArgs e)
{
HCNetSDK.NET_DVR_StopRealPlay(lRealHandle);
#region New V30
HCNetSDK.NET_DVR_Logout_V30(lUserID);
#endregion
#region Old
// 如果不退出登录,下次开启拾音将失效
// HCNetSDK.NET_DVR_Logout(lUserID);
#endregion
this .panel1.Invalidate( false );
}
#endregion
// 登录标识
private int lUserID = - 1 ;
// 预览标识
private int lRealHandle = - 1 ;
#endregion
#region Form
public frmMain()
{
InitializeComponent();
}
private void frmMain_Load( object sender, EventArgs e)
{
HCNetSDK.NET_DVR_Init();
HCNetSDK.NET_DVR_SetConnectTime( 5000 , 1 );
}
private void frmMain_FormClosing( object sender, FormClosingEventArgs e)
{
HCNetSDK.NET_DVR_Cleanup();
}
#endregion
#region 功能
/// <summary>
/// 登录DVS并预览
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnOpen_Click( object sender, EventArgs e)
{
#region New V30
NET_DVR_DEVICEINFO_V30 dev = new NET_DVR_DEVICEINFO_V30();
lUserID = HCNetSDK.NET_DVR_Login_V30( " 192.168.1.1 " , 8000 , " admin " , " 12345 " , out dev);
if (lUserID == - 1 )
{
MessageBox.Show( string .Format( " 登录DVS失败,错误码: {0} " , HCNetSDK.NET_DVR_GetLastError()), " 登录DVS失败 " , MessageBoxButtons.OK, MessageBoxIcon.Error);
return ;
}
NET_DVR_CLIENTINFO clientinfo = new NET_DVR_CLIENTINFO();
clientinfo.hPlayWnd = this .panel1.Handle; // 视频窗口
clientinfo.lChannel = 2 ; // 通道号
clientinfo.lLinkMode = 0 ;
clientinfo.sMultiCastIP = " 234.5.6.7 " ;
lRealHandle = HCNetSDK.NET_DVR_RealPlay_V30(lUserID, ref clientinfo, null , 1 , false );
if (lRealHandle == - 1 )
{
MessageBox.Show( string .Format( " 播放失败,错误码: {0} " , HCNetSDK.NET_DVR_GetLastError()));
return ;
}
#endregion
#region Old
// NET_DVR_DEVICEINFO dev = new NET_DVR_DEVICEINFO();
// lUserID = HCNetSDK.NET_DVR_Login("125.119.30.175", 8000, "admin", "12345", out dev);
// if (lUserID == -1)
// {
// MessageBox.Show(string.Format("登录DVS失败,错误码: {0}", HCNetSDK.NET_DVR_GetLastError()), "登录DVS失败", MessageBoxButtons.OK, MessageBoxIcon.Error);
// return;
// }
// NET_DVR_CLIENTINFO clientinfo = new NET_DVR_CLIENTINFO();
// clientinfo.hPlayWnd = this.panel1.Handle; // 视频窗口
// clientinfo.lChannel = 2; // 通道号
// clientinfo.lLinkMode = 0;
// clientinfo.sMultiCastIP = "234.5.6.7";
// lRealHandle = HCNetSDK.NET_DVR_RealPlay(lUserID, ref clientinfo);
// if (lRealHandle == -1)
// {
// MessageBox.Show(string.Format("播放失败,错误码: {0}", HCNetSDK.NET_DVR_GetLastError()));
// return;
// }
#endregion
}
/// <summary>
/// 停止预览并退出登录
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnClose_Click( object sender, EventArgs e)
{
HCNetSDK.NET_DVR_StopRealPlay(lRealHandle);
#region New V30
HCNetSDK.NET_DVR_Logout_V30(lUserID);
#endregion
#region Old
// 如果不退出登录,下次开启拾音将失效
// HCNetSDK.NET_DVR_Logout(lUserID);
#endregion
this .panel1.Invalidate( false );
}
#endregion
代码说明:
1. [#region New]与[#region Old]代码块分别是新旧版本的API,这里均测试通过。
2. 需要把HCNetSDK.dll(这里事例使用版本为3.0.3.3)直接拷贝到bin\Debug下去,或者拷贝到项目工程根目录下,然后选中右键属性->复制到输出目录 选中始终复活或者如果较新则复制,重新编译即可。
三、提醒
提醒大家API有变动,请立即更新!
五、后期维护
1. 2009-11-2
也需要把PlayCtrl.dll加到的项目中来,否则可能出现登录成功,播放报错,显示错误代码64。
结束语
困难重重,坚持做伴。