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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
运维天地-服务器04-X86-PCServer内存信息获取
01 PART 知识回顾 本篇文章,我们重点介绍服务器"内存"信息的获取。 前期知识储备和回顾,请参考以下文章 01)运维天地-服务器01-X86-PCServer属性介绍 02)运维天地-服务器0
大话IT架构
2020/04/02
5710
运维天地-服务器03-X86-PCServer CPU信息获取
01 PART 知识回顾 本篇文章,我们重点介绍服务器"CPU"信息的获取。 前期知识储备和回顾,请参考以下文章 01)运维天地-服务器01-X86-PCServer属性介绍 02)运维天地-服务
大话IT架构
2020/04/02
4530
运维天地-服务器05-X86-PCServer磁盘信息获取
01 PART 知识回顾 本篇文章,我们重点介绍服务器"磁盘"信息的获取。 前期知识储备和回顾,请参考以下文章 01)运维天地-服务器01-X86-PCServer属性介绍 02)运维天地-服务器
大话IT架构
2020/04/03
4560
运维天地-服务器08-X86-PCServer IP信息获取
01 PART 知识回顾 本篇文章,我们重点介绍服务器"IP"信息的获取。 前期知识储备和回顾,请参考以下文章 01)运维天地-服务器01-X86-PCServer属性介绍 02)运维天地-服务器02-X86-PCServer资产信息获取 03)运维天地-服务器03-X86-PCServer CPU信息获取 04)运维天地-服务器04-X86-PCServer内存信息获取 05)运维天地-服务器05-X86-PCServer磁盘信息获取 06)运维天地-服务器06-X86-PCServer网口信息获取
大话IT架构
2020/04/15
4200
运维天地-服务器08-X86-PCServer IP信息获取
运维天地-服务器02-X86-PCServer资产信息获取
01 PART 知识回顾 本篇文章,我们重点介绍服务器"资产"信息的获取。 前期知识储备和回顾,请参考以下文章 01)运维天地-服务器01-X86-PCServer属性介绍 特别说明:本文的服务器
大话IT架构
2020/03/31
5490
运维天地-服务器02-X86-PCServer资产信息获取
运维天地-服务器09-X86-PCServer属性webapi接口实现
01 PART 知识回顾 本篇文章,我们重点介绍服务器熟悉webapi接口的实现。 前期知识储备和回顾,请参考以下文章 01)运维天地-服务器01-X86-PCServer属性介绍 02)运维天地-服务器02-X86-PCServer资产信息获取 03)运维天地-服务器03-X86-PCServer CPU信息获取 04)运维天地-服务器04-X86-PCServer内存信息获取 05)运维天地-服务器05-X86-PCServer磁盘信息获取 06)运维天地-服务器06-X86-PCServer网口
大话IT架构
2020/04/15
3300
运维天地-服务器09-X86-PCServer属性webapi接口实现
运维天地-服务器07-X86-PCServer系统信息获取
01 PART 知识回顾 本篇文章,我们重点介绍服务器"系统"信息的获取。 前期知识储备和回顾,请参考以下文章 01)运维天地-服务器01-X86-PCServer属性介绍 02)运维天地-服务器02-X86-PCServer资产信息获取 03)运维天地-服务器03-X86-PCServer CPU信息获取 04)运维天地-服务器04-X86-PCServer内存信息获取 05)运维天地-服务器05-X86-PCServer磁盘信息获取 06)运维天地-服务器06-X86-PCServer网口信息获取
大话IT架构
2020/04/15
4310
运维天地-服务器07-X86-PCServer系统信息获取
运维天地-服务器10-X86-PCServer属性webapi接口获取并入库
CREATE DATABASE IF NOT EXISTS idc DEFAULT CHARACTER SET utf8;
大话IT架构
2020/04/15
4090
运维天地-服务器10-X86-PCServer属性webapi接口获取并入库
python2 监控服务器资源
******************************内存监控********************************* *******************时间: 2019-08-24 16:50:20 ****************** 总内存: 65958920 空闲内存: 37296548 给文件的缓冲大小: 310288 高速缓冲存储器使用的大小: 8991808 被高速缓冲存储用的交换空间大小: 7160 给文件的缓冲大小: 310288 交换内存利用率: 4.35586183351 内存利用率: 29.35 % ****************************内核线程、虚拟内存、磁盘、陷阱和 CPU 活动的统计信息监控**************************** *******************时间: 2019-08-24 16:50:22 ****************** 等待运行进程的数量: 1 处于不间断状态的进程: 0 使用虚拟内存(swap)的总量: 365396 空闲的内存总量: 37298132 用作缓冲的内存总量: 310288 用作缓存的内存总量: 8991816 交换出内存总量 : 0 交换入内存总量 : 0 从一个块设备接收: 0 发送到块设备: 0 每秒的中断数: 9751 每秒的上下文切换数: 7514 用户空间上进程运行的时间百分比: 3 内核空间上进程运行的时间百分比: 2 闲置时间百分比: 95 等待IO的时间百分比: 0 从虚拟机偷取的时间百分比: 0 ***************************************cpu监控*************************************** *******************时间: 2019-08-24 16:50:23 ****************** CPU数目: 24 ************************负载均衡监控**************************** *******************时间: 2019-08-24 16:50:24 ****************** 系统5分钟前的平均负载: 0.16 系统10分钟前的平均负载: 0.08 系统15分钟前的平均负载: 0.06 分子是正在运行的进程数,分母为总进程数: 3/968 最近运行的进程id: 25222 ************************磁盘空间监控**************************** *******************时间: 2019-08-24 16:50:24 ****************** 文件系统: /dev/sda3 容量: 1.8T 已用: 133G 可用: 1.7T 已用%挂载点: 8% 文件系统: tmpfs 容量: 32G 已用: 12K 可用: 32G 已用%挂载点: 1% 文件系统: /dev/sda1 容量: 477M 已用: 57M 可用: 395M 已用%挂载点: 13% 文件系统: /dev/sdb1 容量: 440G 已用: 71M 可用: 436G 已用%挂载点: 1% ******************************端口监控********************************* *******************时间: 2019-08-24 16:50:25 ****************** 1 1 #################################################
用户5760343
2019/08/26
1.1K0
运维天地-服务器01-X86-PCServer属性介绍
日常工作中,服务器这个词语几乎天天提到。但是大部分人没有见过真机,对服务器不是太了解,现通过上面4张图片给大家一个直观的印象。
大话IT架构
2020/03/31
1.1K0
运维天地-服务器01-X86-PCServer属性介绍
GPFS通用并行文件系统之Python自动部署GPFS集群
GPFS文件系统能够横跨在所有主机上,分布在所有磁盘上,条带化读写,高性能。信令管理机制,并发性好。可配置fail组,可用性高。下面是GPFS集群的自动安装部署Python代码......
星哥玩云
2022/06/30
7360
GPFS通用并行文件系统之Python自动部署GPFS集群
Linux实体服务器添加网卡
服务器如果搭配了网口,在插入网线或者光纤后会亮灯。如果发现不亮,可以关闭机器查看亮不亮,因为有的时候系统会把网口禁用,进入到系统反而不亮了,除此之外不亮就是硬件问题。
陈不成i
2021/05/30
4.5K0
CentOS7配置LLDP服务
官方链接: https://vincentbernat.github.io/lldpd/usage.html
全栈程序员站长
2022/09/01
3.5K0
基于K8s的SR-IOV网络实践
在传统的虚拟化中,虚拟机的网卡通常是通过桥接(Bridge或OVS)的方式,因为这种方式最方便,也最简单,但是这样做最大的问题在于性能。本文讲的SR-IOV在2010年左右由Intel提出,但是随着容器技术的推广,intel官方也给出了SR-IOV技术在容器中使用的开源组件,例如:sriov-cni和sriov-device-plugin等,所以SR-IOV也开始在容器领域得到的大量使用。
zouyee
2022/05/25
3.9K1
基于K8s的SR-IOV网络实践
查看Linux服务器硬件信息的操作命令
Linux服务器配置文档找不到,你还在为查询Linux服务器硬件信息发愁吗?学会这些命令,让你轻松查看Linux服务器的CPU,内存,硬盘,SN序列号等信息,根本就不用去机房。
用户9105998
2021/11/22
4.9K0
如何快速查看服务器配置信息?
作为一个开发,与服务器打交道的时间肯定不少,很多时候也需要了解一下服务器的配置信息。在 Windows 系统上,我们可以通过「鲁大师」很轻松地查询到电脑的配置信息,那服务器上如何查询到 CPU、内存、主板、硬盘等信息呢? 与「鲁大师」一样,在 Linux 上有这样一款软件能让你快速查询服务器的配置信息,非常方便。它就是——「Inxi」。 什么是Inxi Inxi是一个可以获取完整的系统和硬件详情信息的命令行工具,内容包括: 硬件 CPU 磁盘驱动器 Xorg 桌面环境 内核 GCC版本 进程 内存占用 和
陈树义
2018/04/13
6.9K0
如何快速查看服务器配置信息?
太强了!利用 Python 写了一个监控服务器资源利用率的脚本!
部署完 自动巡检多个接口地址是否正常并按 crontab 定时任务通过企业微信机器人以文本的形式发送到告警群的脚本 后,又研究了一个脚本,其主要目的是:基于 Python 编程语言来监控服务器的 CPU、内存、/目录、/appslog、/bigdata目录使用率以及网卡接收和发送情况。
杰哥的IT之旅
2023/02/26
1.4K0
太强了!利用 Python 写了一个监控服务器资源利用率的脚本!
查看服务器硬件配置信息命令_服务器硬件参数
本次由于需要搭建一套环境,但是所需硬件配置不足,需要进行统计采购。那么就需要得知服务器现有配置,所以这次会介绍些常用的命令和工具来查询硬件信息。其实也可以通过像DELL厂商的IDRAC控制台来获取这些信息,但是比较尴尬的是IBM在获取硬盘信息方面支持比较差,仅显示物理磁盘数量,能够获取的信息很少,这时就需要像storcli这种专业工具来收集。本章使用的命令查询需求比较单一,后续会在实际使用中慢慢补充上来。
全栈程序员站长
2022/09/20
8.6K0
查看服务器硬件配置信息命令_服务器硬件参数
Linux运维常用知识(3)
参考:http://loveyan.blog.51cto.com/829079/745164
py3study
2020/01/08
27.2K0
Python RPC 远程调用脚本之 RPyC 实践
最近有个监控需求,需要远程执行集群每个节点上的脚本,并获取脚本执行结果,为了安全起见不需要账号密码登陆节点主机,要求只需要调用远程脚本模块的方法就能实现。 总结下python进行远程调用脚本方法: 登陆主机执行脚本,python模块支持如 pssh、pexpect、paramiko、ansible 以远程方法调用(不需要登陆主机),python模块 rpyc,支持分布式 socket 方式,稍显复杂,需要熟悉网络协议,起点比较高 rpyc支持远程调用、分布式计算,以较少代码量实现复杂socket编程,本文主
用户1177713
2018/02/24
3.1K0
Python RPC 远程调用脚本之 RPyC 实践
相关推荐
运维天地-服务器04-X86-PCServer内存信息获取
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验