Qt展廳播放器/多媒體播放器/中控播放器/幀同步播放器/硬解播放器/監控播放器

一、前言說明

音視頻開發除了應用在安防監控、視頻網站、各種流媒體app開發之外,還有一個小眾的市場,那就是多媒體展廳場景,這個場景目前處于壟斷地位的軟件是HirenderS3,做的非常早而且非常全面,都是通用的需求,這個場景需求,在播放這塊,有幾個明顯的需求是,播放的視頻文件分辨率特別大,一般是4K/8K甚至到16K,展廳的屏幕很大,分辨率小了的話,不夠清晰,所以至少會上4K分辨率,一般超過2K的分辨率,一定要上硬解碼,不然CPU很可能撐不住,這里問題就來了,在底層(不清楚是操作系統層面還是硬件層面),264只能支持4K硬解,265支持到8K硬解,再往上的分辨率都不支持的,而現在不少的多媒體文件是8K的264格式,12K/16K的265,那怎么辦,不開啟硬解的話,資源極其緊張,幾乎是快占滿的節奏,所以要從邏輯層面去優化,一個辦法是外接多個顯卡對應顯示器,文件切割成多個4K或者8K,每個文件指定一個顯卡去硬解,顯示在指定的顯示器上。一個辦法是用多個顯示窗體拼接,每個播放窗體都可以硬解。

還有個重要需求點是同步問題,如果是本地多個畫面拼接,則需要幀同步,不然開起來多畫面是不夠銜接的,大于1幀的誤差能夠肉眼可見,多個電腦之間不同播放器也需要幀同步,所以就產生了兩種幀同步需求,一個是本地幀同步,一個是網絡幀同步,本地幀同步主要是控制同時解碼同一幀后同時刷新顯示,網絡幀同步比較麻煩,因為必須通過網絡數據通知當前都是播放第一幀,這個網絡通信都是有延遲的,所以還需要考慮延遲的時間。

二、效果圖

在這里插入圖片描述
在這里插入圖片描述

三、相關代碼

#include "synclocal.h"
#include "qthelper.h"
#include "frmplay.h"SINGLETON_IMPL(SyncLocal)
QDateTime SyncLocal::SyncTime = QDateTime::currentDateTime().addDays(-1);
SyncLocal::SyncLocal(QObject *parent) : QThread(parent)
{isStop = false;this->reset();syncInterval = 5;syncOffset = 15;syncSleep = 500;updateInterval = 10;
}SyncLocal::~SyncLocal()
{this->stop();
}void SyncLocal::run()
{while (!isStop) {this->checkPosition();this->checkSync();this->checkPause();this->updateWidget();count++;msleep(updateInterval);//qDebug() << TIMEMS << "111" << updateInterval << count;}isStop = false;this->reset();
}void SyncLocal::checkPosition()
{//同步間隔0表示不啟用/至少要2個窗體才需要同步int size = frmPlay::widgets.size();if (size < 2 || isSync || isPasue) {count = 0;return;}//永遠同步到到第一個窗體/處于非播放狀態/或者暫停狀態不用繼續frmPlay *widget = frmPlay::widgets.first();if (!widget->isPlaying() || widget->isPaused()) {return;}//優先執行手動同步指令/-1則同步到第一個窗體/>=0則同步到對應位置if (syncPosition >= -1) {position = (syncPosition == -1 ? widget->position() : syncPosition);count = 0;isSync = true;qDebug() << TIMEMS << "hand" << position;return;}//同步間隔0表示不啟用if (syncInterval == 0) {count = 0;return;}//計算同步間隔需要循環多少次int maxCount = syncInterval * 1000 / updateInterval;//到了需要同步的時候執行同步if (count < maxCount) {return;}count = 0;    //剛開始或者快結束先不同步position = widget->position();if (position < 2000 || qAbs(widget->duration() - position) < 2000) {return;}for (int i = 1; i < size; ++i) {offset = position - frmPlay::widgets.at(i)->position();qDebug() << TIMEMS << "posi" << position << "\t" << offset;if (qAbs(offset) >= syncOffset) {isSync = true;break;}}
}void SyncLocal::checkSync()
{//同步標志位為真則先同步if (isSync) {count = 0;isSync = false;isPasue = true;SyncTime = QDateTime::currentDateTime();qDebug() << TIMEMS << "seek" << position;//先暫停再執行設置進度foreach (frmPlay *widget, frmPlay::widgets) {widget->pause();widget->seek(position);}}
}void SyncLocal::checkPause()
{//暫停階段說明剛才執行過同步/等待一段時間重新播放if (isPasue) {qint64 time = SyncTime.msecsTo(QDateTime::currentDateTime());if (time >= syncSleep) {foreach (frmPlay *widget, frmPlay::widgets) {widget->next();}count = 0;isPasue = false;syncPosition = -2;emit receiveSync(offset);qDebug() << TIMEMS << "play" << position;}}
}void SyncLocal::updateWidget()
{//刷新界面用來觸發繪制foreach (frmPlay *widget, frmPlay::widgets) {widget->updateVideo();}
}void SyncLocal::setSyncInterval(int syncInterval)
{this->reset();this->syncInterval = syncInterval;
}void SyncLocal::setSyncOffset(int syncOffset)
{this->syncOffset = syncOffset;
}void SyncLocal::setSyncSleep(int syncSleep)
{this->syncSleep = syncSleep;
}void SyncLocal::setUpdateInterval(int updateInterval)
{this->updateInterval = updateInterval;
}void SyncLocal::stop()
{if (this->isRunning()) {this->isStop = true;this->wait();}
}void SyncLocal::reset()
{this->count = 0;this->isSync = false;this->isPasue = false;this->syncPosition = -2;
}//-1則同步到第一個窗體/>=0則同步到對應位置
void SyncLocal::sync(qint64 position)
{//至少要兩個窗體才能同步/處于暫停階段說明上一個同步還沒執行完成if (frmPlay::widgets.size() >= 2 && !isPasue && syncPosition == -2) {this->syncPosition = position;}
}

四、相關地址

  1. 國內站點:https://gitee.com/feiyangqingyun
  2. 國際站點:https://github.com/feiyangqingyun
  3. 個人作品:https://blog.csdn.net/feiyangqingyun/article/details/97565652
  4. 文件地址:https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g 提取碼:01jf 文件名:bin_video_sync。

五、功能特點

  1. 實時幀同步,本地無縫拼接多個視頻。
  2. 支持網絡同步,可選主控端和被控端,主控端將本地播放的進度實時同步到被控端。
  3. 網絡同步支持組播、廣播、單播三種模式,默認組播,既可以跨網段,也可以避免廣播數據風暴。
  4. 默認開啟自動同步,也可以手動同步和復位同步,手動同步是立即執行一次同步,將第一個視頻的進度同步到其他視頻文件,復位同步是將所有視頻播放進度切換到最開始0的位置。
  5. 支持各種視音頻文件,包括但不限于mp4/mov/mkv/rmvb/avi等格式。
  6. 硬解碼和GPU繪制,最大化利用硬件資源,支持qsv/cuda/dxva2/d3d11va/vaapi等硬解碼。
  7. 極低的CPU占用,8K30fps只占不到1%的CPU,解碼和繪制全部交給GPU。
  8. 提供示例按照行列生成多個視頻播放窗口,每個窗口可以選擇不同的視頻文件,在手動同步模式下,可以切換任意一個視頻播放進度,會將所有的視頻按照這個進度同步。
  9. 自動循環播放視頻文件,無縫切換循環播放,看起來非常絲滑。
  10. 支持Qt4/Qt5/Qt6所有版本,支持各種操作系統包括國產OS和嵌入式OS。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/894610.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/894610.shtml
英文地址,請注明出處:http://en.pswp.cn/news/894610.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2021版小程序開發5——小程序項目開發實踐(1)

2021版小程序開發5——小程序項目開發實踐(1) 學習筆記 2025 使用uni-app開發一個電商項目&#xff1b; Hbuidler 首選uni-app官方推薦工具&#xff1a;https://www.dcloud.io/hbuilderx.htmlhttps://dev.dcloud.net.cn/pages/app/list 微信小程序 管理后臺&#xff1a;htt…

【零拷貝】

目錄 一&#xff1a;了解IO基礎概念 二&#xff1a;數據流動的層次結構 三&#xff1a;零拷貝 1.傳統IO文件讀寫 2.mmap 零拷貝技術 3.sendFile 零拷貝技術 一&#xff1a;了解IO基礎概念 理解CPU拷貝和DMA拷貝 ? 我們知道&#xff0c;操作系統對于內存空間&…

全棧開發:使用.NET Core WebAPI構建前后端分離的核心技巧(一)

目錄 cors解決跨域 依賴注入使用 分層服務注冊 緩存方法使用 內存緩存使用 緩存過期清理 緩存存在問題 分布式的緩存 cors解決跨域 前后端分離已經成為一種越來越流行的架構模式&#xff0c;由于跨域資源共享(cors)是瀏覽器的一種安全機制&#xff0c;它會阻止前端應用…

《Linux服務與安全管理》| 數據庫服務器安裝和配置

《Linux服務與安全管理》| 數據庫服務器安裝和配置 目錄 《Linux服務與安全管理》| 數據庫服務器安裝和配置 任務一&#xff1a; 安裝PostgreSQL數據庫&#xff0c;設置遠程登錄&#xff0c;客戶端可以成功登錄并操作數據庫。 任務二&#xff1a; 安裝MySQL數據庫&#xf…

Linux系統之whereis命令的基本使用

Linux系統之whereis命令的基本使用 一、whereis命令介紹二、whereis命令的使用幫助2.1 whereis命令的幫助信息2.2 whereis命令幫助解釋 三、whereis命令的基本使用3.1 查找命令的位置3.2 僅查找二進制文件3.3 僅查找手冊頁3.4 輸出實際使用的查找路徑3.5 指定自定義搜索路徑 四…

Autosar-以太網是怎么運行的?(Davinci配置部分)

寫在前面&#xff1a; 入行一段時間了&#xff0c;基于個人理解整理一些東西&#xff0c;如有錯誤&#xff0c;歡迎各位大佬評論區指正&#xff01;&#xff01;&#xff01; 目錄 1.Autosar ETH通訊軟件架構 2.Ethernet MCAL配置 2.1配置對應Pin屬性 2.2配置TXD引腳 2.3配…

2024年度總結

首先&#xff0c;我是在2023年結束高中生涯進入大學的&#xff0c;難免會有固化的“高中生”思維&#xff0c;我等著老師的安排&#xff0c;看著課表上課&#xff0c;跟著時間吃飯&#xff0c;睡覺&#xff0c;偶爾會熬夜&#xff0c;但整體跟高中沒差太多。我對社團沒興趣&…

【Block總結】CSAM,包含分割、關鍵點、切分等均適用!|即插即用

論文信息 標題: CSAM: A 2.5D Cross-Slice Attention Module for Anisotropic Volumetric Medical Image Segmentation 論文鏈接: https://arxiv.org/pdf/2311.04942 GitHub鏈接: https://github.com/aL3x-O-o-Hung/CSAM 創新點 CSAM&#xff08;跨切片注意力模塊&#xff…

解決PyG安裝中torch-sparse安裝失敗問題:詳細指南

1 問題描述 最近在學習GNN&#xff0c;需要使用PyTorch Geometric&#xff08;PyG&#xff09;庫。在安裝PyG的過程中&#xff0c;遇到了torch-sparse安裝失敗的問題&#xff0c;錯誤提示為&#xff1a; ERROR: Failed building wheel for torch-sparse本文將詳細記錄問題的解…

鳥哥Linux私房菜筆記(三)

鳥哥Linux私房菜筆記&#xff08;三&#xff09; 該第三部分和第四部分主要為原書的第十一章&#xff08;正則表達式與文件格式化處理&#xff09;&#xff0c;第十二章學習shell腳本&#xff0c;第十六章&#xff08;進程管理與SElinux初探部分&#xff09;&#xff0c;第十七…

學習日記-250203

一.論文 看師兄寫好的一稿。 二、計劃&#xff1a; 繼續看論文里的問題。 然后繼續看promptCD相關&#xff0c;明天要看論文啦,今天家里有些事比較忙&#xff08;碎碎念&#xff09; 三. &#xff09;——&#xff08; 注冊了 openreview,ORCID,Google scholar&…

python學opencv|讀取圖像(五十四)使用cv2.blur()函數實現圖像像素均值處理

【1】引言 前序學習進程中&#xff0c;對圖像的操作均基于各個像素點上的BGR值不同而展開。 對于彩色圖像&#xff0c;每個像素點上的BGR值為三個整數&#xff0c;因為是三通道圖像&#xff1b;對于灰度圖像&#xff0c;各個像素上的BGR值是一個整數&#xff0c;因為這是單通…

Kafka ACL(訪問控制列表)介紹

文章目錄 Kafka ACL&#xff08;訪問控制列表&#xff09;介紹1. Kafka ACL 的基本概念1.1 Kafka ACL 的目標1.2 Kafka ACL 的組成部分 2. Kafka 支持的資源類型2.1 Topic&#xff08;主題&#xff09;2.2 Consumer Group&#xff08;消費者組&#xff09;2.3 Cluster&#xff…

在 WSL2 中重啟 Ubuntu 實例

在 WSL2 中重啟 Ubuntu 實例&#xff0c;可以按照以下步驟操作&#xff1a; 方法 1: 使用 wsl 命令 關閉 Ubuntu 實例: 打開 PowerShell 或命令提示符&#xff0c;運行以下命令&#xff1a; wsl --shutdown這會關閉所有 WSL2 實例。 重新啟動 Ubuntu: 再次打開 Ubuntu&#x…

Spring Boot 2 快速教程:WebFlux處理流程(五)

WebFlux請求處理流程 下面是spring mvc的請求處理流程 具體步驟&#xff1a; 第一步&#xff1a;發起請求到前端控制器(DispatcherServlet) 第二步&#xff1a;前端控制器請求HandlerMapping查找 Handler &#xff08;可以根據xml配置、注解進行查找&#xff09; 匹配條件包括…

小程序設計和開發:如何研究同類型小程序的優點和不足。

一、確定研究目標和范圍 明確研究目的 在開始研究同類型小程序之前&#xff0c;首先需要明確研究的目的。是為了改進自己的小程序設計和開發&#xff0c;還是為了了解市場趨勢和用戶需求&#xff1f;不同的研究目的會影響研究的方法和重點。例如&#xff0c;如果研究目的是為了…

使用 Numpy 自定義數據集,使用pytorch框架實現邏輯回歸并保存模型,然后保存模型后再加載模型進行預測,對預測結果計算精確度和召回率及F1分數

1. 導入必要的庫 首先&#xff0c;導入我們需要的庫&#xff1a;Numpy、Pytorch 和相關工具包。 import numpy as np import torch import torch.nn as nn import torch.optim as optim from sklearn.metrics import accuracy_score, recall_score, f1_score2. 自定義數據集 …

Unity-編譯構建Android的問題記錄

文章目錄 報錯&#xff1a;AAPT2 aapt2-4.1.2-6503028-osx Daemon #0 Failed to shutdown within timeout報錯信息解讀&#xff1a;原因分析最終處理方法 報錯&#xff1a;AAPT2 aapt2-4.1.2-6503028-osx Daemon #0 Failed to shutdown within timeout 報錯信息解讀&#xff1…

【axios二次封裝】

axios二次封裝 安裝封裝使用 安裝 pnpm add axios封裝 // 進行axios二次封裝&#xff1a;使用請求與響應攔截器 import axios from axios import { ElMessage } from element-plus//創建axios實例 const request axios.create({baseURL: import.meta.env.VITE_APP_BASE_API,…

SQL進階實戰技巧:如何構建用戶行為轉移概率矩陣,深入洞察會話內活動流轉?

目錄 1 場景描述 1.1 用戶行為轉移概率矩陣概念 1.2 用戶行為轉移概率矩陣構建方法 (1) 數據收集