首页 > 编程语言 >C#批量设置海康和大华录像机NVR,GB28181的通道编码.

C#批量设置海康和大华录像机NVR,GB28181的通道编码.

时间:2024-06-15 16:59:55浏览次数:21  
标签:NVR C# pInputXml pOutputXml GB28181 uint NET Marshal string

我经常要把小区海康或者大华的硬盘录像机推送到自己搭建的gb28181监控平台,每次几百个摄像头编码,有点头大,就用了1个多周写了个批量设置海康和大华硬盘录像机的通道编码的程序,海康和大华的SDK简直不是人看的. 太乱了.

大华读取通道编码的代码

        /// <summary>
        /// 获取通道编码id列表
        /// QQ : 771811549
        /// </summary>
        /// <returns>通道编码id列表</returns>
        public DataTable GetInputIDs()
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("id", typeof(string));
            dt.Columns.Add("videoInputID", typeof(string));

            if (info.stuSipServerInfo[0].nChannelInfoNum > 0)// 释放内存
            { Marshal.FreeHGlobal(info.stuSipServerInfo[0].pstuChannnelInfo); }

            info.stuSipServerInfo[0].nChannelInfoNum = (uint)m_DeviceInfo.nChanNum;//设置通道个数
            info.stuSipServerInfo[0].pstuChannnelInfo = Marshal.AllocHGlobal(channelInfoSize * m_DeviceInfo.nChanNum);//分配内存

            NETClient.CLIENT_GetConfig(m_LoginID, -1, ref info);//获取数据

            NET_SIP_SERVER_INFO ser = info.stuSipServerInfo[0];
            for (int j = 0; j < ser.nChannelInfoNum; j++)
            {
                IntPtr currentPtr = new IntPtr(ser.pstuChannnelInfo.ToInt64() + (j * channelInfoSize));//获取数组偏移指针
                NET_CHANNEL_INFO channelInfo = (NET_CHANNEL_INFO)Marshal.PtrToStructure(currentPtr, typeof(NET_CHANNEL_INFO));//获取指针对象
                DataRow dr = dt.NewRow();
                dr["id"] = j + 1;//通道id
                dr["videoInputID"] = channelInfo.szID;//通道编号
                dt.Rows.Add(dr);
            }
            return dt;
        }

海康部分代码

public string XML透传(string Url, string Param = "")
        {
            CHCNetSDK.NET_DVR_XML_CONFIG_INPUT pInputXml = new CHCNetSDK.NET_DVR_XML_CONFIG_INPUT(); //XML透传接口
            Int32 nInSize = Marshal.SizeOf(pInputXml);
            pInputXml.dwSize = (uint)nInSize;//设置大小

            string strRequestUrl = Url;//设置url
            uint dwRequestUrlLen = (uint)strRequestUrl.Length;//url长度
            pInputXml.lpRequestUrl = Marshal.StringToHGlobalAnsi(strRequestUrl);//请求信令
            pInputXml.dwRequestUrlLen = dwRequestUrlLen;//设置长度

            string strInputParam = Param;//设置参数
            pInputXml.lpInBuffer = Marshal.StringToHGlobalAnsi(strInputParam);//设置缓冲区
            pInputXml.dwInBufferSize = (uint)strInputParam.Length;//设置缓冲区大小

            CHCNetSDK.NET_DVR_XML_CONFIG_OUTPUT pOutputXml = new CHCNetSDK.NET_DVR_XML_CONFIG_OUTPUT();
            pOutputXml.dwSize = (uint)Marshal.SizeOf(pInputXml);//结构体大小
            pOutputXml.lpOutBuffer = Marshal.AllocHGlobal(3 * 1024 * 1024);//输出参数缓冲区
            pOutputXml.dwOutBufferSize = 3 * 1024 * 1024;//输出参数缓冲区大小
            pOutputXml.lpStatusBuffer = Marshal.AllocHGlobal(4096 * 4);//返回的状态参数
            pOutputXml.dwStatusSize = 4096 * 4; //状态缓冲区大小(内存大小) 

            //透传
            if (!CHCNetSDK.NET_DVR_STDXMLConfig(m_lUserID, ref pInputXml, ref pOutputXml))
            {
                uint iLastErr = CHCNetSDK.NET_DVR_GetLastError();//失败
                MessageBox.Show("错误号 = " + iLastErr);//XML透传失败,输出错误号
            }

            //获取输出
            uint iXMSize = pOutputXml.dwReturnedXMLSize;
            byte[] managedArray = new byte[iXMSize];
            Marshal.Copy(pOutputXml.lpOutBuffer, managedArray, 0, (int)iXMSize);
            string jg = Encoding.UTF8.GetString(managedArray);
            //释放资源
            Marshal.FreeHGlobal(pInputXml.lpRequestUrl);
            Marshal.FreeHGlobal(pOutputXml.lpOutBuffer);
            Marshal.FreeHGlobal(pOutputXml.lpStatusBuffer);
            return jg;
        }

软件截图:

标签:NVR,C#,pInputXml,pOutputXml,GB28181,uint,NET,Marshal,string
From: https://blog.csdn.net/threadroc/article/details/139704756

相关文章

  • 原子操作 CAS
    假定有两个操作A和B,如果从执行A的线程来看,当另一个线程执行B时,要么将B全部执行完,要么完全不执行B,那么A和B对彼此来说是原子的。synchronized关键字是基于阻塞的锁机制,也就是说当一个线程拥有锁的时候,访问同一资源的其它线程需要等待,直到该线程释放锁CAS操作如......
  • 2024-06-15:用go语言,Alice 和 Bob 在一个环形草地上玩一个回合制游戏。 草地上分布着一
    2024-06-15:用go语言,Alice和Bob在一个环形草地上玩一个回合制游戏。草地上分布着一些鲜花,其中Alice到Bob之间顺时针方向有x朵鲜花,逆时针方向有y朵鲜花。游戏规则如下:1.游戏从Alice开始。2.每个回合中,当前玩家必须选择顺时针或逆时针,并在所选方向上摘取一朵鲜花。......
  • Codeforces Round 947 (Div. 1 + Div. 2)
    发现今天做不了一点题,遂来补以前的比赛。B.378QAQandMocha'sArray秒了。排序,取最小的数记为\(x\),再取最小的无法被\(x\)整除的数记为\(y\),如果仍然存在无法被\(y\)整除的数,则无解。C.ChamoandMocha'sArray容易想到一个结论:如果一个数比它左边或右边的数小,那么......
  • ElasticJob浅谈
    ElasticJob浅谈1什么是Elastic-JobElastic-Job是当当网开源的一个分布式调度解决方案,基于Quartz二次开发的,由两个相互独立的子项目ElasticJob-Lite和Elastic-Job-Cloud组成。Elastic-Job-Lite,它定位为轻量级无中心化解决方案,使用Jar包的形式提供分布式任务的协调服务,而Elastic-......
  • 哪些产品需要进行EMC测试?
       1.多媒体设备信息技术设备:具有数据和/或电信消息的输入,存储,显示,检索,传输,处理或控制(或组合),并且可能配备有一个或多个通常用于信息传输的端口等功能的设备,如,笔记本电脑等音频设备:具有音频信号的生成,输入,存储,播放,检索,传输,接收,放大,处理,切换或控制(或其组合)等功能的设备,......
  • 从CF1879D学习一类区间贡献题思路
    https://codeforces.com/contest/1879/problem/D关键在于互换两个\(\sum\)​的顺序一般像这样计算所有子区间的式子,如果要优化成接近线性,有一种可行思路是把注意力放在右端点,通过不断移动右端点,在移动的时候利用前面的统计结果算出移动右端点后的结果,从而得出所有子区间的答......
  • synchronized内置锁和volatile关键字
    synchronized内置锁对象锁和类锁:对象锁是用于对象实例方法,或者一个对象实例上的,类锁是用于类的静态方法或者一个类的class对象上的。我们知道,类的对象实例可以有很多个,但是每个类只有一个class对象,所以不同对象实例的对象锁是互不干扰的,但是每个类只有一个类锁。但是有一点......
  • 【弹孔计数】机器视觉弹孔检测计数(开闭运算 canny算子)【含GUI Matlab源码 4679期】
    ✅博主简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,Matlab项目合作可私信。......
  • pytorch学习:安装Anaconda
    安装Anaconda网址Anaconda|TheOperatingSystemforAI然后去邮箱点下载链接(但是为最新版本)建议从下面开始:下载网址推荐历史版本:Anaconda|TheOperatingSystemforAI(更加稳定)不要太新的版本,自己需求选择系统安装鼠标右键管理员身份运行选好自己的路径,......
  • CSS动画(登录页面)
    1.整体效果https://mmbiz.qpic.cn/sz_mmbiz_gif/EGZdlrTDJa6Pfop3IiakrZOtiaiaKniaxeH2Gs407DmkXPsMo8AFKdsYibYcpZiboc24Ulic2CicmyvHmnwCrib7MDe6Jvg/640?wx_fmt=gif&from=appmsg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=12.完整代码HTML<!DOCTYPEhtml>......