视频监控相关笔记

一、QT 之 QTreeWidget 树形控件

Qt编程指南,Qt新手教程,Qt Programming Guide

一个树形结构的节点中的图表文本 、附带数据的添加:

QTreeWidgetItem* TourTreeWnd::InsertNode(NetNodeInfo node, QTreeWidgetItem* parent_item)  
{  
    // 创建一个QVariant对象,用于存储NetNodeInfo类型的node  
    QVariant var;  
    var.setValue(node);  
  
    // 初始化一个指向QTreeWidgetItem的指针,用于存储新创建的节点  
    QTreeWidgetItem* Item = NULL;  
  
    // 检查parent_item是否为NULL,如果是,则表示要插入的节点是顶级节点  
    if (parent_item == NULL) {  
        // 为顶级节点创建一个新的QTreeWidgetItem对象  
        Item = new QTreeWidgetItem(m_tree.get());  
        // 设置新节点的第一个列的文本为node的Name属性  
        Item->setText(0, (QString)node.Name);  
        // 设置新节点的第一个列的工具提示与文本相同  
        Item->setToolTip(0, Item->text(0));  
        // 将新节点作为顶级节点添加到树形控件中  
        m_tree->addTopLevelItem(Item);  
  
        // 根据node的类型设置图标  
        // 如果节点类型是NodeType_TOURTASK,则使用特定类型的图标  
        if (node.Type == NodeType::NodeType_TOURTASK) {  
            Item->setIcon(0, QIcon(GetIconByNodetype(node.Type)));  
        }  
        // 注意:这里没有处理非NodeType_TOURTASK类型顶级节点的图标设置,可能是个遗漏  
  
        // 将QVariant对象var作为用户自定义数据存储在节点的第一个列上  
        Item->setData(0, Qt::UserRole, var);  
        // 设置节点第一个列的大小提示为30x30  
        Item->setSizeHint(0, QSize(30, 30));  
    }  
    // 如果parent_item不为NULL,则表示要插入的节点是子节点  
    else {  
        // 为子节点创建一个新的QTreeWidgetItem对象,并指定parent_item为其父节点  
        Item = new QTreeWidgetItem(parent_item);  
        // 设置子节点的大小提示为30x30  
        Item->setSizeHint(0, QSize(30, 30));  
        // 设置子节点的第一个列的文本为node的Name属性  
        Item->setText(0, (QString)node.Name);  
        // 设置子节点的第一个列的工具提示与文本相同  
        Item->setToolTip(0, Item->text(0));  
  
        // 根据node的类型或设备状态设置图标  
        // 如果节点类型是NodeType_DEVICE,则根据设备主类型、子类型和状态获取图标  
        if (node.Type == NodeType::NodeType_DEVICE) {  
            Item->setIcon(0, QIcon(GetIconByDevStatus(node.DevMainType, node.DevSubType, node.Status)));  
        }  
        // 如果不是NodeType_DEVICE类型,则根据节点类型获取图标  
        else {  
            Item->setIcon(0, QIcon(GetIconByNodetype(node.Type)));  
        }  
        // 将QVariant对象var作为用户自定义数据存储在节点的第一个列上  
        Item->setData(0, Qt::UserRole, var);  
    }  
  
    // 显示树形控件(通常不是必需的,因为可能在其他地方已经设置为可见)  
    m_tree->show();  
    // 展开树形控件中的所有节点,以便新插入的节点可见  
    m_tree->expandAll();  
  
    // 返回新创建的节点指针,以便调用者可以使用它  
    return Item;  
}

其中注意以下几点:

二、视频播放

1. 主辅码流区别

2.  RTSP

3.  SDK的调用案例:

#pragma once

#include <memory>
#ifdef _WINDOWS
#include <Windows.h>
#ifdef  LIBRTSPCLINET_SDK_EXPORTS
#define LIBRTSPCLINET_API __declspec(dllexport)
#else
#define LIBRTSPCLINET_API __declspec(dllimport)
#endif
#else  
#define LIBRTSPCLINET_API
#endif

#include "Common.h"

using namespace std;

class LIBRTSPCLINET_API LibRtspClientManager
{
public:
    static LibRtspClientManager& getInstance() {
        static LibRtspClientManager instance;
        return instance;
    }

    /* @ 初始化SDK:
       @ 参数:
        onLibRtspClientDateCB 数据回调函数地址
        onLibRtspClientMsgCB  消息回调函数地址
       @ 返回: bool
    */
    bool Init();

    /* @ 反初始化SDK:
       @ 参数:
       @ 返回: void
    */
    void UnInit();

    /* @ 创建RTSP Client:
       @ 参数:
            std::string url : rtsp url
            TransProtocol trans_protocol : 0-udp, 1-tcp
            int timeout : 超时时间,单位秒
       @ 返回: int32_t rtsp session id
    */
    uint32_t CreateRtspClient(std::string url,
        std::string username, std::string password,
        TransProtocol trans_protocol, RtspCallBack* callback, int timeout);

    bool ReleaseRtspClient(uint32_t session_id);

    /* @ 连接服务器
     * @ 异步通知,rtsp连接情况在onLibRtspClientMsgCB反馈
    */
    bool Connect(uint32_t session_id);

    bool Play(uint32_t session_id, std::string params_json);

    bool Control(uint32_t session_id, std::string params_json);

    bool Pause(uint32_t session_id);

    // 恢复播放
    bool Resume(uint32_t session_id);

    // 从指定位置恢复播放
    bool Resume(uint32_t session_id, float npt);

    bool Stop(uint32_t session_id);

    void WaitForStop(uint32_t session_id);
private:
    LibRtspClientManager();

    virtual ~LibRtspClientManager();

    class LibRtspClientPriv;
    std::shared_ptr<LibRtspClientPriv> m_priv;
};

4. 一个webSocket第三方库;easywsclient.hpp   easywsclient.cpp  

Easywsclient: 强大且简单的C++ WebSocket客户端库-CSDN博客

下文代码摘自gitcode.com中: 

#include "easywsclient.hpp"
//#include "easywsclient.cpp" // <-- include only if you don't want compile separately
#ifdef _WIN32
#pragma comment( lib, "ws2_32" )
#include <WinSock2.h>
#endif
#include <assert.h>
#include <stdio.h>
#include <string>

using easywsclient::WebSocket;
static WebSocket::pointer ws = NULL;

void handle_message(const std::string & message)
{
    printf(">>> %s\n", message.c_str());
    if (message == "world") { ws->close(); }
}

int main()
{
#ifdef _WIN32
    INT rc;
    WSADATA wsaData;

    rc = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (rc) {
        printf("WSAStartup Failed.\n");
        return 1;
    }
#endif

    ws = WebSocket::from_url("ws://localhost:8126/foo");
    assert(ws);
    ws->send("goodbye");
    ws->send("hello");
    while (ws->getReadyState() != WebSocket::CLOSED) {
      ws->poll();
      ws->dispatch(handle_message);
    }
    delete ws;
#ifdef _WIN32
    WSACleanup();
#endif
    return 0;
}

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

asp.net core日志与异常处理小结

asp.net core的webApplicationBuilder中自带了一个日志组件,无需手动注册服务就能直接在控制器中构造注入&#xff0c;本文主要介绍了net core日志与异常处理小结&#xff0c;需要的朋友可以参考下 ILogger简单使用 asp.net core的webApplicationBuilder中自带了一个日志组件…

Redis的一些数据类型(一)

&#xff08;一&#xff09;数据类型 我们说redis是key value键值对的方式存储数据&#xff0c;key是字符串&#xff0c;而value是一些数据结构,那今天就来说一下value存储的数据。 我们数据结构包含&#xff0c;String&#xff0c;hash&#xff0c;list&#xff0c;set和zest但…

新手卖家做跨境电商,选择Shopee还是亚马逊?

对于刚刚涉足跨境电商领域的新人来说&#xff0c;选择合适的电商平台是迈出成功第一步的关键。目前最主流的跨境平台一定是亚马逊&#xff0c;平台覆盖全球各个市场&#xff0c;利润高&#xff0c;但门槛也高。Shopee主要面向的是东南亚市场&#xff0c;商品一般更有性价比&…

LabVIEW界面输入值设为默认值

在LabVIEW中&#xff0c;将前面板上所有控件的当前输入值设为默认值&#xff0c;可以通过以下步骤实现&#xff1a; 使用控件属性节点&#xff1a;你可以创建一个属性节点来获取所有控件的引用。 右键点击控件&#xff0c;选择“创建” > “属性节点”。 设置属性节点为“D…

Unity开发绘画板——02.创建项目

1.创建Unity工程 我们创建一个名为 DrawingBoard 的工程&#xff0c;然后先把必要的工程目录都创建一下&#xff1a; 主要包含了一下几个文件夹&#xff1a; Scripts &#xff1a;存放我们的代码文件 Scenes &#xff1a;工程默认会创建的&#xff0c;存放场景文件 Shaders &…

加固与脱壳01 - 环境搭建

虚拟机 VMWare 多平台可用&#xff0c;而且可以直接激活&#xff0c;需要先注册一个账号 https://support.broadcom.com/group/ecx/productdownloads?subfamilyVMwareWorkstationPro KALI 类Ubuntu系统&#xff0c;官方提供了 vmware 版本&#xff0c;直接下载就可以使用。…

关于安卓App自动化测试的一些想法

安卓App自动化一般使用PythonAppium。页面元素通常是使用AndroidStudio中的UI Automator Viewer工具来进行页面元素的追踪。但是这里涉及到一个问题就是&#xff0c;安卓apk在每次打包的时候&#xff0c;会进行页面的混淆以及加固&#xff0c;所以导致每次apk打包之后会出现页面…

[Linux]用户管理指令

开机/重启/登录/注销 进入xhsell 或者虚拟系统中, 右键桌面打开终端, 在终端执行命令, 重启或关机linux系统 建议使用普通账号登录, 如果权限不够时, 使用 su - 用户名 命令切换到超管, 然后再使用 logout命令退回到普通账号, logout 不能在图形界面的终端中使用 用户管理 Li…

网络信息传输安全

目录 机密性-加密 对称加密 非对称加密 身份认证 摘要算法和数据完整性 数字签名 签名验签 数字证书 申请数字证书所需信息 数字证书的生成 数字证书的应用 https协议 数字证书的申请 数据在网络中传输过程中&#xff0c;怎么做到 数据没有被篡改&#xff1f;hash算…

基于PHP的新闻管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于phpMySQL的新闻管理系统。…

[js逆向学习] fastmoss电商网站——店铺排名

逆向目标 网站&#xff1a;https://www.fastmoss.com/shop-marketing/tiktok接口&#xff1a;https://www.fastmoss.com/api/shop/shopList/参数&#xff1a;fm-sign 逆向分析 我们今天要分析的是店铺排名&#xff0c;先分析网络请求&#xff0c;找到目标接口 按照上图操作…

JUC高并发编程2:Lock接口

1 synchronized 1.1 synchronized关键字回顾 synchronized 是 Java 中的一个关键字&#xff0c;用于实现线程间的同步。它提供了一种简单而有效的方式来控制对共享资源的访问&#xff0c;从而避免多个线程同时访问同一资源时可能出现的竞态条件&#xff08;race condition&am…

.net core8 使用JWT鉴权(附当前源码)

说明 该文章是属于OverallAuth2.0系列文章&#xff0c;每周更新一篇该系列文章&#xff08;从0到1完成系统开发&#xff09;。 该系统文章&#xff0c;我会尽量说的非常详细&#xff0c;做到不管新手、老手都能看懂。 说明&#xff1a;OverallAuth2.0 是一个简单、易懂、功能强…

LeetcodeTop100 刷题总结(二)

LeetCode 热题 100&#xff1a;https://leetcode.cn/studyplan/top-100-liked/ 文章目录 八、二叉树94. 二叉树的中序遍历&#xff08;递归与非递归&#xff09;补充&#xff1a;144. 二叉树的前序遍历&#xff08;递归与非递归&#xff09;补充&#xff1a;145. 二叉树的后序遍…

你的提交信息还在拖后腿?看这里,提升代码质量的绝招!

文章目录 前言一、什么是约定式提交&#xff1f;二、创建新仓库三、将代码推送到远程仓库的步骤1.检查当前远程仓库2.添加代码到暂存区3. 进行约定式提交4. 推送代码到远程仓库5. 完成推送 总结 前言 在当今软件开发领域&#xff0c;Git已经成为最广泛使用的版本控制系统之一。…

java算法OJ(1)位运算

目录 1.前言 2.正文 2.1位运算符号 2.1俩数相除 2.1.1题目 2.1.2示例 2.1.3题解 2.2二进制求和 2.2.1题目 2.2.2示例 2.2.3题解 2.3只出现一次的数字 2.3.1题目 2.3.2示例 2.3.3题解 2.4只出现一次的数字&#xff08;进阶版&#xff09; 2.4.1题目 2.4.2示例…

【ComfyUI】控制光照节点——ComfyUI-IC-Light-Native

原始代码&#xff08;非comfyui&#xff09;&#xff1a;https://github.com/lllyasviel/IC-Light comfyui实现1&#xff08;600星&#xff09;&#xff1a;https://github.com/kijai/ComfyUI-IC-Light comfyui实现2&#xff08;500星&#xff09;&#xff1a;https://github.c…

cobbler自动批量安装多版本操作系统

本次虚拟化环境为VMware Workstation Pro&#xff0c;cobbler服务端为CentOS7.9&#xff0c;需要自动安装的版本为CentOS7.9和CentOS8.1 目录 一、安装cobbler服务端1、修改YUM源2、关闭防火墙3、安装软件包4、cobbler环境配置5、解决语法问题6、启动服务7、导入镜像8、自定义…

Spring自定义参数解析器

在这篇文章中&#xff0c;我们认识了参数解析器和消息转换器&#xff0c;今天我们来自定义一个参数解析器。 自定义参数解析器 实现HandlerMethodArgumentResolver的类&#xff0c;并注册到Spring容器。 Component&#xff0f;&#xff0f;注册到Spring public class UserAr…

统信服务器操作系统【Cron定时任务服务】

Cron定时任务服务服务介绍、服务管理、服务配置 文章目录 一、功能概述二、功能介绍1. Cron 服务管理2.Cron 服务管理3.Cron 服务配置run-parts一、功能概述 cron是一个可以用来根据时间、日期、月份、星期的组合来 调度对周期性任务执行的守护进程。利用 cron 所提供的功能,可…