C#实现IP摄像头的方法
更新时间:2020年6月25日 11:30 点击:1755
本文实例讲述了C#实现IP摄像头的方法。分享给大家供大家参考。具体实现方法如下:
#region IP摄像头代码 /// <summary> /// ip摄像头代码 /// </summary> //视频 private IntPtr m_hChannel; private IntPtr m_hServer, phPlay; public delegate void MyInvoke(string str); public delegate void OutDelegate(IntPtr hSearch, DVSNET_FILE_TIME pFileTime, DVSNET_FILE_INFO pFileInfo, IntPtr pcontext); //远程视频处理 public void BeforeRecordFrame(IntPtr hChannel, ref RECORD_INFO pRecordInfo, ref FRAME_HEADER pFrameHeader, IntPtr pcontext) { } DVSNETClient.FileSearchCallback File_SearchCallback; //远程视频回放 public void FileSearchCallback(IntPtr hSearch, ref DVSNET_FILE_TIME pFileTime, ref DVSNET_FILE_INFO pFileInfo, IntPtr pcontext) { OutText(hSearch, pFileTime, pFileInfo, pcontext); } public void OutText(IntPtr hSearch, DVSNET_FILE_TIME pFileTime, DVSNET_FILE_INFO pFileInfo, IntPtr pcontext) { if (lvVideo.InvokeRequired) { OutDelegate outdelegate = new OutDelegate(OutText); this.BeginInvoke(outdelegate, new object[] { hSearch, pFileTime, pFileInfo, pcontext }); return; } lvVideo.View = View.Details; lvVideo.FullRowSelect = true; for (int i = 0; i < pFileInfo.sFileName.Count(); i++) { ListViewItem item1 = new ListViewItem(pFileInfo.sFileName, i); lvVideo.Items.AddRange(new ListViewItem[] { item1 }); } } private void pb_del_video_Click(object sender, EventArgs e) { this.Close(); } public void SearchNotify(int nDevType,string sServName,string sServSerial,string sUrl,IntPtr MacAddr,ushort wWebPort,ushort wDataPort,string sSubNetMask,string sGateWay,string sMultiIp,string sDNS,ushort wMultiPort,int nChCount,uint bDHCP,IntPtr pcontext) { string str = Convert.ToString(wDataPort); //string str2 = sUrl + "(" + str + ")"; string str2 = sUrl; this.AddText(str2); } //赋值给cmbIP private void AddText(string str) { MyInvoke method = new MyInvoke(this.AddTextToCmb); base.BeginInvoke(method, new object[] { str }); } public void AddTextToCmb(string str) { this.CmbIP.Items.Add(str); } //s搜索服务器 private void btnVideoSearck_Click(object sender, EventArgs e) { this.CmbIP.Items.Clear(); errornum errornum = DVSNETClient.DVSNET_SearchServers(0xbb8, 1, new DVSNETClient.SearchNotify(this.SearchNotify), base.Handle, IntPtr.Zero); if (errornum == errornum.DVSNET_ERR_OK) { timerVideo.Enabled = true; btnVideoSearck.Enabled = false; } else { } } //打开链接 private void btnVideoOpen_Click(object sender, EventArgs e) { string text = this.CmbIP.Text; string sServIp = text; int index = text.IndexOf('('); if (index != -1) { string str3 = new string(text.ToCharArray(), 0, index); sServIp = str3; } errornum errornum = DVSNETClient.DVSNET_OpenServer(this.EdtName.Text, sServIp, Convert.ToUInt16(this.EdtPort.Text), this.EdtUser.Text, this.EdtPassword.Text, ref this.m_hServer, 0, 0); this.btnVideoOpen.Enabled = false; //不能点击 if (errornum == errornum.DVSNET_ERR_OK) { DVSNET_SERVER_INFO dvsnet_server_info = new DVSNET_SERVER_INFO(); MessageBox.Show("打开链接成功!"); dvsnet_server_info = new DVSNET_SERVER_INFO { lStructSize = Marshal.SizeOf(dvsnet_server_info) }; DVSNETClient.DVSNET_GetServerInfo(this.m_hServer, ref dvsnet_server_info); // this.CmbChannel.Items.Clear(); for (int i = 0; i < dvsnet_server_info.nChnNum; i++) { int num3 = i + 1; // this.CmbChannel.Items.Add(num3.ToString()); } // this.CmbChannel.SelectedIndex = 0; } else { MessageBox.Show("打开链接失败,错误码为:" + errornum.ToString()); this.btnVideoOpen.Enabled = true; //不能点击 } } //关闭链接 private void btnVideoClose_Click(object sender, EventArgs e) { if (this.m_hChannel != IntPtr.Zero) { MessageBox.Show("请关闭通道!再关闭链接"); } else { if (this.m_hServer != IntPtr.Zero) { DVSNETClient.DVSNET_CloseServer(this.m_hServer); this.m_hServer = IntPtr.Zero; this.btnVideoOpen.Enabled = true; //不能点击 } } } //打开通道 IntPtr selServer = IntPtr.Zero; private void btnVideoOpenChnnel_Click(object sender, EventArgs e) { this.panelVideo.Visible = true; this.pannelVideoTwo.Visible = false; if (this.m_hServer != IntPtr.Zero) { this.btnVideoOpenChnnel.Enabled = false; //不能点击 DVSNET_CHANNEL_INFO dvsnet_channel_info = new DVSNET_CHANNEL_INFO(); MessageBox.Show("打开通道成功!请稍候"); dvsnet_channel_info = new DVSNET_CHANNEL_INFO { lStructSize = Marshal.SizeOf(dvsnet_channel_info), nProtocol = 0, hWndDisplay = this.panelVideo.Handle, bPlayStart = 1, dwStreamNo = 0 }; DVSNETClient.DVSNET_OpenChannel(this.m_hServer, Convert.ToUInt16(0), ref dvsnet_channel_info, ref this.m_hChannel); } else { MessageBox.Show("请打开链接!"); } } //关闭通道 private void btnVideoCloseChnnel_Click(object sender, EventArgs e) { if (this.m_hChannel != IntPtr.Zero) { DVSNETClient.DVSNET_CloseChannel(this.m_hChannel); MessageBox.Show("关闭通道成功!请稍候"); this.m_hChannel = IntPtr.Zero; this.btnVideoOpenChnnel.Enabled = true; //不能点击 } } //开始录像 private void btnVideoOn_Click(object sender, EventArgs e) { try { string ss = DateTime.Now.ToString().Replace(":", "-").Replace(" ", "-").Replace("/", "-") + ".asf"; if (this.panelVideo.Visible == false) { MessageBox.Show("请切换到打开通道"); } else { if (this.m_hChannel != IntPtr.Zero) { this.btnVideoOn.Enabled = false; //不能点击 //DVSNETClient.DVSNET_StartRecord(this.m_hChannel, 1, FILETYPE.FILETYPE_ASF, ss, new DVSNETClient.BeforeRecordFrame(this.BeforeRecordFrame), base.Handle); DVSNETClient.DVSNET_StartRecord(this.m_hChannel, 1, FILETYPE.FILETYPE_ASF, ss,Before_RecordFrame, base.Handle); } else { MessageBox.Show("请打开通道!"); } } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } //停止录像 private void btnStopRec_Click(object sender, EventArgs e) { DVSNETClient.DVSNET_StopRecord(this.m_hChannel); MessageBox.Show("已停止录像!"); this.btnVideoOn.Enabled = true; //不能点击 } //打开本地视频 IntPtr phPlayer; private void btnsearch_Click(object sender, EventArgs e) { try { if (m_hServer != IntPtr.Zero) { string fName = ""; OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.InitialDirectory = Application.StartupPath; //注意这里写路径时要用c:\而不是c: openFileDialog.Filter = "文本文件|*.asf|所有文件|*.asf"; openFileDialog.RestoreDirectory = true; openFileDialog.FilterIndex = 1; if (openFileDialog.ShowDialog() == DialogResult.OK) { this.panelVideo.Visible = false; this.pannelVideoTwo.Visible = true; this.btnsearch.Enabled = false; fName = openFileDialog.FileName; IntPtr hDisplayWnd = pannelVideoTwo.Handle; phPlayer = (IntPtr)0; DVSNETClient.DVSPLAYER_ReleaseInstance(phPlayer); //释放 DVSNETClient.DVSPLAYER_Stop(phPlayer); //释放本地 errornum aa = DVSNETClient.DVSPLAYER_CreateInstance(hDisplayWnd, ref phPlayer, 0); aa = DVSNETClient.DVSPLAYER_OpenFile(phPlayer,ref fName, 1); DVSNETClient.DVSPLAYER_Start(phPlayer); } else { this.panelVideo.Visible = true; this.pannelVideoTwo.Visible = false; } } else { MessageBox.Show("请打开通道!"); } } catch (Exception) { throw; } } //停止视频播放 private void btnhf_Click(object sender, EventArgs e) { this.panelVideo.Visible = true; this.pannelVideoTwo.Visible = false; IntPtr phPlayer = (IntPtr)0; DVSNETClient.DVSPLAYER_Stop(phPlayer); MessageBox.Show("已停止回放录像!"); this.btnsearch.Enabled = true; ; } //查找远程视频 private void btnSearchbyName_Click(object sender, EventArgs e) { if (m_hServer == IntPtr.Zero) { MessageBox.Show("请先打开链接登录服务器!"); return; } this.btnSearchbyName.Enabled = false; DVSNET_FILE_TIME pStartTime = new DVSNET_FILE_TIME(); pStartTime.lYear = (uint)this.dateTimePicker1.Value.Year; pStartTime.lMonth = (uint)this.dateTimePicker1.Value.Month; pStartTime.lDay = (uint)this.dateTimePicker1.Value.Day; pStartTime.nHour = 0; pStartTime.nMinute = 0; DVSNET_FILE_TIME pEndTime = new DVSNET_FILE_TIME(); pEndTime.lYear = (uint)this.dateTimePicker1.Value.Year; pEndTime.lMonth = (uint)this.dateTimePicker1.Value.Month; pEndTime.lDay = (uint)this.dateTimePicker1.Value.Day; pEndTime.nHour = 23; pEndTime.nMinute = 59; IntPtr phSearch = IntPtr.Zero; //if(){} errornum bak = DVSNETClient.DVSNET_ServerFindFile(m_hServer, 0, 0, (char)0xff, ref pStartTime, ref pEndTime, File_SearchCallback, (IntPtr)0, ref phSearch); if (bak != errornum.DVSNET_ERR_OK) { MessageBox.Show("查找远程视频失败!"); } this.btnSearchbyName.Enabled = true; } //鼠标双击事件 private void lvVideo_MouseDoubleClick(object sender, MouseEventArgs e) { this.panelVideo.Visible = false; this.pannelVideoTwo.Visible = true; string sa = ""; IntPtr hWnd = pannelVideoTwo.Handle; if (lvVideo.SelectedItems.Count > 0) { //this.listView1.SelectedIndices sa = lvVideo.SelectedItems[0].Text.ToString(); } DVSNETClient.DVSPLAYER_Stop(phPlayer); //释放本地回放 DVSNETClient.DVSNET_ClosePlayFile(phPlay); //释放远程 phPlay = IntPtr.Zero; errornum bak = DVSNETClient.DVSNET_PlayFileByName(m_hServer, sa, 1, hWnd, ref phPlay); if (bak == errornum.DVSNET_ERR_OK) { UInt32 value = 0; DVSNETClient.DVSNET_ControlPlayFile(phPlay, 1, 0, ref value); } else { MessageBox.Show("回放远程文件 失败,错误码为" + bak.ToString()); } } #endregion //时间控件 1s private void timerVideo_Tick(object sender, EventArgs e) { int nStatus = 0; errornum errnum = DVSNETClient.DVSNET_GetSearchStatus(ref nStatus); if (errnum == errornum.DVSNET_ERR_OK) { if (nStatus == 1) { btnVideoSearck.Enabled = true; timerVideo.Enabled = false; MessageBox.Show("没有启动搜索"); } if (nStatus == 2) { //MessageBox.Show("正在搜索!"); } if (nStatus == 3) { timerVideo.Enabled = false; btnVideoSearck.Enabled = true; if (this.CmbIP.Items.Count == 0) { MessageBox.Show("没有找到设备!请接上设备"); } else { MessageBox.Show("已找到设备,请选择IP地址"); } } } else { MessageBox.Show("DVSNET_GetSearchStatus 失败,错误码为" + errnum.ToString()); } }
希望本文所述对大家的C#程序设计有所帮助。
上一篇: C#图像伪彩色处理方法
下一篇: C#图像颜色聚类高效方法实例
相关文章
- 我们在使用C#做项目的时候,基本上都需要制作登录界面,那么今天我们就来一步步看看,如果简单的实现登录界面呢,本文给出2个例子,由简入难,希望大家能够喜欢。...2020-06-25
- 这篇文章主要介绍了C# 字段和属性的的相关资料,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下...2020-11-03
- 这篇文章主要介绍了C#中截取字符串的的基本方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-03
- 本文给大家分享C#连接SQL数据库和查询数据功能的操作技巧,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友参考下吧...2021-05-17
- 这篇文章主要介绍了C#实现简单的Http请求的方法,以实例形式较为详细的分析了C#实现Http请求的具体方法,需要的朋友可以参考下...2020-06-25
- 本文主要介绍了C#中new的几种用法,具有很好的参考价值,下面跟着小编一起来看下吧...2020-06-25
使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序)
这篇文章主要介绍了使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25- 这篇文章主要介绍了C#开发Windows窗体应用程序的简单操作步骤,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-12
- 这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
- 在昨天的《Javascript权威指南》学习笔记之十:ECMAScript 5 增强的对象模型一文中,对于一段代码的调试出现了一个奇怪现象,现将源代码贴在下面: 复制代码 代码如下: <script type="text/javascript"> function Person(){}...2014-05-31
- 最近做一个小项目不可避免的需要前端脚本与后台进行交互。由于是在asp.net中实现,故问题演化成asp.net中jiavascript与后台c#如何进行交互。...2020-06-25
- 这篇文章主要用实例讲解C#递归算法的概念以及用法,文中代码非常详细,帮助大家更好的参考和学习,感兴趣的朋友可以了解下...2020-06-25
- 本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
- 轻松学习C#的基础入门,了解C#最基本的知识点,C#是一种简洁的,类型安全的一种完全面向对象的开发语言,是Microsoft专门基于.NET Framework平台开发的而量身定做的高级程序设计语言,需要的朋友可以参考下...2020-06-25
- 本文主要介绍了C#变量命名规则小结,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-09
- 这篇文章主要介绍了c#中(&&,||)与(&,|)的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
- 本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
- 这篇文章主要介绍了C#绘制曲线图的方法,以完整实例形式较为详细的分析了C#进行曲线绘制的具体步骤与相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
- 复制代码 代码如下: //element:需要添加新样式的元素,value:新的样式 function addClass(element, value ){ if (!element.className){ element.className = value; }else { newClassName = element.className; newClas...2014-05-31
- 这篇文章主要介绍了c#自带缓存使用方法,包括获取数据缓存、设置数据缓存、移除指定数据缓存等方法,需要的朋友可以参考下...2020-06-25