视频监控平台:通过网络SDK对TCL网络摄像机进行PTZ控制 的源代码介绍及分享

news2024/11/27 0:39:36

目录

一、视频监控平台介绍

(一)概述

(二)视频接入能力介绍

(三)功能介绍

二、TCL网络摄像机

(一)360度全景自动旋转:

(二)高清夜视和全彩夜视:

(三)自动巡航和定点追踪:

(四)存储方式:

(五)多种像素选择:

(六)网络连接:

(七)其他功能:

三、代码和解释

(一)代码和注释

(二)函数功能说明

1、函数的参数

2、主体部分和分支

(1)第一个分支:设置或调用预置位

(2)第二个分支:停止移动

(3)第三个分支:平移和缩放

(4)补充说明

(三)结束

四、效果展示

(一)正常浏览实时视频

(二)PTZ向上移动

(三)PTZ调节镜头


一、视频监控平台介绍

(一)概述

        威迪斯特视频监控接入平台AS-V1000,也可以称为:视频监控综合资源管理平台,视频监控平台,视频监控汇聚平台(或视频监控汇集平台),视频监控管理平台,视频监控综合管理平台,是一套集成了用户设备权限管理、视音频监控、大容量存储、电子地图的系统平台软件。它结合了现代视频技术、网络通讯技术、计算机控制技术、流媒体传输技术的综合解决方案,为用户提供了强大的、灵活的组网和应用能力。

(二)视频接入能力介绍

        系统平台能够实现接入不同品牌的视频监控平台、视频相关设备、外围设备等等;支持国际和国内的一些标准对接协议,包括sdk协议、GB/T28181协议、ehome协议等等。可以通过各种协议,接入IPC、DVR、DVS、NVR等设备,以及一些大型的视频监控平台,包括海康威视、浙江大华、苏州科达、杭州宇视等主流品牌的监控平台,对于有些特有品牌的平台, 也能够通过SDK接口、私有协议等方式接入进入本系统平台(国外品牌包括:Panasonicaxis);反过来,本平台也提供开放接口,能够接入到其他标准或者非标准的平台。

        前面有篇文章:《AS-V1000平台使用SDK的方式接入监控设备》,有兴趣可以查看。       

(三)功能介绍

        平台实现了丰富的功能,包含:实时多媒体数据转发和管理、移动流媒体转发管理、不间断录像、录像文件检索和回放、录像下载、设备状态管理、系统报警管理、视频转码、视频点播等等;整个平台具备稳定可靠、使用安全、兼容性强、接口开放、服务可堆叠、服务可多级级联、系统可平滑扩容等特点。

二、TCL网络摄像机

        TCL网络摄像机是一款网络监控设备,它具备视频捕捉、编码、存储和网络传输等功能。用户可以通过网络远程访问这些摄像机,实现实时监控。TCL作为一家知名的家电及通讯设备制造商,其网络摄像机产品通常会具备一些特色功能,如高清视频、夜视功能、移动侦测、云存储等,以满足家庭、企业及商用安全监控的需求。

        以下概要介绍一下TCL网络摄像机的一些主要特点和信息。

(一)360度全景自动旋转:

        TCL的部分网络摄像机支持360度全景自动旋转,这使得它们能够无死角地监控周围环境。不论是室内还是室外,用户都可以通过摄像头全方位地观察。

(二)高清夜视和全彩夜视:

        TCL网络摄像机提供了高清夜视和全彩夜视功能,确保在夜晚也能提供清晰而细腻的图像。这对于室外监控尤为重要,用户即使在黑暗中也能监控到重要情况。

(三)自动巡航和定点追踪:

        一些TCL网络摄像机具备自动巡航和定点追踪功能。它们可以根据用户的设定,在预设的区域内进行自动巡航,确保所有角落都被监控到。同时,它们还能够通过智能识别技术,实现目标的准确定位和追踪。

(四)存储方式:

        TCL网络摄像机支持云存储和扩展存储卡,用户可以根据实际需求选择合适的存储方式。云存储可以帮助用户远程访问摄像头的录像内容,而扩展存储卡则提供了更大的存储空间。

(五)多种像素选择:

        TCL网络摄像机提供了多种像素选择,如300万、400万、500万、800万等,用户可以根据监控需求选择合适的像素。

(六)网络连接:

        TCL网络摄像机支持无线Wi-Fi和有线网络连接,用户可以根据实际情况选择合适的连接方式。

(七)其他功能:

        除了上述主要功能外,TCL网络摄像机还可能具备语音对讲、手机远程查看、移动检测、声光报警等功能,以满足不同用户的需求。

三、代码和解释

        这里共享一段C++代码,代码定义了一个名为CNetSdkForTclIPC::ZXPtzControl的类函数,该类用于通过TCL网络摄像机的SDK来控制TCL网络摄像机的云台和镜头。

(一)代码和注释

        以下是为代码和注释:

int CNetSdkForTclIPC::ZXPtzControl(long LoginID, int channelid, int opt, int param1, TExtPtzInfo *pExtPtzInfo)
{
    // 定义一些变量,用于存储函数执行的结果和参数
    TC_S32 retcode = 0; // 用于存储返回码
    TC_U32 rspparam = 0; // 用于存储返回参数

    // 定义一些变量,用于存储PTZ命令和相关参数
    CM_PTZ_E ptz_cmd = PTZ_CTRL_NONE; // PTZ命令枚举,初始值为无命令
    bool bstop = false; // 停止标志位,初始值为false
    int iparam1 = param1; // 参数1的副本,用于后续计算

    // 根据opt的值,判断是否执行PTZ位置设置等操作
    if (opt == PTZ_OPT_POS_SET || opt == PTZ_OPT_POS_CALL || opt == PTZ_OPT_POS_CLEAR || opt == PTZ_OPT_ASS || opt == PTZ_OPT_WASH)
    {
        // 根据不同的opt值,设置相应的PTZ命令
        if (opt == PTZ_OPT_ASS)
            ptz_cmd = PTZ_CTRL_LIGHT;
        else if (opt == PTZ_OPT_WASH)
            ptz_cmd = PTZ_CTRL_WIPER;
        else if (opt == PTZ_OPT_POS_SET)
            ptz_cmd = PTZ_CTRL_SAVE_PRESET;
        else if (opt == PTZ_OPT_POS_CLEAR)
            ptz_cmd = PTZ_CTRL_CALL_PRESET; // 注意:这里没有执行清除操作
        else
            ptz_cmd = PTZ_CTRL_CALL_PRESET;

        // 构造PTZ请求结构体
        CM_PTZ PtzReq;
        PtzReq.channel = channelid - 1; // 通道ID减1,可能是由于内部处理需要
        PtzReq.ptz_cmd = (TC_U32)ptz_cmd; // 将PTZ命令转换为适合传输的数据类型
        PtzReq.param1 = iparam1; // 设置参数1
        PtzReq.param2 = 0; // 设置参数2为速度,这里默认为0
        PtzReq.stop = bstop == true ? 1 : 0; // 设置停止标志位

        // 发送PTZ控制命令
        HandleCmd(CM_CMD_PTZ_CTRL, (char*)&PtzReq, sizeof(PtzReq), retcode, rspparam);

        return 0; // 成功执行PTZ控制命令
    }

    // 根据opt的值,判断是否执行停止移动等操作
    if (opt == PTZ_OPT_UP_STOP || opt == PTZ_OPT_DOWN_STOP || opt == PTZ_OPT_LEFT_STOP || opt == PTZ_OPT_RIGHT_STOP ||
        opt == PTZ_OPT_UL_STOP || opt == PTZ_OPT_DL_STOP || opt == PTZ_OPT_UR_STOP || opt == PTZ_OPT_DR_STOP ||
        opt == PTZ_OPT_ZOOMIN_STOP || opt == PTZ_OPT_ZOOMOUT_STOP || opt == PTZ_OPT_FOCUSNEAR_STOP || opt == PTZ_OPT_FOCUSFAR_STOP ||
        opt == PTZ_OPT_IRISOPEN_STOP || opt == PTZ_OPT_IRISCLOSE_STOP)
    {
        // 设置停止标志位为true
        bstop = true;
    }

    // 根据opt的值,判断是否执行平移和缩放等操作
    if (opt == PTZ_OPT_UP || opt == PTZ_OPT_UP_STOP)
    {
        ptz_cmd = PTZ_CTRL_UP;
    }
    else if (opt == PTZ_OPT_DOWN || opt == PTZ_OPT_DOWN_STOP)
    {
        ptz_cmd = PTZ_CTRL_DOWN;
    }
    else if (opt == PTZ_OPT_LEFT || opt == PTZ_OPT_LEFT_STOP)
    {
        ptz_cmd = PTZ_CTRL_LEFT;
    }
    else if (opt == PTZ_OPT_RIGHT || opt == PTZ_OPT_RIGHT_STOP)
    {
        ptz_cmd = PTZ_CTRL_RIGHT;
    }
    else if (opt == PTZ_OPT_UL || opt == PTZ_OPT_UL_STOP)
    {
        ptz_cmd = PTZ_CTRL_LEFT_UP;
    }
    else if (opt == PTZ_OPT_DL || opt == PTZ_OPT_DL_STOP)
    {
        ptz_cmd = PTZ_CTRL_LEFT_DOWN;
    }
    else if (opt == PTZ_OPT_UR || opt == PTZ_OPT_UR_STOP)
    {
        ptz_cmd = PTZ_CTRL_RIGHT_UP;
    }
    else if (opt == PTZ_OPT_DR || opt == PTZ_OPT_DR_STOP)
    {
        ptz_cmd = PTZ_CTRL_RIGHT_DOWN;
    }
    else if (opt == PTZ_OPT_ZOOMIN || opt == PTZ_OPT_ZOOMIN_STOP)
    {
        ptz_cmd = PTZ_CTRL_ZOOM_TELE;
    }
    else if (opt == PTZ_OPT_ZOOMOUT || opt == PTZ_OPT_ZOOMOUT_STOP)
    {
        ptz_cmd = PTZ_CTRL_ZOOM_WIDE;
    }
    else if (opt == PTZ_OPT_FOCUSNEAR || opt == PTZ_OPT_FOCUSNEAR_STOP)
    {
        ptz_cmd = PTZ_CTRL_FOCUS_NEAR;
    }
    else if (opt == PTZ_OPT_FOCUSFAR || opt == PTZ_OPT_FOCUSFAR_STOP)
    {
        ptz_cmd = PTZ_CTRL_FOCUS_FAR;
    }
    else if (opt == PTZ_OPT_IRISOPEN || opt == PTZ_OPT_IRISOPEN_STOP)
    {
        ptz_cmd = PTZ_CTRL_IRIS_OPEN;
    }
    else if (opt == PTZ_OPT_IRISCLOSE || opt == PTZ_OPT_IRISCLOSE_STOP)
    {
        ptz_cmd = PTZ_CTRL_IRIS_CLOSE;
    }

    // 如果ptz_cmd不为PTZ_CTRL_NONE,则执行PTZ移动操作
    if (ptz_cmd != PTZ_CTRL_NONE)
    {
        // 对于缩放、聚焦近、聚焦远和光圈打开、关闭的操作,需要对参数1进行转换
        if (opt == PTZ_OPT_ZOOMIN || opt == PTZ_OPT_ZOOMOUT ||
            opt == PTZ_OPT_FOCUSNEAR || opt == PTZ_OPT_FOCUSFAR ||
            opt == PTZ_OPT_IRISOPEN || opt == PTZ_OPT_IRISCLOSE)
        {
            iparam1 = (unsigned int)((iparam1 * 1.0 / 15.0) * 7.0);
        }
        else
        {
            iparam1 = (unsigned int)((iparam1 * 1.0 / 255.0) * 7.0);
        }

        // 构造PTZ请求结构体
        CM_PTZ PtzReq;
        PtzReq.channel = channelid - 1;
        PtzReq.ptz_cmd = (TC_U32)ptz_cmd;
        PtzReq.param1 = 0;
        PtzReq.param2 = iparam1; // 设置参数2为速度
        PtzReq.stop = bstop == true ? 1 : 0;
        // 发送PTZ请求到控制服务器
        if (ptz_cmd == PTZ_CTRL_UP || ptz_cmd == PTZ_CTRL_DOWN ||
            ptz_cmd == PTZ_CTRL_LEFT || ptz_cmd == PTZ_CTRL_RIGHT ||
            ptz_cmd == PTZ_CTRL_LEFT_UP || ptz_cmd == PTZ_CTRL_LEFT_DOWN ||
            ptz_cmd == PTZ_CTRL_RIGHT_UP || ptz_cmd == PTZ_CTRL_RIGHT_DOWN)
        {
            PtzReq.param2 = iparam1; // 设置参数2为速度
        }
        else
        {
            PtzReq.param2 = 0;
        }

        // 发送PTZ控制命令
        ret = send_ptz_cmd(&PtzReq);
        if (ret != 0)
        {
            printf("发送PTZ控制命令失败, 错误码: %d\n", ret);
            return -1;
        }
    }

    return 0;
}

(二)函数功能说明

        这段代码是视频监控系统的一部分,用于实现对摄像头PTZ功能的编程控制。具体的讲,这段C++代码定义了一个名为CNetSdkForTclIPC的类的成员函数ZXPtzControl,该函数用于控制远程设备的PTZPan-Tilt-Zoom,即变焦)功能。PTZ是视频监控摄像头常见的功能,允许用户远程控制摄像头的方向和焦距。

1、函数的参数

函数ZXPtzControl的参数如下:

  • LoginID:一个长整型参数,可能代表登录会话ID。
  • channelid:一个整型参数,代表要控制的通道ID。
  • opt:一个整型参数,代表控制命令的类型。
  • param1:一个整型参数,代表控制命令的附加参数。
  • pExtPtzInfo:一个指向TExtPtzInfo结构的指针,可能用于传递额外的PTZ信息。

2、主体部分和分支

函数的主体部分分为多个分支,根据opt参数的值来确定具体的PTZ控制命令。

首先,代码定义了几个变量,包括TC_S32类型的retcoderspparam,以及TC_U32类型的rspparam。这些变量用于存储函数执行后的返回码和参数。

接下来,根据opt的值,函数进行了多个分支判断:

(1)第一个分支:设置或调用预置位

        处理PTZ_OPT_POS_SET、PTZ_OPT_POS_CALLPTZ_OPT_POS_CLEAR

PTZ_OPT_ASSPTZ_OPT_WASH这几个命令。这些命令与设置或调用预设的PTZ位置相关。

(2)第二个分支:停止移动

        处理停止移动的命令,如PTZ_OPT_UP_STOPPTZ_OPT_DOWN_STOP等。在这个分支中,bstop变量被设置为true

(3)第三个分支:平移和缩放

        处理平移和缩放的命令,如PTZ_OPT_UPPTZ_OPT_DOWNPTZ_OPT_LEFT等。在这个分支中,根据命令类型设置ptz_cmd变量,然后构建一个CM_PTZ结构,包含通道IDPTZ命令、参数和停止标志,并调用HandleCmd函数发送PTZ控制命令。

(4)补充说明

        在处理平移和缩放命令的分支中,如果命令是PTZ_OPT_ZOOMIN、

PTZ_OPT_ZOOMOUT、PTZ_OPT_FOCUSNEARPTZ_OPT_FOCUSFARPTZ_OPT_IRISOPENPTZ_OPT_IRISCLOSE,参数param1会根据一定的比例进行转换,然后设置到CM_PTZ结构的param2字段,这个字段可能代表速度或者开度等。

(三)结束

        最后,函数返回0,表示控制命令已成功处理。

四、效果展示

(一)正常浏览实时视频

        可以通过视频监控平台的web客户端,查看TCL的视频图像,如下图示:

(二)PTZ向上移动

        对视频图像的云台,往上移动一点,效果如下:

(三)PTZ调节镜头

        然后,调节PTZ的 “镜头变倍+”,如下图示:

        调整后效果如下:


文章正下方可以看到我的联系方式:鼠标“点击” 下面的 “威迪斯特-就是video system 微信名片”字样,就会出现我的二维码,欢迎沟通探讨。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1833471.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

五、路由协议

目录 一、为何划分子网? 二、静态路由 三、OSPF 3.1、OSPF原理 3.1.1、ospf四步过程 3.2、OSPF区域划分 3.2.1、为什么划区域? 3.2.2、划分规则 3.3、OSPF参数 3.4、五种报文 3.4.1、hello报文 3.4.2、DD报文 3.4.2、LSR、LSU、LSAck报文 3…

黄仁勋:下一波AI的浪潮是物理AI

B站:啥都会一点的研究生公众号:啥都会一点的研究生 最近AI圈又发生了啥? 快手视频生成大模型“可灵”开放邀测,效果对标 Sora 在OpenAl文生视频大模型Sora发布后,国内企业争相入局,快手视频生成大模型可…

MySQL之优化服务器设置和复制(一)

优化服务器设置 操作系统状态 CPU密集型的机器 CPU密集型服务器的vmstat输出通常在us列会有一个很高的值,报告了花费在非内核代码上的CPU时钟;也可能在sy列有很高的值,表示系统CPU利用率,超过20%就足以令人不安了。在大部分情况下&#xff…

pyqt 鼠绘椭圆 椭圆标注

目录 pyqt 椭圆标注 四个方向可以调整,调整时,另一端固定,只调整当前端,椭圆参数保存加载json pyqt 画椭圆中心点固定,调整是,两端一起调整。 pyqt 椭圆标注 四个方向可以调整,调整时,另一端固定,只调整当前端,椭圆参数保存加载json import sys import json from …

React@16.x(32)useDebugValue

目录 1&#xff0c;介绍2&#xff0c;作用 1&#xff0c;介绍 从一个例子开始&#xff1a; export default function App() {const [n, setN] useState(0);const refH1 useRef();useEffect(() > {console.log("父组件");});return <h1 ref{refH1}>{n}&l…

C++语法02 输出语句与分隔

目录 标准输出语句 题目&#xff1a;小知的位置 小知的位置参考代码 如何输出算式的结果&#xff1f; 题目&#xff1a;难题 难题参考代码 如何分隔多个算式输出的内容&#xff1f; 题目&#xff1a;两道题目 两道题目参考代码 标准输出语句 标准输出指令&#xff1a…

一小时搞定JavaScript(1)——JS基础

前言,本篇文章是依据bilibili博主(波波酱老师)的学习笔记,波波酱老师讲的很好,很适合速成!!! 文章目录 1.基本语法1.1 JS语言的特点1.2 创建一个JS文件1.3 输入与输出1.4 变量1.4.1 命名规则1.4.2 变量声明数字类型字符串类型布尔类型未定义类型 1.4.3 类型转换隐式转换显示转…

【html】如何利用id选择器实现主题切换

今天给大家介绍一种方法来实现主题切换的效果 效果图&#xff1a; 源码&#xff1a; <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initia…

【Linux 12】进程控制

文章目录 &#x1f308; Ⅰ 进程创建01. fork 函数介绍02. 写时拷贝03. fork 常规用法04. fork 调用失败的原因 &#x1f308; Ⅱ 进程终止01. 进程退出场景02. 常见退出方法 &#x1f308; Ⅲ 进程等待01. 进程等待必要性02. 进程等待的方法2.1 wait 方法2.2 waitpid 方法 03.…

AI大模型浪潮席卷而来,你准备好乘风破浪成为行业翘楚了吗?

揭秘AI大模型浪潮&#xff1a;你准备好乘风破浪了吗&#xff1f; 在繁华的都市中&#xff0c;程序员小李一直默默耕耘在代码的海洋中。然而&#xff0c;随着AI大模型技术的迅猛发展&#xff0c;他发现自己仿佛置身于一场没有硝烟的战争中。身边的同事纷纷掌握了新技术&#xf…

AI绘图StableDiffusion最强大模型盘点 - 诸神乱战

玩了这么久的StableDiffusion&#xff0c;Civitai和HF上的各种大模型和LORA也都基本玩了个遍。 自己也一直想做一期盘点&#xff0c;选出我自己心中最好或者最有意思的那几个大模型。 毕竟每次看着模型库里几十个大模型&#xff0c;是个人都遭不住。 我在这篇文章中&#xf…

C++之模板(一)

1、为什么需要模板 将具有相同逻辑的一段代码提供一份模板&#xff0c;当我们需要处理不同类型的时候&#xff0c;可以通过数据类型当作参数来传递&#xff0c;从而实例化出对应类型的处理版本。 2、模板的定义 也是一种静态多态。 3、模板的分类 4、函数模板 5、函数模板的使…

大模型企业落地:汽车行业知识大模型应用

前言 在当今这个信息爆炸的时代&#xff0c;知识管理成为了企业提升核心竞争力的关键。特别是在汽车行业这样一个技术密集、信息量庞大的领域&#xff0c;如何高效管理和利用知识资源&#xff0c;成为了每个企业必须面对的挑战。 汽车行业的知识管理痛点 汽车行业作为现代工…

百货商场:打造品质生活

走进我们的百货商场&#xff0c;仿佛置身于一个五彩斑斓的梦幻世界。百货&#xff0c;不仅仅是购物的场所&#xff0c;更是一种品质生活的体验。 在这里&#xff0c;您可以找到最适合自己的商品选择。从家居用品到时尚服饰&#xff0c;从美食佳肴到美妆护肤&#xff0c;每一样商…

多态深度剖析

前言 继承是多态的基础&#xff0c; 如果对于继承的知识还不够了解&#xff0c; 可以去阅读上一篇文章 继承深度剖析 基本概念与定义 概念&#xff1a; 通俗来说&#xff0c;就是多种形态。具体点就是去完成某个行为&#xff0c; 当不同的对象去完成时会产生出不同的状…

数据资产入表-数据分级分类标准-数据分类

2021年9月1日&#xff0c;《中华人民共和国数据安全法》正式施行&#xff0c;明确规定“国家建立数据分类分级保护制度”&#xff0c;数据分级分类是数据安全管理的重要措施&#xff0c;它涉及到对数据资产的识别、分类和定级&#xff0c;是保障数据合规的前提。 数据分类&…

物联网主机 E6000 在智慧工地上的应用

随着科技的不断发展&#xff0c;智慧工地的概念逐渐普及。物联网技术的应用为工地管理带来了革命性的变化&#xff0c;物联网主机E6000作为一款领先的物联网主机设备&#xff0c;在智慧工地上发挥着重要作用。 物联网主机 E6000 是一种集成了多种传感器和通信技术的设备。支持融…

探秘提交任务到线程池后源码的执行流程

探秘提交任务到线程池后源码的执行流程 1、背景2、任务提交2、Worker线程获取任务执行流程3、Worker线程的退出时机1、背景 2、任务提交 线程池任务提交有两种方式,execute()和submit()。首先看一下execute方法的源码。我们发现它接收的入参是一个Runnable类型。我们按照代码…

小知识点快速总结:梯度爆炸和梯度消失的原理和解决方法

本系列文章只做简要总结&#xff0c;不详细说明原理和公式。 目录 1. 参考文章2. 反向梯度求导推导3. 具体分析3.1 梯度消失的原理3.2 梯度爆炸的原理 4. 解决方法 1. 参考文章 [1] shine-lee, "网络权重初始化方法总结&#xff08;上&#xff09;&#xff1a;梯度消失、…

NAND闪存市场彻底复苏

在全球内存市场逐渐走出阴霾、迎来复苏曙光之际&#xff0c;日本存储巨头铠侠&#xff08;Kioxia&#xff09;凭借敏锐的市场洞察力和及时的战略调整&#xff0c;成功实现了从生产紧缩到全面复苏的华丽转身。这一转变不仅彰显了企业在逆境中的生存智慧&#xff0c;也为全球半导…