多路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();
}
相关推荐
AF_INET63 小时前
RV1126B开发板学习篇(二)v4l2+mpp编码
c语言·经验分享·音视频·视频编解码·嵌入式软件·rv1126b
reembarkation5 小时前
vue3中使用howler播放音频列表
前端·vue.js·音视频
BryanGG9 小时前
【说明书】索尼A7C视频拍摄PP值配置
音视频·规格说明书
带娃的IT创业者10 小时前
音乐播放器开发:QtMultimedia 音频引擎与播放列表管理
音视频·pyside6·qtmultimedia·音乐播放·qmediaplayer·播放列表·audio ducking
·心猿意码·14 小时前
C++ 线程安全单例模式的底层源码级解析
c++·单例模式
优选资源分享14 小时前
小白转文字 v1.2.8.0 | 安卓离线免费音视频转写工具
android·音视频
南境十里·墨染春水14 小时前
C++传记 详解单例模式(面向对象)
开发语言·c++·单例模式
不才小强14 小时前
Qt开发实战:屏幕录制项目中学习到的知识与遇到的难题
qt·音视频
要开心吖ZSH14 小时前
MP4 转 WAV 音频转码方案详解(ProcessBuilder + FFmpeg)
java·ffmpeg·音视频