多路h265监控录放开发-(4)完成摄像机管理的数据的增删改模型层代码(单例模式)

xcamera_config.h

cpp 复制代码
#pragma once
#include <vector>
#include <mutex>
struct XCameraData
{
    char name[1024] = { 0 };
    char url[4096] = { 0 };         //摄像机主码流
    char sub_url[4096] = { 0 };     //摄像机辅码流
    char save_path[4096] = { 0 };   //视频录制存放目录
};

class XCameraConfig
{
public:

    //唯一对象实例 单件模式,客户仅有从该函数得到一个实例化对象
    static XCameraConfig* Instance()//静态成员函数可以直接通过类名来访问 如  XCameraConfig::Instance()而不需要通过对象访问
    {
        //使用 static 关键字表示该变量的生命周期将扩展到整个程序运行期间,而不仅仅是函数调用期间
        static XCameraConfig xc;
        return &xc;
    }
    //插入摄像机 线程安全
    void Push(const XCameraData& data);

    /// <summary>
    /// 获取摄像头
    /// </summary>
    /// <param name="index">摄像头索引 从0开始</param>
    /// <returns>返回空对象,可以判断name为空字符串</returns>
    XCameraData GetCam(int index);//117

    /// <summary>
    /// 修改摄像机数据
    /// </summary>
    /// <param name="index"></param>
    /// <param name="data"></param>
    /// <returns></returns>
    bool SetCam(int index, const XCameraData& data);//117

    bool DelCam(int index);//117

    /// <summary>
    /// 获取相机数量
    /// </summary>
    /// <returns>失败返回0</returns>
    int GetCamCount();//117
private:
    XCameraConfig() {}//构造私有 单件模式,只能用成员函数进行对象的创建
    std::vector<XCameraData> cams_;
    std::mutex mux_;
};

xcamera_config.cpp

cpp 复制代码
#pragma once
#include <vector>
#include <mutex>
struct XCameraData
{
    char name[1024] = { 0 };
    char url[4096] = { 0 };         //摄像机主码流
    char sub_url[4096] = { 0 };     //摄像机辅码流
    char save_path[4096] = { 0 };   //视频录制存放目录
};

class XCameraConfig
{
public:

    //唯一对象实例 单件模式,客户仅有从该函数得到一个实例化对象
    static XCameraConfig* Instance()//静态成员函数可以直接通过类名来访问 如  XCameraConfig::Instance()而不需要通过对象访问
    {
        //使用 static 关键字表示该变量的生命周期将扩展到整个程序运行期间,而不仅仅是函数调用期间
        static XCameraConfig xc;
        return &xc;
    }
    //插入摄像机 线程安全
    void Push(const XCameraData& data);

    /// <summary>
    /// 获取摄像头
    /// </summary>
    /// <param name="index">摄像头索引 从0开始</param>
    /// <returns>返回空对象,可以判断name为空字符串</returns>
    XCameraData GetCam(int index);//117

    /// <summary>
    /// 修改摄像机数据
    /// </summary>
    /// <param name="index"></param>
    /// <param name="data"></param>
    /// <returns></returns>
    bool SetCam(int index, const XCameraData& data);//117

    bool DelCam(int index);//117

    /// <summary>
    /// 获取相机数量
    /// </summary>
    /// <returns>失败返回0</returns>
    int GetCamCount();//117
private:
    XCameraConfig() {}//构造私有 单件模式,只能用成员函数进行对象的创建
    std::vector<XCameraData> cams_;
    std::mutex mux_;
};

测试主函数:

cpp 复制代码
#include "xviewer.h"
#include <QtWidgets/QApplication>
#include"xcamera_config.h"
#include<qdebug.h>

int main(int argc, char *argv[])
{
    //"XCameraConfig c;"这一句不可访问 因为构造函数为私有只可以通过成员函数访问

    //xc为相机配置类 用于操作XCameraData类,也就是相机的一些数据
    auto* xc = XCameraConfig::Instance();//117
    {
        XCameraData cd;
        strcpy(cd.name, "camera1");
        strcpy(cd.save_path, ".\\camera1\\");
        strcpy(cd.url,
            "v1080.mp4");
        strcpy(cd.sub_url,
            "v1080.mp4");
        xc->Push(cd);
    }//117
    {
        XCameraData cd;
        strcpy(cd.name, "camera2");
        strcpy(cd.save_path, ".\\camera2\\");
        strcpy(cd.url,
            "v1080.mp4");
        strcpy(cd.sub_url,
            "v1080.mp4");
        xc->Push(cd);
    }//117

    int cam_count = xc->GetCamCount();
    for (int i = 0; i < cam_count; i++)
    {
        auto cam = xc->GetCam(i);
        qDebug() << cam.name;//打印所有相机(从0~i-1个 共有i个)的相机名字
    }//117

    qDebug() << "=================Set=====================";
   XCameraData d1 = xc->GetCam(0);
    strcpy(d1.name, "camera_001");
    xc->SetCam(0, d1);//将下标为0的相机数据修改为d1所指定的相机名字
    cam_count = xc->GetCamCount();
    for (int i = 0; i < cam_count; i++)
    {
        auto cam = xc->GetCam(i);
        qDebug() << cam.name;
    }//117

    qDebug() << "=================Del=====================";
    xc->DelCam(1);
    cam_count = xc->GetCamCount();
    for (int i = 0; i < cam_count; i++)
    {
        auto cam = xc->GetCam(i);
        qDebug() << cam.name;
    }//117
    xc->DelCam(0);
    QApplication a(argc, argv);
    XViewer w;
    w.show();
    
    return a.exec();
}
相关推荐
李二。9 小时前
鸿蒙原生ArkTS-鸿蒙6.0新特性-动态模糊视频背景登录页
华为·音视频·harmonyos
菊风 Juphoon10 小时前
认证合规刚需落地|菊风智能双录,助力CA机构全流程合规留痕
音视频·双录·认证双录
大蚂蚁2号11 小时前
本地视频转文字,音频转文字免费工具
音视频
换个昵称都难13 小时前
webrtc voice engine 介绍(新版webrtc)
ffmpeg·音视频·webrtc
searchforAI13 小时前
2026年AI笔记工具对比实测:NotebookLM、通义听悟、Ai好记怎么选?
人工智能·笔记·gpt·ai·whisper·音视频·语音识别
音视频牛哥15 小时前
基于 SmartMediaKit 的座舱远程遥控系统技术方案——面向多摄像头、多角度、低延迟传输控制与内网/5G广域网融合场景
音视频·低延迟rtsp播放器·低延迟视频传输·座舱远程遥控·5g远程控制·远程驾驶系统·低延迟rtmp播放
EasyGBS17 小时前
从“后厨黑箱”到“透明厨房”:国标GB28181视频平台EasyGBS平台AI视频分析如何守护舌尖上的安全
人工智能·安全·音视频
昨日之日200617 小时前
LongCat-Video-Avatar-1.5 - 一句话生成口型同步、动作稳定的数字人 说话/唱歌 视频 一键整合包下载
音视频
searchforAI18 小时前
长视频和播客怎么变成结构化读书笔记?一套 AI 时代的知识管理方法
人工智能·笔记·gpt·音视频·语音识别
不想吃饭e18 小时前
uniapp-图片,视频上传组件封装
java·uni-app·音视频