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

【注意事项】
------------------------------------
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

想进技术交流群的加微信zls20210502(可以扫描下方二维码),这里没有套路,没有广告,只为打造纯净的技术交流群,(想进群捣乱打广告的免加,会有技术考核,别白费心思

8b5b458d8165be4865c9970afa95c062.png

Form1.cs:

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:

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

工程文件

5c3ddc7eed640576d338d7a065b71a1c.png

bin目录

1d18b657cda9d12bf8532c8cfdbc9c44.png

定时器:

3e837f0546f6d9b24e6ff6c7c305a2f9.png

运行结果:

3bbff24681f7259d46751687e0ba1862.png

----------------------------------------------------------

如果觉得有用,麻烦点击 在看,让更多志同道合的伙伴加入我们的交流群,一起共同进步!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
C#获取网口扫码枪数据的方法可以使用Socket类来实现。首先,你需要创建一个Socket对象,并指定IP地址和端口号。然后,你可以使用Receive方法来接收扫码枪发送的数据。以下是一个简单的示例代码: ```csharp using System; using System.Net; using System.Net.Sockets; using System.Text; class Program { static void Main() { // 创建Socket对象 Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // 设置IP地址和端口号 IPAddress ipAddress = IPAddress.Parse("192.168.0.1"); // 替换为扫码枪的IP地址 int port = 1234; // 替换为扫码枪的端口号 // 连接到扫码枪 socket.Connect(ipAddress, port); // 接收数据 byte\[\] buffer = new byte\[1024\]; int bytesRead = socket.Receive(buffer); string data = Encoding.ASCII.GetString(buffer, 0, bytesRead); // 处理接收到的数据 Console.WriteLine("Received data: " + data); // 关闭Socket连接 socket.Close(); } } ``` 请注意,你需要将代码中的IP地址和端口号替换为你实际使用的扫码枪的IP地址和端口号。此外,你可能还需要根据扫码枪的数据格式进行适当的解析和处理。 #### 引用[.reference_title] - *1* *2* [c# 获取串口扫描枪数据](https://blog.csdn.net/huxinyu0208/article/details/108604001)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zls365365

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值