事情是这样的,有一台海康威视的摄像头,客户需要一个ActiveX控件嵌入到网页中,通过点击按钮开始录制和结束录制来进行视频的录制和保存,关于海康摄像头的二次开发在此就不多说了,可以参考SDK中的说明。
直接上流程:
1.开发环境:
VS2010,这个打包方便,之前用VS2013打包的,总是调用不了,不知道原因是什么;SDK是32位的,用64位的在Winform中可以正常使用,在网页中使用控件时会报错。
2.新建项目:
新建一个类库项目,如下:
右键点击项目,添加“用户控件”,如下:
界面拖控件,如下:
控件代码如下,其中Guid是“工具”->“创建GUID”自动生成的,#region->#endregion折叠部分是实现的IObjectSafety接口
using System;
namespace VideoHelper
{
[System.Security.SecuritySafeCritical]
public class Videos
{
private bool m_initSDK = false;
/// <summary>
/// 正在录制
/// </summary>
private bool m_Record = false;
private uint LastErr = 0;
private Int32 m_RealHandle = -1;
private Int32 m_lUserID = -1;
public IntPtr handle { get; set; }
public bool Initialize(string ip = "192.168.1.64", int port = 8000, string username = "admin", string password = "8910jqk#")
{
try
{
m_initSDK = CHCNetSDK.NET_DVR_Init();
if (m_initSDK)
{
CHCNetSDK.NET_DVR_SetLogToFile(3, "C:\\SdkLog\\", true);
//设备参数结构体
CHCNetSDK.NET_DVR_DEVICEINFO_V30 DeviceInfo = new CHCNetSDK.NET_DVR_DEVICEINFO_V30();
//注册设备
m_lUserID = CHCNetSDK.NET_DVR_Login_V30(ip, port, username, password, ref DeviceInfo);
return m_lUserID >= 0;
}
return false;
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show("Initialize:" + ex.Message);
return false;
}
}
public bool Start(IntPtr handle, string filename)
{
try
{
CHCNetSDK.NET_DVR_PREVIEWINFO lpPreviewInfo = new CHCNetSDK.NET_DVR_PREVIEWINFO();
lpPreviewInfo.lChannel = 1;
lpPreviewInfo.dwLinkMode = 0;
lpPreviewInfo.dwStreamType = 0;
lpPreviewInfo.bBlocked = true;
lpPreviewInfo.dwDisplayBufNum = 15;
lpPreviewInfo.hPlayWnd = handle;
IntPtr pUser = IntPtr.Zero;//new IntPtr();
//获取实时视频流
m_RealHandle = CHCNetSDK.NET_DVR_RealPlay_V40(m_lUserID, ref lpPreviewInfo, null, pUser);
if (m_Record == false)
{
CHCNetSDK.NET_DVR_MakeKeyFrame(m_lUserID, 1);
if (!CHCNetSDK.NET_DVR_SaveRealData(m_RealHandle, filename))
{
LastErr = CHCNetSDK.NET_DVR_GetLastError();
return false;
}
else
{
m_Record = true;
return true;
}
}
else
{
return false;
}
}
catch
{
return false;
}
}
public bool End()
{
if (m_Record)
{
if (!CHCNetSDK.NET_DVR_StopSaveRealData(m_RealHandle))
{
LastErr = CHCNetSDK.NET_DVR_GetLastError();
return false;
}
m_Record = false;
m_RealHandle = -1;
return true;
}
else
{
return false;
}
}
public void Dispose()
{
try
{
if (m_lUserID >= 0)
{
CHCNetSDK.NET_DVR_Logout_V30(m_lUserID);
m_lUserID = -1;
}
if (m_RealHandle >= 0)
{
CHCNetSDK.NET_DVR_StopRealPlay(m_RealHandle);
m_RealHandle = -1;
}
CHCNetSDK.NET_DVR_Cleanup();
}
catch
{ }
}
}
}