中立建设集团有限公司网站,家在深圳光明,企业组网配置实例,外贸网站建设开发一、前言说明
音视频开发除了应用在安防监控、视频网站、各种流媒体app开发之外#xff0c;还有一个小众的市场#xff0c;那就是多媒体展厅场景#xff0c;这个场景目前处于垄断地位的软件是HirenderS3#xff0c;做的非常早而且非常全面#xff0c;都是通用的需求…一、前言说明
音视频开发除了应用在安防监控、视频网站、各种流媒体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.hSINGLETON_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;}
}四、相关地址
国内站点https://gitee.com/feiyangqingyun国际站点https://github.com/feiyangqingyun个人作品https://blog.csdn.net/feiyangqingyun/article/details/97565652文件地址https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g 提取码01jf 文件名bin_video_sync。
五、功能特点
实时帧同步本地无缝拼接多个视频。支持网络同步可选主控端和被控端主控端将本地播放的进度实时同步到被控端。网络同步支持组播、广播、单播三种模式默认组播既可以跨网段也可以避免广播数据风暴。默认开启自动同步也可以手动同步和复位同步手动同步是立即执行一次同步将第一个视频的进度同步到其他视频文件复位同步是将所有视频播放进度切换到最开始0的位置。支持各种视音频文件包括但不限于mp4/mov/mkv/rmvb/avi等格式。硬解码和GPU绘制最大化利用硬件资源支持qsv/cuda/dxva2/d3d11va/vaapi等硬解码。极低的CPU占用8K30fps只占不到1%的CPU解码和绘制全部交给GPU。提供示例按照行列生成多个视频播放窗口每个窗口可以选择不同的视频文件在手动同步模式下可以切换任意一个视频播放进度会将所有的视频按照这个进度同步。自动循环播放视频文件无缝切换循环播放看起来非常丝滑。支持Qt4/Qt5/Qt6所有版本支持各种操作系统包括国产OS和嵌入式OS。