VideoPlayer1.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. #include "VideoPlayer1.h"
  2. #include "videodecode.h"
  3. #include <QPainter>
  4. #include <QResizeEvent>
  5. #include <QEventLoop>
  6. #include <QVBoxLayout>
  7. #include "spdlog/spdlog.h"
  8. #include "FmtLog/fmtlog.h"
  9. VideoPlayer1::VideoPlayer1(QWidget *parent) : QWidget(parent)
  10. {
  11. m_timerRefreshUI.setSingleShot(false);
  12. /* 设置精度毫秒级 */
  13. m_timerRefreshUI.setTimerType(Qt::PreciseTimer);
  14. connect(&m_timerRefreshUI, &QTimer::timeout, this, &VideoPlayer1::do_refreshUI);
  15. }
  16. VideoPlayer1::~VideoPlayer1()
  17. {
  18. if(m_timerRefreshUI.isActive())
  19. {
  20. m_timerRefreshUI.stop();
  21. }
  22. delete m_decodeVedio;
  23. if(m_image)
  24. {
  25. delete m_image;
  26. }
  27. }
  28. /**
  29. * @brief 设置播放视频,启动定时器,定时器间隔决定播放的速度
  30. * 视频的宽和高使用QImage进行缩放
  31. * 视频大小在直接设置这个类的resize即可,有最小大小限制
  32. *
  33. * @param fileName
  34. */
  35. void VideoPlayer1::setPlayVedio(const QString& fileName)
  36. {
  37. m_decodeVedio = new VideoDecode();
  38. m_decodeVedio->open(fileName);
  39. m_fileName = fileName;
  40. }
  41. /* 播放视频 */
  42. bool VideoPlayer1::play()
  43. {
  44. if(m_playStatus)
  45. {
  46. return false;
  47. }
  48. /* 设置刷新时间 */
  49. m_timerRefreshUI.setSingleShot(false);
  50. m_interval = 1000/25;
  51. SPDLOG_TRACE("刷新UI的定时间隔:{}",m_interval);
  52. m_timerRefreshUI.start(m_interval);
  53. m_playStatus = true;
  54. return true;
  55. }
  56. /* 暂停播放 */
  57. void VideoPlayer1::pause()
  58. {
  59. if(!m_playStatus)
  60. {
  61. return;
  62. }
  63. m_timerRefreshUI.stop();
  64. m_playStatus = false;
  65. }
  66. /* 停止播放,停止后停止解码,将时间等复位到开始时间 */
  67. void VideoPlayer1::stop()
  68. {
  69. SPDLOG_DEBUG("...停止播放...");
  70. // m_fileName = QString();
  71. if(m_timerRefreshUI.isActive())
  72. {
  73. m_timerRefreshUI.stop();
  74. }
  75. // SPDLOG_DEBUG("...停止解码...");
  76. /* 重新设置播放视频 */
  77. setPlayVedio(m_fileName);
  78. /* 绘制黑帧 */
  79. // SPDLOG_DEBUG("绘制黑帧");
  80. // m_image = new QImage(m_nowWidth, m_nowHeight, QImage::Format_RGB32);
  81. // m_image->fill(Qt::black);
  82. // update();
  83. m_playStatus = false;
  84. // isSetVedioFile = false;
  85. }
  86. void VideoPlayer1::paintEvent(QPaintEvent *event)
  87. {
  88. if(m_playStatus)
  89. {
  90. SPDLOG_TRACE("开始绘制画面...");
  91. /* 对图像进行缩放 */
  92. QImage image = m_decodeVedio->read();
  93. if(m_srcWidth != m_nowWidth || m_srcHeight != m_nowHeight)
  94. {
  95. image = image.scaled(m_nowWidth, m_nowHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation);
  96. }
  97. QPainter painter(this);
  98. painter.drawImage(0, 0, image);
  99. }
  100. }
  101. void VideoPlayer1::resizeEvent(QResizeEvent *event)
  102. {
  103. SPDLOG_TRACE("窗口大小改变...");
  104. m_nowWidth = event->size().width();
  105. m_nowHeight = event->size().height();
  106. /* 传递给解码器 */
  107. // m_decodeVedio->setVideoSize(m_nowWidth, m_nowHeight);
  108. QWidget::resizeEvent(event);
  109. }
  110. /* 刷新一张图片,直到有图片为止 */
  111. void VideoPlayer1::refreshOneUIUntilHave()
  112. {
  113. update();
  114. }
  115. /* 双击事件函数 */
  116. void VideoPlayer1::mouseDoubleClickEvent(QMouseEvent *event)
  117. {
  118. if(event->button() == Qt::LeftButton)
  119. {
  120. // SPDLOG_DEBUG("双击事件...");
  121. // if(m_funcPlayCB != nullptr)
  122. // {
  123. // m_funcPlayCB(this, 5, nullptr, 0, m_context);
  124. // }else {
  125. // SPDLOG_INFO("没有设置回调函数");
  126. // }
  127. }
  128. }
  129. /* 取出画面,刷新UI */
  130. void VideoPlayer1::do_refreshUI()
  131. {
  132. update();
  133. }
  134. /* 通过信号刷新第一张图片 */
  135. void VideoPlayer1::do_refreshOneUI()
  136. {
  137. }
  138. /* 播放完成 */
  139. void VideoPlayer1::do_playCompleted()
  140. {
  141. SPDLOG_INFO("Video 播放完成...");
  142. m_timerRefreshUI.stop();
  143. m_playStatus = false;
  144. // if(m_funcPlayCB != nullptr)
  145. // {
  146. // /* 播放完成的回调函数 */
  147. // m_funcPlayCB(this, 2, nullptr, 0, m_context);
  148. // }
  149. }