Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C# 外接(网口)双摄像头视频获取

C# 外接(网口)双摄像头视频获取

作者头像
zls365
发布于 2020-08-19 03:57:47
发布于 2020-08-19 03:57:47
1.7K00
代码可运行
举报
文章被收录于专栏:CSharp编程大全CSharp编程大全
运行总次数:0
代码可运行

【注意事项】 ------------------------------------ 1. 更新设备网络SDK时,SDK开发包【库文件】里的HCNetSDK.dll、HCCore.dll、PlayCtrl.dll、SuperRender.dll、AudioRender.dll、HCNetSDKCom文件夹、ssleay32.dll、libeay32.dll、hlog.dll、hpr.dll、zlib1.dll、log4cxx.properties等文件均要加载到程序里面,【HCNetSDKCom文件夹】(包含里面的功能组件dll库文件)需要和HCNetSDK.dll、HCCore.dll一起加载,放在同一个目录下,且HCNetSDKCom文件夹名不能修改。

2. 如果自行开发软件不能正常实现相应功能,而且程序没有指定加载的dll库路径,请在程序运行的情况下尝试删除HCNetSDK.dll。如果可以删除,说明程序可能调用到系统盘Windows->System32目录下的dll文件,建议删除或者更新该目录下的相关dll文件;如果不能删除,dll文件右键选择属性确认SDK库版本。

3. 如按上述步骤操作后还是不能实现相应功能,请根据NET_DVR_GetLastError返回的错误号判断原因。

4.适用型号:DS-2CD2D15DWD 2.8MM,DS-2CD6424FWD-20 3.7MM,DS-2CD6425FWD-20 2.8MM B

5.dll和sdk可以上海康官网下载:https://www.hikvision.com/cn/download_61.html

Form1.cs:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            init();
        }
        public IntPtr PictureDev1Cam { get { return pictureBox1.Handle; } }
        public IntPtr PictureDev2Cam { get { return pictureBox2.Handle; } }
        IntPtr Cam1Handle = IntPtr.Zero;
        IntPtr Cam2Handle = IntPtr.Zero;
        Cam Camera1 = new Cam();
        Cam Camera2 = new Cam();
        static private string Cam1IP = "192.168.1.64";
        static private string Cam2IP = "192.168.1.61";
        void init()
        {
            Cam1Handle = PictureDev1Cam;
            Cam2Handle = PictureDev2Cam;
        }
        private void ConnectCamera(int whitch)
        {
            string userName = "admin";
            string password = "a123456.";
            int PortCamera = 8000;
            if (whitch == 1)
            {
                labelCamera1Status.Text = "摄像头连接中...";
                Task.Run(() =>
                {
                if (!Camera1.ConnectCamera(Cam1IP, PortCamera, userName, password))
                {
                        this.Invoke((Action)delegate { labelCamera1Status.Text = "摄像头连接失败"; });
                 }
                else
                {
                        this.Invoke((Action)delegate { labelCamera1Status.Text = ""; });
                        Camera1.Preview(Cam1Handle);
                        Camera1.AdjustMirrorPara(1);
                        Cam1ReconnectTimer.Stop();
                    }
                });
            }
            else
            {
                labelCamera2Status.Text = "摄像头连接中...";
                Task.Run(() =>
                {
                    if (!Camera2.ConnectCamera(Cam2IP, PortCamera, userName, password))
                    {
                        this.Invoke((Action)delegate { labelCamera2Status.Text = "摄像头连接失败"; });
                    }
                    else
                    {
                        this.Invoke((Action)delegate { labelCamera2Status.Text = ""; });
                        Camera2.Preview(Cam2Handle);
                        Camera2.AdjustMirrorPara(1);
                        Cam2ReconnectTimer.Stop();
                    }
                });
            }
        }
        private void Cam1ReconnectTimer_Tick(object sender, EventArgs e)
        {
            ConnectCamera(1);

        }
        private void Cam2ReconnectTimer_Tick(object sender, EventArgs e)
        {
            ConnectCamera(2);
        }
        private void Form1_Load(object sender, EventArgs e)
        {
           
        }
    }
}

cam:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System;
using System.IO;
using System.Runtime.InteropServices;


namespace WindowsFormsApp1
{
    class Cam
    {
        private bool initSDK = false;
        private uint lastErr = 0;
        private string debugMessage = "";
        private bool err = false;
        private Int32 userID = -1;
        public bool Isconnected { get; private set; }
        UInt32 dwReturn = 0;
        Int32 nSize = 0;
        IntPtr ptrPicCfg;
        private CHCNetSDK.NET_DVR_CAMERAPARAMCFG_EX camPara = new CHCNetSDK.NET_DVR_CAMERAPARAMCFG_EX();
        private CHCNetSDK.NET_DVR_DEVICEINFO_V30 DeviceInfo = new CHCNetSDK.NET_DVR_DEVICEINFO_V30();
        private Int32 realPlayHandle = -1;
        public bool ConnectCamera(string deviceIP, int port, string userName, string password)
        {

            initSDK = CHCNetSDK.NET_DVR_Init();
            if (initSDK == false)
            {
                lastErr = CHCNetSDK.NET_DVR_GetLastError();
                debugMessage = "初始化过程失败, 错误码:" + lastErr;

                err = true;
                return false;
            }
            else
            {

                CHCNetSDK.NET_DVR_SetLogToFile(3, Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "SdkLog\\"), true);
            }

            CHCNetSDK.NET_DVR_DEVICEINFO_V30 DeviceInfo = new CHCNetSDK.NET_DVR_DEVICEINFO_V30();


            userID = CHCNetSDK.NET_DVR_Login_V30(deviceIP, port, userName, password, ref DeviceInfo);
            if (userID < 0)
            {
                lastErr = CHCNetSDK.NET_DVR_GetLastError();
                debugMessage = "注册失败, 错误码:" + lastErr;
                err = true;

                return false;
            }


            Isconnected = true;
            return true;
        }
        public void AdjustMirrorPara(byte type)
        {
            dwReturn = 0;
            nSize = Marshal.SizeOf(camPara);
            ptrPicCfg = Marshal.AllocHGlobal(nSize);
            Marshal.StructureToPtr(camPara, ptrPicCfg, false);
            if (CHCNetSDK.NET_DVR_GetDVRConfig(userID, 3368, DeviceInfo.byStartChan, ptrPicCfg, (uint)nSize, ref dwReturn))
            {
                camPara = (CHCNetSDK.NET_DVR_CAMERAPARAMCFG_EX)Marshal.PtrToStructure(ptrPicCfg, typeof(CHCNetSDK.NET_DVR_CAMERAPARAMCFG_EX));
                Marshal.FreeHGlobal(ptrPicCfg);
                camPara.byMirror = type;

                ptrPicCfg = Marshal.AllocHGlobal(nSize);
                Marshal.StructureToPtr(camPara, ptrPicCfg, false);


                if (!CHCNetSDK.NET_DVR_SetDVRConfig(userID, 3369, DeviceInfo.byStartChan, ptrPicCfg, (uint)nSize))
                {
                    lastErr = CHCNetSDK.NET_DVR_GetLastError();
                    debugMessage = "设置镜像关闭失败, 错误码:" + lastErr;
                    err = true;

                }
            }
            else
            {
                lastErr = CHCNetSDK.NET_DVR_GetLastError();
                debugMessage = "获取参数失败, 错误码:" + lastErr;
                err = true;

            }
            Marshal.FreeHGlobal(ptrPicCfg);
        }
        public void Preview(IntPtr handle)
        {
            CHCNetSDK.NET_DVR_PREVIEWINFO previewInfo = new CHCNetSDK.NET_DVR_PREVIEWINFO();
            previewInfo.hPlayWnd = handle;//预览窗口
            previewInfo.lChannel = 1;//(int)DeviceInfo.byStartChan;//预览的设备通道
            previewInfo.dwStreamType = 0;//码流类型:0-主码流,1-子码流,2-码流3,3-码流4,以此类推
            previewInfo.dwLinkMode = 0;//连接方式:0- TCP方式,1- UDP方式,2- 多播方式,3- RTP方式,4-RTP/RTSP,5-RSTP/HTTP 
            previewInfo.bBlocked = true; //0- 非阻塞取流,1- 阻塞取流
            previewInfo.dwDisplayBufNum = 0; //播放库播放缓冲区最大缓冲帧数

            //CHCNetSDK.REALDATACALLBACK RealData = new CHCNetSDK.REALDATACALLBACK(RealDataCallBack);//预览实时流回调函数
            IntPtr pUser = new IntPtr();//用户数据

            //打开预览 Start live view 
            realPlayHandle = CHCNetSDK.NET_DVR_RealPlay_V40(userID, ref previewInfo, null/*RealData*/, pUser);
            if (realPlayHandle < 0)
            {
                lastErr = CHCNetSDK.NET_DVR_GetLastError();
                debugMessage = "预览失败, 错误码:" + lastErr; //预览失败,输出错误号
                err = true;
                //MessageBox.Show(str);
                return;
            }
        }
    }
}

CHCNetSDK.cs

这个太长,需要的可以上我的github下载,省略,我的账号zyr365

工程文件

bin目录

定时器:

运行结果:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CSharp编程大全 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python 调用海康威视 摄像头 显示预览画面
支持 RTSP(Runtime Stream Protocol)协议的摄像头可以很方便地用 opencv i调用
为为为什么
2024/05/23
1.4K0
C# —— 利用Marshal.GetDelegateForFunctionPointer 来转换一个函数指针为一个委托
原来是为了在游戏外挂中发送键盘鼠标消息,自己写个sendmessage或者是postmessage又比较麻烦。于是google了一下,发现现在很多脚本工具都有这个功能,其中按键精灵的一个叫361度的插件已经有这个的实现,还验证过了。为什么不拿来己用呢? 首先分析一下按键精灵插件的接口,发现:
vv彭
2021/03/08
3.2K0
C# —— 利用Marshal.GetDelegateForFunctionPointer 来转换一个函数指针为一个委托
海康威视rtsp取流地址(海康威视设置教程)
本文目的主要是想要实时显示海康威视的摄像头数据,笔者尝试了如下几种方式(部分未做完):
全栈程序员站长
2022/08/01
23.2K0
海康威视rtsp取流地址(海康威视设置教程)
Unity3D下如何实现RTMP推送摄像头或屏幕数据(Windows平台)
好多开发者提到,苦于在unity3d下实现RTMP直播推送,本次以大牛直播SDK(Github)的Windows平台RTMP推送模块(以推摄像头为例,如需推屏幕数据,设置相关参数即可)为例,介绍下unity3d的RTMP推送集成。
音视频牛哥
2020/06/10
1.5K0
.NET/C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
一般来说,大家在需要监听全局消息的时候会考虑 SetWindowsHookEx 这个 API。或者需要处理一些非自己编写的窗口的消息循环的时候,也会考虑使用它。
walterlv
2023/10/22
1.6K0
.NET/C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
C# WPF项目实战(经典)
Dispatcher.Invoke((Action)delegate {});
zls365
2020/12/29
2.2K0
c#钩子学习笔记(一)
钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。
冰封一夏
2019/09/10
7250
扫描仪对接(C#)
源代码地址:http://www.codeproject.com/Articles/171666/Twain-for-WPF-Applications-Look-Ma-No-Handles
码客说
2022/09/19
4.7K0
扫描仪对接(C#)
Qt音视频开发17-海康sdk解码
在视频监控行业领域,海康当之无愧是老大,稳坐第一的宝座很多年了,近期需要将视频监控系统改成采用海康sdk的内核,于是特意去查阅了sdk的使用手册,sdk相关的文档和文件可以直接官网下载到,而且是经常更新的,目前提供了windows和linux上的,win上的sdk还是更新比较快而且完整的,但是在linux上的就不得不吐槽下了,很旧很旧的版本,不要看打包文件很新,其实里面的内容是很老的,不知道为啥官方不也同步更新linux上的sdk,也许现在linux上的需求还不是很多吧,但是随着国产化的大力推进,估计不久的将来linux上的也会慢慢的完善起来的,说不定官方早就有了此计划,还有一种个人的猜测是linux上的开发包估计官方自己内部用的新的,可能打算自己做linux上的各种客户端吧。
feiyangqingyun
2020/08/25
1.8K0
Qt音视频开发17-海康sdk解码
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_F
用户7705674
2021/11/03
9580
C# 纯控制台创建一个全屏窗口
使用 user32.dll 的 CreateWindowExW 方法就能创建窗口,代码请看
林德熙
2020/08/19
1.1K0
Windows平台RTMP推送|轻量级RTSP服务摄像头如何添加动态文字水印
我们在做Windows平台RTMP推送、轻量级RTSP服务的时候,遇到过这样的技术需求,除了常规的png图片水印外,开发者希望能在桌面或摄像头上,叠加上实时时间和位置信息,并保存到图像里。
音视频牛哥
2024/04/17
1700
Windows平台RTMP推送|轻量级RTSP服务摄像头如何添加动态文字水印
C#解析PDF
C#解析PDF的方式有很多,比较好用的有ITestSharp和PdfBox。 PDF内容页如果是图片类型,例如扫描件,则需要进行OCR(光学字符识别)。 文本内容的PDF文档,解析的过程中,我目前仅发现能以字符串的形式读取的,不能够读取其中的表格。据说PDF文档结构中是没有表格概念的,因此这个自然是读不到的,如果果真如此,则PDF中表格内容的解析,只能对获取到的字符串按照一定的逻辑自行解析了。 ITestSharp是一C#开源项目,PdfBox为Java开源项目,借助于IKVM在.Net平台下有实现。 Pd
用户1637609
2018/04/12
3K0
C#获取摄像头拍照显示图像
之前有个需求,就是在web界面可以实现调用摄像头,用户把手机的个人二维码展示给摄像头,摄像头进行摄像识别用户。
zls365
2021/03/16
1.1K0
C# winform键盘钩子
http://blog.163.com/da7_1@126/blog/static/1040726782011112652629750/
全栈程序员站长
2022/08/31
4810
C# 实现 WinForm 全屏置顶
我们在运行一些 Windows 应用程序的时候,需要将其运行在窗体置顶的模式(使其它应用窗体无法遮挡在置顶应用窗体之上),并且进入全屏状态。本文将介绍如何使用 C# 来实现 WinForm 的全屏置顶的基本功能。
初九之潜龙勿用
2024/12/11
1590
Windows平台C#版RTSP转RTMP直播推送定制版
前几年我们发布了C++版的多路RTMP/RTSP转RTMP转发官方定制版。在秉承低延迟、灵活稳定、低资源占用的前提下,客户无需关注开发细节,只需图形化配置转发等各类参数,实现产品快速上线目的。
音视频牛哥
2024/05/19
1860
Windows平台C#版RTSP转RTMP直播推送定制版
Windows平台实现Unity下窗体|摄像头|屏幕采集推送
随着Unity3D的应用范围越来越广,越来越多的行业开始基于Unity3D开发产品,如传统行业中虚拟仿真教育、航空工业、室内设计、城市规划、工业仿真等领域。
音视频牛哥
2021/06/10
1.2K0
Windows平台实现Unity下窗体|摄像头|屏幕采集推送
C++/CLI(二)Mono C++/CLI Native调用和P/Invoke调用
本文根据Mono C++原文档翻译,这篇文章的目的,就是想说CLR程序在VS下面生成的DLL不能给Unity调用,因为Mono的Native调用的编码和MS CLR的不一样,如果Unity想要去调用C++程序,需要使用P/Invoke的方式,这两者的不兼容使得本来非常方便的C++/CLI在Unity下毫无用武之地,希望有一天MS能够给Mono CLR一片土地,方便你我他,还有就是高高兴兴写了半个月MS CLR以为能在Unity下使用了,结果一Run就炸,所以说以后代码未动,单元测试一定要先写啊,这片区代码需要全部重构了,血与泪的教训。
Pulsar-V
2019/04/01
3.8K0
Windows设备信息获取:(摄像头,声卡为例)Qt,WindowsAPI对比说明(1)
近期一个小项目需要获取本机摄像头,声卡的信息,提供配置文件,用作软件配置。然后开始慢慢研究,说一下自己遇到的一些坑。
何其不顾四月天
2023/03/10
2.3K0
Windows设备信息获取:(摄像头,声卡为例)Qt,WindowsAPI对比说明(1)
相关推荐
Python 调用海康威视 摄像头 显示预览画面
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验