123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- #include "VideoPlayer1.h"
- #include "videodecode.h"
- #include <QPainter>
- #include <QResizeEvent>
- #include <QEventLoop>
- #include <QVBoxLayout>
- #include "spdlog/spdlog.h"
- #include "FmtLog/fmtlog.h"
- VideoPlayer1::VideoPlayer1(QWidget *parent) : QWidget(parent)
- {
- m_timerRefreshUI.setSingleShot(false);
- /* 设置精度毫秒级 */
- m_timerRefreshUI.setTimerType(Qt::PreciseTimer);
- connect(&m_timerRefreshUI, &QTimer::timeout, this, &VideoPlayer1::do_refreshUI);
- }
- VideoPlayer1::~VideoPlayer1()
- {
- if(m_timerRefreshUI.isActive())
- {
- m_timerRefreshUI.stop();
- }
- delete m_decodeVedio;
- if(m_image)
- {
- delete m_image;
- }
- }
- /**
- * @brief 设置播放视频,启动定时器,定时器间隔决定播放的速度
- * 视频的宽和高使用QImage进行缩放
- * 视频大小在直接设置这个类的resize即可,有最小大小限制
- *
- * @param fileName
- */
- void VideoPlayer1::setPlayVedio(const QString& fileName)
- {
- m_decodeVedio = new VideoDecode();
- m_decodeVedio->open(fileName);
- m_fileName = fileName;
-
- }
- /* 播放视频 */
- bool VideoPlayer1::play()
- {
- if(m_playStatus)
- {
- return false;
- }
-
- /* 设置刷新时间 */
- m_timerRefreshUI.setSingleShot(false);
- m_interval = 1000/25;
- SPDLOG_TRACE("刷新UI的定时间隔:{}",m_interval);
- m_timerRefreshUI.start(m_interval);
- m_playStatus = true;
- return true;
- }
- /* 暂停播放 */
- void VideoPlayer1::pause()
- {
- if(!m_playStatus)
- {
- return;
- }
- m_timerRefreshUI.stop();
- m_playStatus = false;
- }
- /* 停止播放,停止后停止解码,将时间等复位到开始时间 */
- void VideoPlayer1::stop()
- {
- SPDLOG_DEBUG("...停止播放...");
- // m_fileName = QString();
- if(m_timerRefreshUI.isActive())
- {
- m_timerRefreshUI.stop();
- }
- // SPDLOG_DEBUG("...停止解码...");
-
- /* 重新设置播放视频 */
- setPlayVedio(m_fileName);
- /* 绘制黑帧 */
- // SPDLOG_DEBUG("绘制黑帧");
- // m_image = new QImage(m_nowWidth, m_nowHeight, QImage::Format_RGB32);
- // m_image->fill(Qt::black);
- // update();
- m_playStatus = false;
- // isSetVedioFile = false;
- }
- void VideoPlayer1::paintEvent(QPaintEvent *event)
- {
- if(m_playStatus)
- {
- SPDLOG_TRACE("开始绘制画面...");
- /* 对图像进行缩放 */
- QImage image = m_decodeVedio->read();
- if(m_srcWidth != m_nowWidth || m_srcHeight != m_nowHeight)
- {
- image = image.scaled(m_nowWidth, m_nowHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation);
- }
- QPainter painter(this);
- painter.drawImage(0, 0, image);
- }
- }
- void VideoPlayer1::resizeEvent(QResizeEvent *event)
- {
- SPDLOG_TRACE("窗口大小改变...");
- m_nowWidth = event->size().width();
- m_nowHeight = event->size().height();
- /* 传递给解码器 */
- // m_decodeVedio->setVideoSize(m_nowWidth, m_nowHeight);
- QWidget::resizeEvent(event);
- }
- /* 刷新一张图片,直到有图片为止 */
- void VideoPlayer1::refreshOneUIUntilHave()
- {
- update();
- }
- /* 双击事件函数 */
- void VideoPlayer1::mouseDoubleClickEvent(QMouseEvent *event)
- {
- if(event->button() == Qt::LeftButton)
- {
- // SPDLOG_DEBUG("双击事件...");
- // if(m_funcPlayCB != nullptr)
- // {
- // m_funcPlayCB(this, 5, nullptr, 0, m_context);
- // }else {
- // SPDLOG_INFO("没有设置回调函数");
- // }
- }
- }
- /* 取出画面,刷新UI */
- void VideoPlayer1::do_refreshUI()
- {
- update();
- }
- /* 通过信号刷新第一张图片 */
- void VideoPlayer1::do_refreshOneUI()
- {
- }
- /* 播放完成 */
- void VideoPlayer1::do_playCompleted()
- {
- SPDLOG_INFO("Video 播放完成...");
- m_timerRefreshUI.stop();
- m_playStatus = false;
- // if(m_funcPlayCB != nullptr)
- // {
- // /* 播放完成的回调函数 */
- // m_funcPlayCB(this, 2, nullptr, 0, m_context);
- // }
- }
|