Просмотр исходного кода

V1.1.2
1、这个版本的OpenGL可以正常使用

Apple 1 месяц назад
Родитель
Сommit
1d7187762e
7 измененных файлов с 348 добавлено и 143 удалено
  1. 116 23
      CPlayer/Player/PlayerGLWidget.cpp
  2. 28 3
      CPlayer/cameraplayer.cpp
  3. 2 4
      show1/CMakeLists.txt
  4. 69 0
      show1/Logs/loginit.cpp
  5. 8 0
      show1/Logs/loginit.h
  6. 34 62
      show1/main.cpp
  7. 91 51
      show1/widget.cpp

+ 116 - 23
CPlayer/Player/PlayerGLWidget.cpp

@@ -1,6 +1,9 @@
 #include "PlayerGLWidget.h"
 #include <QOpenGLFunctions> // 添加此行
 
+#include <QOpenGLContext>
+#include <QSurfaceFormat>
+
 #include "LHQLogAPI.h"
 
 PlayerGLWidget::PlayerGLWidget(QWidget *parent) : QOpenGLWidget(parent)
@@ -123,34 +126,12 @@ void PlayerGLWidget::convertQImageToYUV420(const QImage& image, Image_YUV420& yu
 
     auto rgb = image.bits();
 
-    // for (int y = 0; y < height; ++y) {
-    //     for (int x = 0; x < width; ++x) {
-    //         QColor color = image.pixelColor(x, y);
-    //         int r = color.red();
-    //         int g = color.green();
-    //         int b = color.blue();
-
-    //         int yIndex = y * width + x;
-    //         yuv420.yData[yIndex] = static_cast<unsigned char>((0.257 * r) + (0.504 * g) + (0.098 * b) + 16);
-
-    //         if (y % 2 == 0 && x % 2 == 0) {
-    //             int uvIndex = (y / 2) * (width / 2) + (x / 2);
-    //             yuv420.uData[uvIndex] = static_cast<unsigned char>((-0.148 * r) - (0.291 * g) + (0.439 * b) + 128);
-    //             yuv420.vData[uvIndex] = static_cast<unsigned char>((0.439 * r) - (0.368 * g) - (0.071 * b) + 128);
-    //         }
-    //     }
-    // }
-
     for (int j = 0; j < height; j++) {
         for (int i = 0; i < width; i++) {
             int r = rgb[(j * width + i) * 3];
             int g = rgb[(j * width + i) * 3 + 1];
             int b = rgb[(j * width + i) * 3 + 2];
 
-            // int y = (0.257 * r) + (0.504 * g) + (0.098 * b) + 16;
-            // int u = -(0.148 * r) - (0.291 * g) + (0.439 * b) + 128;
-            // int v = (0.439 * r) - (0.368 * g) - (0.071 * b) + 128;
-
             int y = (0.299 * r) + (0.587 * g) + (0.114 * b);
             int u = (-0.169 * r) - (0.331 * g) + (0.5 * b) + 128;
             int v = (0.5 * r) - (0.419 * g) - (0.081 * b) + 128;
@@ -176,9 +157,119 @@ void PlayerGLWidget::convertQImageToYUV420(const QImage& image, Image_YUV420& yu
 
 }
 
+
+// void PlayerGLWidget::convertQImageToYUV420(const QImage& image, Image_YUV420& yuv420)
+// {
+//     int width = image.width();
+//     int height = image.height();
+//     int ySize = width * height;
+//     int chromaWidth = (width + 1) / 2;
+//     int chromaHeight = (height + 1) / 2;
+//     int uvSize = chromaWidth * chromaHeight;
+
+//     yuv420.width = width;
+//     yuv420.height = height;
+
+//     yuv420.yData.resize(ySize);
+//     yuv420.uData.resize(uvSize);
+//     yuv420.vData.resize(uvSize);
+
+//     for (int y = 0; y < height; ++y) {
+//         for (int x = 0; x < width; ++x) {
+//             QColor color = image.pixelColor(x, y);
+//             int r = color.red();
+//             int g = color.green();
+//             int b = color.blue();
+
+//             int yIndex = y * width + x;
+//             if (yIndex >= 0 && yIndex < ySize) {
+//                 yuv420.yData[yIndex] = static_cast<unsigned char>((0.257 * r) + (0.504 * g) + (0.098 * b) + 16);
+//             }
+
+//             if (y % 2 == 0 && x % 2 == 0) 
+//             {
+//                 int uvIndex = (y / 2) * chromaWidth + (x / 2);
+//                 if (uvIndex >= 0 && uvIndex < uvSize) 
+//                 {
+//                     yuv420.uData[uvIndex] = static_cast<unsigned char>((-0.148 * r) - (0.291 * g) + (0.439 * b) + 128);
+//                     yuv420.vData[uvIndex] = static_cast<unsigned char>((0.439 * r) - (0.368 * g) - (0.071 * b) + 128);
+//                 }
+//             }
+//         }
+//     }
+// }
+
 void PlayerGLWidget::initializeGL()
 {
-    initializeOpenGLFunctions(); // 确保初始化 OpenGL 函数
+    LH_WRITE_LOG("开始初始化OpenGL");
+
+    // 打印当前实际创建到的 OpenGL 上下文信息(UOS 上用于确认是 OpenGL 还是 OpenGL ES、版本多少)
+    if (QOpenGLContext* ctx = context()) {
+        const QSurfaceFormat fmt = ctx->format();
+
+        QString profileStr = "NoProfile";
+        switch (fmt.profile()) {
+        case QSurfaceFormat::CoreProfile:
+            profileStr = "Core";
+            break;
+        case QSurfaceFormat::CompatibilityProfile:
+            profileStr = "Compatibility";
+            break;
+        case QSurfaceFormat::NoProfile:
+        default:
+            profileStr = "NoProfile";
+            break;
+        }
+
+        QString renderableStr = "Default";
+        switch (fmt.renderableType()) {
+        case QSurfaceFormat::OpenGL:
+            renderableStr = "OpenGL";
+            break;
+        case QSurfaceFormat::OpenGLES:
+            renderableStr = "OpenGLES";
+            break;
+        case QSurfaceFormat::DefaultRenderableType:
+        default:
+            renderableStr = "Default";
+            break;
+        }
+
+        LH_WRITE_LOG(QString("Qt Context: renderable=%1 isOpenGLES=%2 version=%3.%4 profile=%5")
+                         .arg(renderableStr)
+                         .arg(ctx->isOpenGLES() ? "true" : "false")
+                         .arg(fmt.majorVersion())
+                         .arg(fmt.minorVersion())
+                         .arg(profileStr));
+    } else {
+        LH_WRITE_LOG("Qt Context: context() == nullptr (initializeGL)");
+    }
+
+    // glGetString 必须在“已 current 的上下文”里调用;某些平台直接调用全局 glGetString 可能会段错误
+    QOpenGLContext* currentCtx = QOpenGLContext::currentContext();
+    if (!currentCtx) {
+        LH_WRITE_LOG("QOpenGLContext::currentContext() == nullptr (initializeGL),跳过 glGetString");
+        return;
+    }
+    QOpenGLFunctions* f = currentCtx->functions();
+    if (!f) {
+        LH_WRITE_LOG("currentContext()->functions() == nullptr (initializeGL),跳过 glGetString");
+        return;
+    }
+    const char* glVendor = reinterpret_cast<const char*>(f->glGetString(GL_VENDOR));
+    const char* glRenderer = reinterpret_cast<const char*>(f->glGetString(GL_RENDERER));
+    const char* glVersion = reinterpret_cast<const char*>(f->glGetString(GL_VERSION));
+    const char* glslVersion = reinterpret_cast<const char*>(f->glGetString(GL_SHADING_LANGUAGE_VERSION));
+    LH_WRITE_LOG(QString("GL_VENDOR: %1").arg(glVendor ? glVendor : "(null)"));
+    LH_WRITE_LOG(QString("GL_RENDERER: %1").arg(glRenderer ? glRenderer : "(null)"));
+    LH_WRITE_LOG(QString("GL_VERSION: %1").arg(glVersion ? glVersion : "(null)"));
+    LH_WRITE_LOG(QString("GLSL_VERSION: %1").arg(glslVersion ? glslVersion : "(null)"));
+
+    // 确保初始化 OpenGL 函数(在 OpenGL 版本不匹配时,返回 false,避免后续直接段错误)
+    if (!initializeOpenGLFunctions()) {
+        LH_WRITE_LOG("initializeOpenGLFunctions() 失败:当前上下文可能不支持 QOpenGLFunctions_3_3_Core 所需版本");
+        return;
+    }
 
     // 创建并编译顶点着色器
     const char* vertexShaderSource = R"(
@@ -282,6 +373,8 @@ void PlayerGLWidget::initializeGL()
 
     glBindBuffer(GL_ARRAY_BUFFER, 0);
     glBindVertexArray(0);
+
+    LH_WRITE_LOG("OpenGL初始化完成");
 }
 
 void PlayerGLWidget::resizeGL(int w, int h)

+ 28 - 3
CPlayer/cameraplayer.cpp

@@ -131,7 +131,7 @@ bool CameraPlayer::initCamera(QString cameraIP, int cameraPort, QString cameraUs
 bool CameraPlayer::startRealPlay(int channel)
 {
     /* 启动预览并设置回调数据流 */
-
+    LH_WRITE_LOG("开始实时预览");
     NET_DVR_PREVIEWINFO playInfo = {0};
     playInfo.hPlayWnd     = 0;          //需要SDK解码时句柄设为有效值,仅取流不解码时可设为空
     playInfo.lChannel     = channel;    //预览通道号
@@ -154,6 +154,7 @@ bool CameraPlayer::startRealPlay(int channel)
     {
         m_transCode = new TransCode();
     }
+    LH_WRITE_LOG("实时预览接口调用完成");
 
     return true;
 }
@@ -205,8 +206,10 @@ bool CameraPlayer::startPlay()
 /* 设置播放窗口父指针 */
 void CameraPlayer::setPlayWndParent(QWidget* playWnd)
 {
+    LH_WRITE_LOG("设置播放窗口");
     m_player->setParent(playWnd);
     m_player->show();
+    LH_WRITE_LOG("播放窗口设置完成");
 }
 
 /* 设置播放窗口大小 */
@@ -422,12 +425,32 @@ void CameraPlayer::DecCallBack(long nPort, char * pBuf, long nSize,FRAME_INFO *
 void CameraPlayer::DecCallBack(long nPort, char * pBuf, long nSize,FRAME_INFO * pFrameInfo, void* nUser, void* nReserved2)
 
 #elif defined(C_LINUX)
-void CameraPlayer::DecCallBack(int nPort, char * pBuf, int nSize,FRAME_INFO * pFrameInfo, void* nUser, int nReserved2)
+void CameraPlayer::DecCallBack(int nPort, char * pBuf, int nSize, FRAME_INFO * pFrameInfo, void* nUser, int nReserved2)
 #endif
 {
     /* 获取当前时间 */
     // auto now = std::chrono::system_clock::now();
-   
+    if(pBuf == nullptr)
+    {
+        LH_WRITE_ERROR("解码回调函数,pBuf为空指针");
+        return;
+    }
+    if(pFrameInfo == nullptr)
+    {
+        LH_WRITE_ERROR("解码回调函数,pFrameInfo为空指针");
+        return;
+    }
+    if(nSize <= 0)
+    {
+        LH_WRITE_ERROR("解码回调函数,数据大小为0");
+        return;
+    }
+    if(nUser == nullptr)
+    {
+        LH_WRITE_ERROR("解码回调函数,nUser为空指针");
+        return;
+    }
+    // LH_WRITE_LOG_DEBUG("解码回调函数,将T_YV12 -> YUV420");
     auto player = static_cast<CameraPlayer*>((void*)nUser);
     // LH_WRITE_LOG(QString("解码回调函数,解码通道号: %1 %2").arg(nPort).arg(player->m_playPort));
     // qDebug() << "DecCallBack所在的线程:" << QThread::currentThreadId();
@@ -477,6 +500,8 @@ void CameraPlayer::DecCallBack(int nPort, char * pBuf, int nSize,FRAME_INFO * pF
         LH_WRITE_LOG_DEBUG(QString("其他数据: %1").arg(pFrameInfo->nType));
     }
 
+    // LH_WRITE_LOG_DEBUG("解码回调函数执行结束, 已加入到环形队列");
+
     /* 计算解码时间 */
     // auto lastTime = std::chrono::system_clock::now();
     // auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(lastTime - now);

+ 2 - 4
show1/CMakeLists.txt

@@ -8,7 +8,7 @@ file(GLOB LOCAL_SRC
     ${CMAKE_CURRENT_SOURCE_DIR}/*.qrc
     ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/*.ui
-    ${CMAKE_CURRENT_SOURCE_DIR}/FromWebAPI/*.cpp
+    ${CMAKE_CURRENT_SOURCE_DIR}/Logs/*.cpp
 
     ${CMAKE_SOURCE_DIR}/CPlayer/*.cpp
     # ${CMAKE_SOURCE_DIR}/CPlayer/VideoPlayer/*.cpp
@@ -17,7 +17,6 @@ file(GLOB LOCAL_SRC
     ${CMAKE_SOURCE_DIR}/CPlayer/HKSDKAPI/*.cpp
 
 
-    ${CMAKE_SOURCE_DIR}/External/module/Logs/*.cpp
     ${CMAKE_SOURCE_DIR}/External/common/Thread/*.cpp
     ${LHHTTPAPI_SOURCE_DIRS}/*.cpp
     
@@ -33,7 +32,7 @@ add_executable(${execName} ${LOCAL_SRC})
 #包含头文件
 target_include_directories(${execName} PRIVATE 
     ${CMAKE_CURRENT_SOURCE_DIR}
-    ${CMAKE_CURRENT_SOURCE_DIR}/FromWebAPI
+    ${CMAKE_CURRENT_SOURCE_DIR}/Logs
 
     ${CMAKE_SOURCE_DIR}/CPlayer
     # ${CMAKE_SOURCE_DIR}/CPlayer/VideoPlayer
@@ -48,7 +47,6 @@ target_include_directories(${execName} PRIVATE
     ${CMAKE_SOURCE_DIR}/External/common/LHQLogLight
     ${CMAKE_SOURCE_DIR}/External/common/Thread
     ${CMAKE_SOURCE_DIR}/External/module
-    ${CMAKE_SOURCE_DIR}/External/module/Logs
     
 
     ${spdlog_INCLUDE_DIR}

+ 69 - 0
show1/Logs/loginit.cpp

@@ -0,0 +1,69 @@
+#include "loginit.h"
+
+#include "spdlog/spdlog.h"
+#include "spdlog/sinks/stdout_color_sinks.h"
+#include "spdlog/sinks/daily_file_sink.h"
+
+// #include "fmt/base.h"
+
+/* 初始化spdlog */
+void init_log()
+{
+    try 
+    {
+        /* 给默认记录器用的sink */
+        auto sink_default = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
+        /* 创建一个控制台sink */
+        auto sink_consolse = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
+        /* 创建一个文件sink,每天一个,00:00创建新的 */
+        auto sink_file = std::make_shared<spdlog::sinks::daily_file_sink_mt>("log/log.txt", 0, 0);
+        /* 修改输出格式 */
+        #if C_DEBUG
+            sink_default->set_pattern("%^[%Y-%m-%d %H:%M:%S:%e] [%l] [%s %#] %v %$");
+            sink_consolse->set_pattern("%^[%Y-%m-%d %H:%M:%S:%e] [%l] [%n] [%s %#] %v%$");
+            sink_file->set_pattern("%^[%Y-%m-%d %H:%M:%S:%e] [%l] [%n] [%s %#] %v %$");
+        #elif C_RELEASE
+            sink_default->set_pattern("%^[%Y-%m-%d %H:%M:%S:%e] [%l] %v %$");
+            sink_consolse->set_pattern("%^[%Y-%m-%d %H:%M:%S:%e] [%l] [%n] %v %$");
+            sink_file->set_pattern("%^[%Y-%m-%d %H:%M:%S:%e] [%l] [%n] %v %$");
+        #endif
+
+        /* 设置默认日志记录器,设置成自定义的sink */
+        spdlog::default_logger()->sinks().clear();
+        spdlog::default_logger()->sinks().push_back(sink_default);
+        spdlog::default_logger()->sinks().push_back(sink_file);
+        /* 创建sink数组 */
+        std::vector<spdlog::sink_ptr> sinks;
+        sinks.push_back(sink_consolse);
+        sinks.push_back(sink_file);
+
+        /* 创建一个标准输出 */
+        auto logger_main = std::make_shared<spdlog::logger>("main",begin(sinks),end(sinks));
+        /* 创建一个MQTT输出Logger */
+        auto logger_MQTT = std::make_shared<spdlog::logger>("MQTT",begin(sinks),end(sinks));
+        /* 创建一个线程池输出Logger */
+        auto logger_threadPool = std::make_shared<spdlog::logger>("ThreadPool",begin(sinks),end(sinks));
+
+        /* 注册到注册表 */
+        spdlog::register_logger(logger_main);
+        spdlog::register_logger(logger_MQTT);
+        spdlog::register_logger(logger_threadPool);
+
+
+        /* 设置spdlog输出级别,默认的估计不输出debug这个级别 */
+#ifdef C_DEBUG
+        spdlog::set_level(spdlog::level::trace);
+        spdlog::flush_on(spdlog::level::trace);
+#elif C_RELEASE
+        spdlog::set_level(spdlog::level::debug);
+        spdlog::flush_on(spdlog::level::debug);
+#endif
+
+
+
+    //    SPDLOG_LOGGER_DEBUG(logger_main,"******* 有行号且debug也能输出 *******");
+    }  catch (const spdlog::spdlog_ex& ex) {
+        fmt::print("Log initialization failed: %s\n", ex.what());
+    }
+}
+

+ 8 - 0
show1/Logs/loginit.h

@@ -0,0 +1,8 @@
+
+
+#ifndef LOGINIT_H
+#define LOGINIT_H
+
+void init_log();
+
+#endif /* LOGINIT_H */

+ 34 - 62
show1/main.cpp

@@ -2,88 +2,60 @@
 
 #include <QApplication>
 
-#include "Logs/loginit.h"
+#include <QCoreApplication>
+#include <QOpenGLContext>
+#include <QSurfaceFormat>
+
+#include "loginit.h"
 
 #include <QLibrary>
 #include <QDebug>
-#include "spdlog/spdlog.h"
 
-#include "FromWebAPI.h"
+
 
 void test();
 
 
 int main(int argc, char *argv[])
 {
+    // 可选:强制走桌面 OpenGL(避免走 OpenGLES)
+    QCoreApplication::setAttribute(Qt::AA_UseDesktopOpenGL);
+
+    QSurfaceFormat fmt;
+    fmt.setRenderableType(QSurfaceFormat::OpenGL);
+    fmt.setVersion(3, 3);
+    fmt.setProfile(QSurfaceFormat::CoreProfile);          // 或 CompatibilityProfile
+    fmt.setDepthBufferSize(24);
+    fmt.setStencilBufferSize(8);
+    // fmt.setSamples(4);                                  // 需要抗锯齿就打开
+
+    QSurfaceFormat::setDefaultFormat(fmt);
+
     QApplication a(argc, argv);
 
     /* 初始化log */
     init_log();
 
-    QString libFile = QString("%1/libLHSqlWebInterface.so").arg(QCoreApplication::applicationDirPath());
-    QLibrary* lib = new QLibrary(libFile);
-    if (!lib->load())
+    // 打印“请求的版本”(defaultFormat)
     {
-        
-        qDebug() << QString("模块%1加载失败: %2").arg(libFile).arg(lib->errorString());
+        const QSurfaceFormat fmt = QSurfaceFormat::defaultFormat();
+        qDebug() << "Requested Qt SurfaceFormat: renderable=" << fmt.renderableType()
+                 << "version=" << fmt.majorVersion() << "." << fmt.minorVersion()
+                 << "profile=" << fmt.profile();
     }
-
-    // test();
-
-    /* 初始化WebAPI */
-    // FromEQM webApi;
-    // if(!webApi.initWebApi("http://192.1.3.133:31000/v6", "", "4c2f9fc91c22dd98331e47af2e2964f4"))
-    // {
-    //     SPDLOG_ERROR("WebAPI init failed");
-    //     return -1;
-    // }
-    // SPDLOG_INFO("WebAPI init success");
-    // webApi.test();
-    // webApi.test2();
-
     
     widget w;
     w.show();
-    return a.exec();
-}
 
+    // 打印“实际创建到的版本”(创建 widget 后上下文通常已可用;更精确的实际值也会在 PlayerGLWidget::initializeGL() 中打印)
+    if (QOpenGLContext::currentContext()) {
+        const QSurfaceFormat fmt = QOpenGLContext::currentContext()->format();
+        qDebug() << "Current Qt OpenGLContext: isOpenGLES=" << QOpenGLContext::currentContext()->isOpenGLES()
+                 << "version=" << fmt.majorVersion() << "." << fmt.minorVersion()
+                 << "profile=" << fmt.profile();
+    } else {
+        qDebug() << "Current Qt OpenGLContext: (null at main)";
+    }
 
-void test()
-{
-    QString str = R"(
-    {
-        "code": 0,
-        "result": [
-            {
-            "pkid": 208,
-            "camerName": "广电区域1",
-            "camerIp": "",
-            "camerUsr": "",
-            "camerPort": 0,
-            "camerPwd": "",
-            "camerChannel": null,
-            "camerId": 4,
-            "camerSerial": "rtsp://admin:LH123456@172.16.9.31:554",
-            "camerType": "视频流地址",
-            "camerUrl": null
-            },
-            {
-            "pkid": 211,
-            "camerName": "广电区域1",
-            "camerIp": "",
-            "camerUsr": "",
-            "camerPort": 0,
-            "camerPwd": "",
-            "camerChannel": null,
-            "camerId": 4,
-            "camerSerial": "rtsp://admin:LH123456@172.16.9.31:554",
-            "camerType": "视频流地址",
-            "camerUrl": null
-            }
-        ]
-    })";
-    SPDLOG_INFO("json: {}", str.toStdString());
-    QString str2 = str.toLower();
-    nJson json = nJson::parse(str2.toStdString());
-    SPDLOG_INFO("json: {}", json.dump(4));
+    return a.exec();
 }

+ 91 - 51
show1/widget.cpp

@@ -37,11 +37,22 @@ widget::~widget()
 /* 开启预览按钮 */
 void widget::on_pBtn_startRealPlay_clicked()
 {
-    m_cameraPlayer1->startPlay();
-    m_cameraPlayer2->startPlay();
-    m_cameraPlayer3->startPlay();
-    m_cameraPlayer4->startPlay();
-    
+    if(m_cameraPlayer1 != nullptr)
+    {
+        m_cameraPlayer1->startPlay();
+    }
+    if(m_cameraPlayer2 != nullptr)
+    {
+        m_cameraPlayer2->startPlay();
+    }
+    if(m_cameraPlayer3 != nullptr)
+    {
+        m_cameraPlayer3->startPlay();
+    }
+    if(m_cameraPlayer4 != nullptr)
+    {
+        m_cameraPlayer4->startPlay();
+    }
 }
 
 /* 重新创建窗口 */
@@ -81,14 +92,14 @@ void widget::resizeEvent(QResizeEvent *event)
     /* 获取窗口大小 */
     QSize size = ui->widget_display1->size();
 
-    // ui->m_cameraPlayer1->resize(size);
-    // ui->m_cameraPlayer2->resize(size);
-    // ui->m_cameraPlayer3->resize(size);
-    // ui->m_cameraPlayer4->resize(size);
-    m_cameraPlayer1->setPlayWndSize(size);
-    m_cameraPlayer2->setPlayWndSize(size);
-    m_cameraPlayer3->setPlayWndSize(size);
-    m_cameraPlayer4->setPlayWndSize(size);
+    if(m_cameraPlayer1 != nullptr)
+        m_cameraPlayer1->setPlayWndSize(size);
+    if(m_cameraPlayer2 != nullptr)
+        m_cameraPlayer2->setPlayWndSize(size);
+    if(m_cameraPlayer3 != nullptr)
+        m_cameraPlayer3->setPlayWndSize(size);
+    if(m_cameraPlayer4 != nullptr)
+        m_cameraPlayer4->setPlayWndSize(size);
 }
 
 /* 显示事件 */
@@ -97,10 +108,14 @@ void widget::showEvent(QShowEvent *event)
     QWidget::showEvent(event);
     /* 获取窗口大小 */
     QSize size = ui->widget_display1->size();
-    m_cameraPlayer1->setPlayWndSize(size);
-    m_cameraPlayer2->setPlayWndSize(size);
-    m_cameraPlayer3->setPlayWndSize(size);
-    m_cameraPlayer4->setPlayWndSize(size);
+    if(m_cameraPlayer1 != nullptr)
+        m_cameraPlayer1->setPlayWndSize(size);
+    if(m_cameraPlayer2 != nullptr)
+        m_cameraPlayer2->setPlayWndSize(size);
+    if(m_cameraPlayer3 != nullptr)
+        m_cameraPlayer3->setPlayWndSize(size);
+    if(m_cameraPlayer4 != nullptr)
+        m_cameraPlayer4->setPlayWndSize(size);
 }
 
 void widget::initCameraPlayer()
@@ -109,44 +124,69 @@ void widget::initCameraPlayer()
     /* 通过文件读取摄像机IP信息 */
     readCameraInfo();
 
-    /* 创建摄像机播放器 */
-    m_cameraPlayer1 = new CameraPlayer;
-
-    // QString imagePath = QApplication::applicationDirPath() + "/2.jpg";
-    // QImage image(imagePath);
-    // QImage image(1653, 899, QImage::Format_RGB888);
-    QImage image(1666, 720, QImage::Format_RGB888);
-    // QImage image(1280, 720, QImage::Format_RGB888);
-    m_cameraPlayer1->setImage(image);
-    m_cameraPlayer1->initCamera("192.1.2.73", 8000, "admin", "LH123456");
-    m_cameraPlayer1->startRealPlay(1);
-    /* 设置播放窗口 */
-    m_cameraPlayer1->setPlayWndParent(ui->widget_display1);
-    m_cameraPlayer1->setPlayWndSize(ui->widget_display1->size());
+    CameraInfo_t cam1 = m_listCameraInfo.at(0);
+    if(!cam1.cameraIp.isEmpty())
+    {
+        /* 创建摄像机播放器 */
+        m_cameraPlayer1 = new CameraPlayer;
+        QImage image(1666, 720, QImage::Format_RGB888);
+        m_cameraPlayer1->setImage(image);
+        m_cameraPlayer1->initCamera(cam1.cameraIp, cam1.cameraPort, cam1.username, cam1.password);
+        m_cameraPlayer1->startRealPlay(1);
+        /* 设置播放窗口 */
+        m_cameraPlayer1->setPlayWndParent(ui->widget_display1);
+        m_cameraPlayer1->setPlayWndSize(ui->widget_display1->size());
+    }
+    
 
     /* 创建其他播放窗口 */
-    // m_cameraPlayer2 = new CameraPlayer;
-    // m_cameraPlayer2->setImage(image);
-    m_cameraPlayer2->initCamera("172.16.9.31", 8000, "admin", "LH123456");
-    m_cameraPlayer2->startRealPlay(1);
-    m_cameraPlayer2->setPlayWndParent(ui->widget_display2);
-    m_cameraPlayer2->setPlayWndSize(ui->widget_display2->size());
-
+    if(m_listCameraInfo.size() < 2)
+    {
+        return;
+    }
+    CameraInfo_t cam2 = m_listCameraInfo.at(1);
+    if(!cam2.cameraIp.isEmpty())
+    {
+        m_cameraPlayer2 = new CameraPlayer;
+        QImage image(1666, 720, QImage::Format_RGB888);
+        m_cameraPlayer2->setImage(image);
+        m_cameraPlayer2->initCamera(cam2.cameraIp, cam2.cameraPort, cam2.username, cam2.password);
+        m_cameraPlayer2->startRealPlay(1);
+        m_cameraPlayer2->setPlayWndParent(ui->widget_display2);
+        m_cameraPlayer2->setPlayWndSize(ui->widget_display2->size());
+    }
     
+    if(m_listCameraInfo.size() < 3)
+    {
+        return;
+    }
+    CameraInfo_t cam3 = m_listCameraInfo.at(2);
+    if(!cam3.cameraIp.isEmpty())
+    {
+        m_cameraPlayer3 = new CameraPlayer;
+        QImage image(1666, 720, QImage::Format_RGB888);
+        m_cameraPlayer3->setImage(image);
+        m_cameraPlayer3->initCamera(cam3.cameraIp, cam3.cameraPort, cam3.username, cam3.password);
+        m_cameraPlayer3->startRealPlay(1);
+        m_cameraPlayer3->setPlayWndParent(ui->widget_display3);
+        m_cameraPlayer3->setPlayWndSize(ui->widget_display3->size());
+    }
 
-    m_cameraPlayer3 = new CameraPlayer;
-    m_cameraPlayer3->setImage(image);
-    // m_cameraPlayer3->initCamera("192.1.2.73", 8000, "admin", "LH123456");
-    // m_cameraPlayer3->startRealPlay(1);
-    // m_cameraPlayer3->setPlayWndParent(ui->widget_display3);
-    // m_cameraPlayer3->setPlayWndSize(ui->widget_display3->size());
-
-    m_cameraPlayer4 = new CameraPlayer;
-    m_cameraPlayer4->setImage(image);
-    // m_cameraPlayer4->initCamera("192.1.2.73", 8000, "admin", "LH123456");
-    // m_cameraPlayer4->startRealPlay(1);
-    // m_cameraPlayer4->setPlayWndParent(ui->widget_display4);
-    // m_cameraPlayer4->setPlayWndSize(ui->widget_display4->size());
+    if(m_listCameraInfo.size() < 4)
+    {
+        return;
+    }
+    CameraInfo_t cam4 = m_listCameraInfo.at(3);
+    if(!cam4.cameraIp.isEmpty())
+    {
+        m_cameraPlayer4 = new CameraPlayer;
+        QImage image(1666, 720, QImage::Format_RGB888);
+        m_cameraPlayer4->setImage(image);
+        m_cameraPlayer4->initCamera(cam4.cameraIp, cam4.cameraPort, cam4.username, cam4.password);
+        m_cameraPlayer4->startRealPlay(1);
+        m_cameraPlayer4->setPlayWndParent(ui->widget_display4);
+        m_cameraPlayer4->setPlayWndSize(ui->widget_display4->size());
+    }
 }