多路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();
}
相关推荐
写代码的安徒生42 分钟前
调用 Google Veo 3.1 API 批量制作电商产品 UGC 视频
python·音视频
Likeadust2 小时前
直播+互动+存储,视频直播点播平台EasyDSS新版重磅升级!一站式解决你的音视频难题
音视频
记忆偶然2 小时前
音频转文本技术方案解析与工具选型指南
音视频
撬动未来的支点4 小时前
【音视频】 RTP 与 RTMP 协议异同对比
音视频
电鱼智能的电小鱼4 小时前
基于电鱼 ARM 工控机的AI视频智能分析方案:让传统监控变得更聪明
网络·arm开发·人工智能·嵌入式硬件·算法·音视频
音视频牛哥4 小时前
SmartMediaKit 在检测机器人中的视频链路重构:从播放(RTSP)到二次水印编码再推流(RTSP|RTMP)
机器人·音视频·大牛直播sdk·rtsp二次编码·rtsp流二次水印保存mp4·rtsp流添加动态水印·检测机器人rtsp低延迟
CDialog7 小时前
播放本地音频的代码
音视频
撬动未来的支点7 小时前
【音视频】通俗讲SDP会话描述/协商协议
音视频
沉迷单车的追风少年9 小时前
Diffusion Model与视频超分(2):解读字节开源视频增强模型SeedVR2
人工智能·深度学习·aigc·音视频·强化学习·视频生成·视频超分
给大佬递杯卡布奇诺9 小时前
FFmpeg 基本数据结构 AVPacket分析
数据结构·c++·ffmpeg·音视频