Введение
Параметры видео раньше были в базовых параметрах, а потом их становится все больше и больше, которые напрямую независимы, и даже разделили параметр видео 1 и параметр видео 2. Когда параметров становится все больше и групп все больше, вы обнаружит, что имя группы недостаточно или неудобно для имени, и оно не может интуитивно представлять значение группы.Просто используйте 1/2/3, чтобы определить его напрямую, например, BaseConfig1, BaseConfig2, VideoConfig1, VideoConfig2 и т. д. Такое наименование более удобно использовать, и причина в том, что оно имеет смысл.
Немедленное применение изменения параметров видео было реализовано совсем недавно.Что я делал раньше, так это перезапуск приложения.Позже я обнаружил, что кроме открытого видео, другие параметры могут быть применены сразу, поэтому настройки этих параметров единообразно инкапсулированы в функция. видеоконтроль. Конечно, сначала нужно отфильтровать элементы управления, которые открыли видео.Если элементы управления видео воспроизводятся, не устанавливайте их, настройки вызовут проблемы, и вам нужно отключить настройки состояния.
Описание параметров видео
- Сохранить видео: после включения откройте видео, чтобы автоматически сохранить видеофайл, а каталог находится в исполняемом файле video_normal.
- Интервал хранения: по каким правилам хранятся видеофайлы, 0 минут означает, что хранится только один файл.
- Граница видео: ширина границы элемента управления видео, чем больше значение, тем толще граница.
- Тревожное видео: после открытия сохраните тревожное видео в исполняемый файл video_alarm, который еще не включен.
- Аппаратное ускорение: Какой метод аппаратного ускорения используется текущим видеоядром, значение по умолчанию none означает, что аппаратное ускорение не включено (все обычно используются qsv, dxva2, d3d11va, рекомендуется использовать dxva2 или d3d11va, в зависимости от того, поддерживает его).
- Метод связи: какой метод связи используется для видеопотока, по умолчанию используется TCP (надежное соединение, отсутствие потери пакетов, недостатком является медленный), опционально UDP (ненадежное соединение, легко теряются пакеты, но быстро).
- Обратный вызов видео: использовать ли обратный вызов для декодирования и отображения видео, например, как ядро vlc, так и ядро Hikvision поддерживают обратный вызов.
- Тип потока: Дважды щелкните камеру, чтобы загрузить видео в реальном времени с адресом потока, подпотоком по умолчанию.
- Метод декодирования: полезно ядро ffmpeg, необязательный приоритет скорости, приоритет качества и обработка выравнивания.
- Воспроизведение звука: после включения может воспроизводить звук, а иногда его можно отключить, когда звук не нужен для экономии ресурсов.
- Растяжение изображения: По умолчанию включено, и изображение канала отображается в соответствии с заполнением и растяжением, если не включено, оно будет масштабироваться в соответствии с той же пропорцией.
- Интервал открытия: интервал загрузки и открытия видео по одному после запуска программы, по умолчанию 1 секунда.
- Интервал переподключения: как часто программа определяет, отключена ли камера, по умолчанию 10 секунд.
- Подписка на события: после открытия механизм onvif будет использоваться для подписки на тревожные события.
- Автоматическая калибровка времени: после того, как камера подключится к сети, местное время будет немедленно синхронизировано с камерой.
2. Особенности
(1) Программный модуль
- Модуль видеомониторинга, различные подмодули стыковки небольших окон, включая список устройств, графическую сигнализацию, информацию об окне, управление PTZ, предустановленное положение, настройку круиза, управление устройством, плавающую карту, просмотр веб-страниц и т. д.
- Модуль воспроизведения видео, включая локальное воспроизведение, удаленное воспроизведение, воспроизведение на устройстве, воспроизведение изображений, загрузку видео и т. д.
- Модуль электронной карты, включая карту изображений, онлайн-карту, автономную карту, планирование маршрута и т. д.
- Модуль запроса журнала, включая локальные журналы, журналы устройств и т. д.
- Модуль системных настроек, включая системные настройки (основные настройки, параметры видео, настройки базы данных, конфигурация карты, конфигурация последовательного порта и т. д.), управление регистратором, управление камерой, конфигурация опроса, управление пользователями и т. д.
(2) Основные функции
- Поддерживает различные видеопотоки (rtsp, rtmp, http и т. д.), видеофайлы (mp4, rmvb, avi и т. д.), воспроизведение с локальной USB-камеры.
- Поддержка многоэкранного переключения, включая переключение между 1, 4, 6, 8, 9, 13, 16, 25, 36, 64 экранами.
- Поддержка полноэкранного переключения, различные методы переключения включают контекстное меню мыши, кнопки панели инструментов, сочетания клавиш (alt+enter в полноэкранный режим, esc для выхода из полноэкранного режима).
- Поддерживает видеоопрос, включая опрос с 1, 4, 9 и 16 изображениями, и может устанавливать группу опроса (план опроса), интервал опроса, тип потока и т. д.
- Поддержка протокола onvif, включая поиск устройств, управление PTZ, управление устройствами (параметры изображения, время проверки, перезагрузка системы, моментальные снимки и т. д.).
- Поддержка управления разрешениями, разные пользователи могут соответствовать разным разрешениям модуля, таким как удаление журналов, завершение работы системы и т. д.
- База данных поддерживает различные базы данных, включая sqlite, mysql, sqlserver, postgresql, oracle, NPC Jincang и т. д.
- Локальная USB-камера поддерживает установку таких параметров, как разрешение и частота кадров.
- Все модули стыковки автоматически генерируют соответствующие меню для управления отображением и скрытием, которые можно открыть, щелкнув правой кнопкой мыши строку заголовка.
- Поддержка отображения всех модулей, скрытия всех модулей, сброса обычного макета, сброса полноэкранного макета.
- Дважды щелкните устройство, чтобы отобразить видео для предварительного просмотра в реальном времени, поддержку графических карт, онлайн-карт, автономных карт и т. д.
- Перетащите узел камеры в соответствующее окно, чтобы воспроизвести видео, и поддержите перетаскивание локальных файлов для прямого воспроизведения.
- Удаление видео поддерживается несколькими способами, такими как щелчок правой кнопкой мыши, закрытие полосы приостановки для удаления и перетаскивание видео за пределы панели видеонаблюдения для удаления.
- Кнопку устройства на карте изображения можно свободно перетаскивать, и информация о местоположении автоматически сохраняется. На карте Baidu вы можете щелкнуть мышью, чтобы получить информацию о широте и долготе, которая используется для обновления местоположения устройства.
- Любой канал в окне панели видеонаблюдения поддерживает перетаскивание и мгновенный отклик.
- Он включает в себя карту Baidu, переключение видов, отслеживание движения, точку устройства, нажатие мыши для получения широты и долготы и т. д.
- Двойной щелчок по узлу, перетаскивание узла, перетаскивание окна для обмена позициями и т. д. автоматически обновит и сохранит последний адрес воспроизведения, и программа автоматически применит его в следующий раз.
- Полоса громкости в правом нижнем углу автоматически скрывается, когда фокус теряется, а на полосе громкости есть значок отключения звука.
- Поддерживает скриншоты видео, вы можете указать один или все каналы для создания скриншотов, а также есть кнопка скриншота на небольшой панели инструментов внизу.
- Поддерживает автоматическое скрытие указателя мыши с течением времени, автоматический полноэкранный механизм.
- Поддержка onvif управления PTZ, может перемещать PTZ-камеру вверх, вниз, влево и вправо, включая сброс и регулировку фокуса.
- Поддержка любой камеры onvif, включая, помимо прочего, Hikvision, Dahua, Uniview, Tiandiweiye, Huawei и т. д.
- Видео может быть сохранено, дополнительное хранение времени или хранение одного файла, дополнительный интервал хранения.
- Вы можете установить режим передачи видеопотока tcp+udp, и вы можете установить декодирование видео на приоритет скорости, приоритет качества, выравнивание и т. д.
- Можно установить китайское название, английское название, значок LOGO и т. д. программного обеспечения.
- Сохраненные видеофайлы можно экспортировать в указанный каталог и загружать на сервер партиями.
(3) Особенности
- Основной интерфейс принимает режим формы стыковки, различные компоненты добавляются в виде небольших модулей, и любой модуль можно добавить, настроив его.
- Стыковочный модуль можно встроить и подвесить в любом месте путем перетаскивания, он поддерживает развертывание на весь экран и поддержку нескольких экранов.
- Механизм хранения файлов с двойной компоновкой, нормальный режим и полноэкранный режим соответствуют разным схемам компоновки, автоматически переключаются и сохраняются.Например, полноэкранный режим может выделять несколько модулей и отображать их прозрачно в обозначенных позициях, что более современно и научная фантастика.
- Оригинальный механизм протокола onvif, использующий базовый анализ протокола (поиск широковещательной рассылки udp + команда выполнения http-запроса), легче, проще для понимания, прост в освоении и расширении и не зависит от каких-либо сторонних компонентов, таких как gsoap.
- Исходный механизм импорта и экспорта данных, который не зависит от каких-либо компонентов на разных платформах, может экспортировать данные мгновенно.
- Благодаря встроенному множеству оригинальных компонентов вселенная очень ценна, включая компоненты импорта и экспорта данных (экспорт в xls, pdf, печать), компоненты базы данных (поток управления базой данных, поток автоматической очистки данных, универсальный пейджинг, запрос данных и т. д.) , компонент карты , компоненты видеонаблюдения, компоненты файлового многопоточного трансивера, компоненты связи onvif, общие компоненты ядра браузера и т. д.
- Пользовательское информационное окно + окно ошибки + окно запроса + окно подсказки в правом нижнем углу (включая несколько форматов) и т. д.
- Изысканная замена скинов, до 17 наборов стилей скинов можно заменить по желанию, все стили унифицированы, включая меню и т.д.
- Панель приостановки управления видео может добавлять несколько кнопок сама по себе, а небольшая панель инструментов в нижней части интерфейса мониторинга также может добавлять кнопки сама по себе.
- Дважды щелкните узел камеры, чтобы автоматически воспроизвести видео, дважды щелкните узел, чтобы автоматически добавить видео по порядку и автоматически перейти к следующему, и дважды щелкните родительский узел, чтобы автоматически добавить все видео под узлом. Основной поток и дополнительный поток являются необязательными.
- Управление рекордером, управление камерой, можно добавлять, удалять, изменять, импортировать и экспортировать информацию о печати, а также немедленно применять новую информацию об устройстве для создания древовидного списка без перезапуска.
- Различные ядра можно свободно переключать, ffmpeg, vlc, mpv и т. д. можно установить в pro. Рекомендуется использовать ffmpeg, который является наиболее кроссплатформенным, по умолчанию предоставляются скомпилированные библиотеки для linux и mac платформ.
- Поддержка жесткого декодирования, вы можете установить тип жесткого декодирования (qsv, dxva2, d3d11va и т. д.).
- По умолчанию для отрисовки видео используется opengl, который имеет сверхнизкое потребление ресурсов ЦП и поддерживает для отрисовки форматы yuyv и nv12, что очень мощно.
- Обладая широкими возможностями настройки, пользователи могут легко создавать на этой основе свои собственные функции, такие как добавление пользовательских модулей, добавление режимов работы, мониторинг роботов, мониторинг дронов, мониторинг экскаваторов и т. д.
- Поддержка xp, win7, win10, linux, mac, различных отечественных систем (UOS, win kylin, galaxy kylin и т. д.), встроенных linux и других систем.
- Полные комментарии, четкая структура проекта, очень подробное и полное руководство по использованию и разработке, точное функциональное описание каждого файла кода и непрерывные итерационные версии.
3. Адрес опыта
- Адрес опыта:disk.baidu.com/is/1's 7TH_GE Y…Код извлечения: 01jf Имя файла: bin_video_system.zip.
- Внутренний сайт:git ee.com/летающий свет…
- Международный сайт:GitHub.com/Летающий свет…
- Домашняя страница:blog.CSDN.net/Летающий свет…
- Знать домашнюю страницу:уууууу. call.com/people/fee…
- Онлайн-документация:Демонстрация виджета 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();
}