Qt программирование охранной системы видеонаблюдения 48-параметров видео

Qt
Qt программирование охранной системы видеонаблюдения 48-параметров видео

Введение

Параметры видео раньше были в базовых параметрах, а потом их становится все больше и больше, которые напрямую независимы, и даже разделили параметр видео 1 и параметр видео 2. Когда параметров становится все больше и групп все больше, вы обнаружит, что имя группы недостаточно или неудобно для имени, и оно не может интуитивно представлять значение группы.Просто используйте 1/2/3, чтобы определить его напрямую, например, BaseConfig1, BaseConfig2, VideoConfig1, VideoConfig2 и т. д. Такое наименование более удобно использовать, и причина в том, что оно имеет смысл.

Немедленное применение изменения параметров видео было реализовано совсем недавно.Что я делал раньше, так это перезапуск приложения.Позже я обнаружил, что кроме открытого видео, другие параметры могут быть применены сразу, поэтому настройки этих параметров единообразно инкапсулированы в функция. видеоконтроль. Конечно, сначала нужно отфильтровать элементы управления, которые открыли видео.Если элементы управления видео воспроизводятся, не устанавливайте их, настройки вызовут проблемы, и вам нужно отключить настройки состояния.

Описание параметров видео

  1. Сохранить видео: после включения откройте видео, чтобы автоматически сохранить видеофайл, а каталог находится в исполняемом файле video_normal.
  2. Интервал хранения: по каким правилам хранятся видеофайлы, 0 минут означает, что хранится только один файл.
  3. Граница видео: ширина границы элемента управления видео, чем больше значение, тем толще граница.
  4. Тревожное видео: после открытия сохраните тревожное видео в исполняемый файл video_alarm, который еще не включен.
  5. Аппаратное ускорение: Какой метод аппаратного ускорения используется текущим видеоядром, значение по умолчанию none означает, что аппаратное ускорение не включено (все обычно используются qsv, dxva2, d3d11va, рекомендуется использовать dxva2 или d3d11va, в зависимости от того, поддерживает его).
  6. Метод связи: какой метод связи используется для видеопотока, по умолчанию используется TCP (надежное соединение, отсутствие потери пакетов, недостатком является медленный), опционально UDP (ненадежное соединение, легко теряются пакеты, но быстро).
  7. Обратный вызов видео: использовать ли обратный вызов для декодирования и отображения видео, например, как ядро ​​vlc, так и ядро ​​​​Hikvision поддерживают обратный вызов.
  8. Тип потока: Дважды щелкните камеру, чтобы загрузить видео в реальном времени с адресом потока, подпотоком по умолчанию.
  9. Метод декодирования: полезно ядро ​​ffmpeg, необязательный приоритет скорости, приоритет качества и обработка выравнивания.
  10. Воспроизведение звука: после включения может воспроизводить звук, а иногда его можно отключить, когда звук не нужен для экономии ресурсов.
  11. Растяжение изображения: По умолчанию включено, и изображение канала отображается в соответствии с заполнением и растяжением, если не включено, оно будет масштабироваться в соответствии с той же пропорцией.
  12. Интервал открытия: интервал загрузки и открытия видео по одному после запуска программы, по умолчанию 1 секунда.
  13. Интервал переподключения: как часто программа определяет, отключена ли камера, по умолчанию 10 секунд.
  14. Подписка на события: после открытия механизм onvif будет использоваться для подписки на тревожные события.
  15. Автоматическая калибровка времени: после того, как камера подключится к сети, местное время будет немедленно синхронизировано с камерой.

2. Особенности

(1) Программный модуль

  1. Модуль видеомониторинга, различные подмодули стыковки небольших окон, включая список устройств, графическую сигнализацию, информацию об окне, управление PTZ, предустановленное положение, настройку круиза, управление устройством, плавающую карту, просмотр веб-страниц и т. д.
  2. Модуль воспроизведения видео, включая локальное воспроизведение, удаленное воспроизведение, воспроизведение на устройстве, воспроизведение изображений, загрузку видео и т. д.
  3. Модуль электронной карты, включая карту изображений, онлайн-карту, автономную карту, планирование маршрута и т. д.
  4. Модуль запроса журнала, включая локальные журналы, журналы устройств и т. д.
  5. Модуль системных настроек, включая системные настройки (основные настройки, параметры видео, настройки базы данных, конфигурация карты, конфигурация последовательного порта и т. д.), управление регистратором, управление камерой, конфигурация опроса, управление пользователями и т. д.

(2) Основные функции

  1. Поддерживает различные видеопотоки (rtsp, rtmp, http и т. д.), видеофайлы (mp4, rmvb, avi и т. д.), воспроизведение с локальной USB-камеры.
  2. Поддержка многоэкранного переключения, включая переключение между 1, 4, 6, 8, 9, 13, 16, 25, 36, 64 экранами.
  3. Поддержка полноэкранного переключения, различные методы переключения включают контекстное меню мыши, кнопки панели инструментов, сочетания клавиш (alt+enter в полноэкранный режим, esc для выхода из полноэкранного режима).
  4. Поддерживает видеоопрос, включая опрос с 1, 4, 9 и 16 изображениями, и может устанавливать группу опроса (план опроса), интервал опроса, тип потока и т. д.
  5. Поддержка протокола onvif, включая поиск устройств, управление PTZ, управление устройствами (параметры изображения, время проверки, перезагрузка системы, моментальные снимки и т. д.).
  6. Поддержка управления разрешениями, разные пользователи могут соответствовать разным разрешениям модуля, таким как удаление журналов, завершение работы системы и т. д.
  7. База данных поддерживает различные базы данных, включая sqlite, mysql, sqlserver, postgresql, oracle, NPC Jincang и т. д.
  8. Локальная USB-камера поддерживает установку таких параметров, как разрешение и частота кадров.
  9. Все модули стыковки автоматически генерируют соответствующие меню для управления отображением и скрытием, которые можно открыть, щелкнув правой кнопкой мыши строку заголовка.
  10. Поддержка отображения всех модулей, скрытия всех модулей, сброса обычного макета, сброса полноэкранного макета.
  11. Дважды щелкните устройство, чтобы отобразить видео для предварительного просмотра в реальном времени, поддержку графических карт, онлайн-карт, автономных карт и т. д.
  12. Перетащите узел камеры в соответствующее окно, чтобы воспроизвести видео, и поддержите перетаскивание локальных файлов для прямого воспроизведения.
  13. Удаление видео поддерживается несколькими способами, такими как щелчок правой кнопкой мыши, закрытие полосы приостановки для удаления и перетаскивание видео за пределы панели видеонаблюдения для удаления.
  14. Кнопку устройства на карте изображения можно свободно перетаскивать, и информация о местоположении автоматически сохраняется. На карте Baidu вы можете щелкнуть мышью, чтобы получить информацию о широте и долготе, которая используется для обновления местоположения устройства.
  15. Любой канал в окне панели видеонаблюдения поддерживает перетаскивание и мгновенный отклик.
  16. Он включает в себя карту Baidu, переключение видов, отслеживание движения, точку устройства, нажатие мыши для получения широты и долготы и т. д.
  17. Двойной щелчок по узлу, перетаскивание узла, перетаскивание окна для обмена позициями и т. д. автоматически обновит и сохранит последний адрес воспроизведения, и программа автоматически применит его в следующий раз.
  18. Полоса громкости в правом нижнем углу автоматически скрывается, когда фокус теряется, а на полосе громкости есть значок отключения звука.
  19. Поддерживает скриншоты видео, вы можете указать один или все каналы для создания скриншотов, а также есть кнопка скриншота на небольшой панели инструментов внизу.
  20. Поддерживает автоматическое скрытие указателя мыши с течением времени, автоматический полноэкранный механизм.
  21. Поддержка onvif управления PTZ, может перемещать PTZ-камеру вверх, вниз, влево и вправо, включая сброс и регулировку фокуса.
  22. Поддержка любой камеры onvif, включая, помимо прочего, Hikvision, Dahua, Uniview, Tiandiweiye, Huawei и т. д.
  23. Видео может быть сохранено, дополнительное хранение времени или хранение одного файла, дополнительный интервал хранения.
  24. Вы можете установить режим передачи видеопотока tcp+udp, и вы можете установить декодирование видео на приоритет скорости, приоритет качества, выравнивание и т. д.
  25. Можно установить китайское название, английское название, значок LOGO и т. д. программного обеспечения.
  26. Сохраненные видеофайлы можно экспортировать в указанный каталог и загружать на сервер партиями.

(3) Особенности

  1. Основной интерфейс принимает режим формы стыковки, различные компоненты добавляются в виде небольших модулей, и любой модуль можно добавить, настроив его.
  2. Стыковочный модуль можно встроить и подвесить в любом месте путем перетаскивания, он поддерживает развертывание на весь экран и поддержку нескольких экранов.
  3. Механизм хранения файлов с двойной компоновкой, нормальный режим и полноэкранный режим соответствуют разным схемам компоновки, автоматически переключаются и сохраняются.Например, полноэкранный режим может выделять несколько модулей и отображать их прозрачно в обозначенных позициях, что более современно и научная фантастика.
  4. Оригинальный механизм протокола onvif, использующий базовый анализ протокола (поиск широковещательной рассылки udp + команда выполнения http-запроса), легче, проще для понимания, прост в освоении и расширении и не зависит от каких-либо сторонних компонентов, таких как gsoap.
  5. Исходный механизм импорта и экспорта данных, который не зависит от каких-либо компонентов на разных платформах, может экспортировать данные мгновенно.
  6. Благодаря встроенному множеству оригинальных компонентов вселенная очень ценна, включая компоненты импорта и экспорта данных (экспорт в xls, pdf, печать), компоненты базы данных (поток управления базой данных, поток автоматической очистки данных, универсальный пейджинг, запрос данных и т. д.) , компонент карты , компоненты видеонаблюдения, компоненты файлового многопоточного трансивера, компоненты связи onvif, общие компоненты ядра браузера и т. д.
  7. Пользовательское информационное окно + окно ошибки + окно запроса + окно подсказки в правом нижнем углу (включая несколько форматов) и т. д.
  8. Изысканная замена скинов, до 17 наборов стилей скинов можно заменить по желанию, все стили унифицированы, включая меню и т.д.
  9. Панель приостановки управления видео может добавлять несколько кнопок сама по себе, а небольшая панель инструментов в нижней части интерфейса мониторинга также может добавлять кнопки сама по себе.
  10. Дважды щелкните узел камеры, чтобы автоматически воспроизвести видео, дважды щелкните узел, чтобы автоматически добавить видео по порядку и автоматически перейти к следующему, и дважды щелкните родительский узел, чтобы автоматически добавить все видео под узлом. Основной поток и дополнительный поток являются необязательными.
  11. Управление рекордером, управление камерой, можно добавлять, удалять, изменять, импортировать и экспортировать информацию о печати, а также немедленно применять новую информацию об устройстве для создания древовидного списка без перезапуска.
  12. Различные ядра можно свободно переключать, ffmpeg, vlc, mpv и т. д. можно установить в pro. Рекомендуется использовать ffmpeg, который является наиболее кроссплатформенным, по умолчанию предоставляются скомпилированные библиотеки для linux и mac платформ.
  13. Поддержка жесткого декодирования, вы можете установить тип жесткого декодирования (qsv, dxva2, d3d11va и т. д.).
  14. По умолчанию для отрисовки видео используется opengl, который имеет сверхнизкое потребление ресурсов ЦП и поддерживает для отрисовки форматы yuyv и nv12, что очень мощно.
  15. Обладая широкими возможностями настройки, пользователи могут легко создавать на этой основе свои собственные функции, такие как добавление пользовательских модулей, добавление режимов работы, мониторинг роботов, мониторинг дронов, мониторинг экскаваторов и т. д.
  16. Поддержка xp, win7, win10, linux, mac, различных отечественных систем (UOS, win kylin, galaxy kylin и т. д.), встроенных linux и других систем.
  17. Полные комментарии, четкая структура проекта, очень подробное и полное руководство по использованию и разработке, точное функциональное описание каждого файла кода и непрерывные итерационные версии.

3. Адрес опыта

  1. Адрес опыта:disk.baidu.com/is/1's 7TH_GE Y…Код извлечения: 01jf Имя файла: bin_video_system.zip.
  2. Внутренний сайт:git ee.com/летающий свет…
  3. Международный сайт:GitHub.com/Летающий свет…
  4. Домашняя страница:blog.CSDN.net/Летающий свет…
  5. Знать домашнюю страницу:уууууу. call.com/people/fee…
  6. Онлайн-документация:Демонстрация виджета Feiyangqingyun.git ee.IO/Q…

В-четвертых, карта эффектов

在这里插入图片描述На фото ниже чисто для работы и отдыха在这里插入图片描述

Пять, основной код

void frmConfigSystem::initVideoConfig1()
{
    QStringList listImageFlag;
    listImageFlag << "速度优先" << "质量优先" << "均衡";
    ui->cboxImageFlag->addItems(listImageFlag);
    ui->cboxImageFlag->setCurrentIndex(AppConfig::ImageFlag);
    connect(ui->cboxImageFlag, SIGNAL(currentIndexChanged(int)), this, SLOT(saveVideoConfig1()));

    QStringList listHardware;
    listHardware << "none";
#ifdef videoffmpeg
    listHardware << "qsv" << "cuvid";
#elif videovlc
    listHardware << "auto" << "any";
#endif
    listHardware << "vaapi" << "vdpau" << "dxva2" << "d3d11va";

    ui->cboxHardware->addItems(listHardware);
    ui->cboxHardware->setCurrentIndex(ui->cboxHardware->findText(AppConfig::Hardware));
    connect(ui->cboxHardware, SIGNAL(currentIndexChanged(int)), this, SLOT(saveVideoConfig1()));

    QStringList listTransport;
    listTransport << "tcp" << "udp";
    ui->cboxTransport->addItems(listTransport);
    ui->cboxTransport->setCurrentIndex(ui->cboxTransport->findText(AppConfig::Transport));
    connect(ui->cboxTransport, SIGNAL(currentIndexChanged(int)), this, SLOT(saveVideoConfig1()));

    ui->btnCallback->setChecked(AppConfig::Callback);
    connect(ui->btnCallback, SIGNAL(checkedChanged(bool)), this, SLOT(saveVideoConfig1()));

    ui->btnFillImage->setChecked(AppConfig::FillImage);
    connect(ui->btnFillImage, SIGNAL(checkedChanged(bool)), this, SLOT(saveVideoConfig1()));

    ui->btnPlayAudio->setChecked(AppConfig::PlayAudio);
    connect(ui->btnPlayAudio, SIGNAL(checkedChanged(bool)), this, SLOT(saveVideoConfig1()));
}

void frmConfigSystem::saveVideoConfig1()
{
    int imageFlag = ui->cboxImageFlag->currentIndex();
    if (AppConfig::ImageFlag != imageFlag) {
        AppConfig::ImageFlag = imageFlag;
        emit AppEvent::Instance()->slot_changeVideoConfig();
    }

    QString hardware = ui->cboxHardware->currentText();
    if (AppConfig::Hardware != hardware) {
        AppConfig::Hardware = hardware;
        emit AppEvent::Instance()->slot_changeVideoConfig();
    }

    QString transport = ui->cboxTransport->currentText();
    if (AppConfig::Transport != transport) {
        AppConfig::Transport = transport;
        emit AppEvent::Instance()->slot_changeVideoConfig();
    }

    bool callback = ui->btnCallback->getChecked();
    if (AppConfig::Callback != callback) {
        AppConfig::Callback = callback;
        emit AppEvent::Instance()->slot_changeVideoConfig();
    }

    bool fillImage = ui->btnFillImage->getChecked();
    if (AppConfig::FillImage != fillImage) {
        AppConfig::FillImage = fillImage;
        emit AppEvent::Instance()->slot_changeVideoConfig();
    }

    bool playAudio = ui->btnPlayAudio->getChecked();
    if (AppConfig::PlayAudio != playAudio) {
        AppConfig::PlayAudio = playAudio;
        emit AppEvent::Instance()->slot_changeVideoConfig();
    }

    AppConfig::writeConfig();
}

void frmConfigSystem::initVideoConfig2()
{
    QStringList listVideoRtsp;
    listVideoRtsp << "主码流" << "子码流";
    ui->cboxVideoRtsp->addItems(listVideoRtsp);
    ui->cboxVideoRtsp->setCurrentIndex(AppConfig::VideoRtsp);
    connect(ui->cboxVideoRtsp, SIGNAL(currentIndexChanged(int)), this, SLOT(saveVideoConfig2()));

    QStringList listVideoBorder;
    listVideoBorder << "1像素" << "2像素" << "3像素" << "4像素" << "5像素";
    ui->cboxVideoBorder->addItems(listVideoBorder);
    QString videoBorder = QString("%1像素").arg(AppConfig::VideoBorder);
    ui->cboxVideoBorder->setCurrentIndex(ui->cboxVideoBorder->findText(videoBorder));
    connect(ui->cboxVideoBorder, SIGNAL(currentIndexChanged(int)), this, SLOT(saveVideoConfig2()));
}

void frmConfigSystem::saveVideoConfig2()
{
    //自动更新码流类型
    int videoRtsp = ui->cboxVideoRtsp->currentIndex();
    if (AppConfig::VideoRtsp != videoRtsp) {
        AppConfig::VideoRtsp = videoRtsp;
        DeviceHelper::initDeviceTree();
        DeviceHelper::initVideoIcon();
    }

    QString strVideoBorder = ui->cboxVideoBorder->currentText();
    int videoBorder = strVideoBorder.mid(0, strVideoBorder.length() - 2).toInt();
    if (AppConfig::VideoBorder != videoBorder) {
        AppConfig::VideoBorder = videoBorder;
        emit AppEvent::Instance()->slot_changeVideoConfig();
    }

    AppConfig::writeConfig();
}

void frmConfigSystem::initVideoConfig3()
{
    ui->btnSaveVideoNormal->setChecked(AppConfig::SaveVideoNormal);
    connect(ui->btnSaveVideoNormal, SIGNAL(checkedChanged(bool)), this, SLOT(saveVideoConfig3()));

    ui->btnSaveVideoAlarm->setChecked(AppConfig::SaveVideoAlarm);
    connect(ui->btnSaveVideoAlarm, SIGNAL(checkedChanged(bool)), this, SLOT(saveVideoConfig3()));

    QStringList listSaveVideoInterval;
    listSaveVideoInterval << "0分钟" << "1分钟" << "3分钟" << "5分钟" << "10分钟" << "20分钟" << "30分钟" << "60分钟";
    ui->cboxSaveVideoInterval->addItems(listSaveVideoInterval);
    QString saveVideoInterval = QString("%1分钟").arg(AppConfig::SaveVideoInterval);
    ui->cboxSaveVideoInterval->setCurrentIndex(ui->cboxSaveVideoInterval->findText(saveVideoInterval));
    connect(ui->cboxSaveVideoInterval, SIGNAL(currentIndexChanged(int)), this, SLOT(saveVideoConfig3()));

    QStringList listOpenInterval;
    listOpenInterval << "0毫秒" << "100毫秒" << "300毫秒" << "500毫秒" << "1000毫秒" << "2000毫秒" << "3000毫秒" << "5000毫秒";
    ui->cboxOpenInterval->addItems(listOpenInterval);
    QString openInterval = QString("%1毫秒").arg(AppConfig::OpenInterval);
    ui->cboxOpenInterval->setCurrentIndex(ui->cboxOpenInterval->findText(openInterval));
    connect(ui->cboxOpenInterval, SIGNAL(currentIndexChanged(int)), this, SLOT(saveVideoConfig3()));

    QStringList listCheckInterval;
    listCheckInterval << "5秒钟" << "8秒钟" << "10秒钟" << "30秒钟" << "60秒钟";
    ui->cboxCheckInterval->addItems(listCheckInterval);
    QString checkInterval = QString("%1秒钟").arg(AppConfig::CheckInterval);
    ui->cboxCheckInterval->setCurrentIndex(ui->cboxCheckInterval->findText(checkInterval));
    connect(ui->cboxCheckInterval, SIGNAL(currentIndexChanged(int)), this, SLOT(saveVideoConfig3()));

    QStringList listCheckTime;
    listCheckTime << "500毫秒" << "1000毫秒" << "2000毫秒" << "3000毫秒" << "5000毫秒" << "8000毫秒" << "10000毫秒";
    ui->cboxCheckTime->addItems(listCheckTime);
    QString checkTime = QString("%1毫秒").arg(AppConfig::CheckTime);
    ui->cboxCheckTime->setCurrentIndex(ui->cboxCheckTime->findText(checkTime));
    connect(ui->cboxCheckTime, SIGNAL(currentIndexChanged(int)), this, SLOT(saveVideoConfig3()));
}

void frmConfigSystem::saveVideoConfig3()
{
    AppConfig::SaveVideoNormal = ui->btnSaveVideoNormal->getChecked();
    AppConfig::SaveVideoAlarm = ui->btnSaveVideoAlarm->getChecked();

    QString saveVideoInterval = ui->cboxSaveVideoInterval->currentText();
    AppConfig::SaveVideoInterval = saveVideoInterval.mid(0, saveVideoInterval.length() - 2).toInt();

    QString openInterval = ui->cboxOpenInterval->currentText();
    AppConfig::OpenInterval = openInterval.mid(0, openInterval.length() - 2).toInt();

    QString checkInterval = ui->cboxCheckInterval->currentText();
    AppConfig::CheckInterval = checkInterval.mid(0, checkInterval.length() - 2).toInt();

    QString strCheckTime = ui->cboxCheckTime->currentText();
    int checkTime = strCheckTime.mid(0, strCheckTime.length() - 2).toInt();
    if (AppConfig::CheckTime != checkTime) {
        AppConfig::CheckTime = checkTime;
        emit AppEvent::Instance()->slot_changeVideoConfig();
    }

    AppConfig::writeConfig();
}