VideoPlayer.h 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. #ifndef VideoPlayer_H
  2. #define VideoPlayer_H
  3. #include "IVideoPlayer.h"
  4. #include "FrameFormat.h"
  5. // #include <QObject>
  6. #include <QThread>
  7. #include <QTimer>
  8. #include <QSemaphore>
  9. class DecodeVedio;
  10. class QWidget;
  11. class VideoPlayer : public IVideoPlayer
  12. {
  13. Q_OBJECT
  14. public:
  15. explicit VideoPlayer();
  16. ~VideoPlayer() override;
  17. /* 打开播放视频 */
  18. bool openPlayVedio(const QString& fileName) override;
  19. /* 播放视频 */
  20. bool play() override;
  21. /* 暂停播放 */
  22. void pause() override;
  23. /* 停止播放 */
  24. void stop() override;
  25. /* 后退,单位ms */
  26. void backward(qint64 ms) override;
  27. /* 前进,单位ms */
  28. void forward(qint64 ms) override;
  29. /* 获取播放状态 */
  30. bool getPlayStatus() override { return m_playStatus; }
  31. /* 获取视频时长 */
  32. qint64 getDuration() override;
  33. /* 获取当前播放位置 */
  34. qint64 getCurrentPos() override;
  35. /* 设置当前播放位置 */
  36. void setCurrentPos(qint64 pos) override;
  37. /* 设置播放视频窗口的大小 */
  38. void setPlayWidgetSize(int width,int height) override;
  39. /* 设置播放窗口 */
  40. void setWidgetParent(QWidget* widget, bool isFull = false) override;
  41. /* 获取播放窗口的指针 */
  42. QWidget* getPlayWidget() const override { return m_playWidget; }
  43. /* 设置预览图片数目,在暂停时跳转,可能会有花屏或者黑帧,可以设置跳转图片个数跳过黑帧 */
  44. void setPreviewImage(int num = 2) override;
  45. /* 设置帧率,用于控制播放速度 */
  46. void setFPS(int fps);
  47. /* 设置播放速度 */
  48. void setPlaySpeed(float speed) override;
  49. // void setPlayCallBack(std::function<Play_CallBack> playCallBack,void* context); /* 设置播放回调函数 */
  50. signals:
  51. // void signal_playCompleted(); /* 播放完成信号 */
  52. void signal_refreshImage(); /* 刷新图片信号 */
  53. protected:
  54. /* 刷新一张图片,直到有图片为止 */
  55. void refreshOneUIUntilHave();
  56. /* 刷新一帧 */
  57. inline void refreshFrame(FrameBase* frame);
  58. private slots:
  59. void do_refreshUI(); /* 取出画面,刷新UI */
  60. void do_refreshSamImage(); /* 通过信号刷新图片 */
  61. void do_playCompleted(); /* 播放完成 */
  62. private:
  63. bool isLocalFile(const QString& fileName); /* 判断是否是本地文件 */
  64. private:
  65. QWidget* m_playWidget = nullptr; /* 播放窗口 */
  66. bool m_isLocalFile = false; /* 是否是本地文件 */
  67. QString m_fileName;
  68. QTimer m_timerRefreshUI; /* 定时器,用于刷新界面 */
  69. int m_srcWidth = 0; /* 视频原本大小 */
  70. int m_srcHeight = 0;
  71. int m_nowWidth = 0; /* 现在大小 */
  72. int m_nowHeight = 0;
  73. int m_fps = 0; /* 帧数 */
  74. int m_interval = 0; /* 定时器定时间隔,帧率的倒数,单位ms */
  75. qint64 m_duration = 0; /* 时长,单位ms */
  76. DecodeVedio* m_decodeVedio = nullptr;
  77. QThread* m_threadDecode = nullptr; /* 解码器所在的线程 */
  78. FrameBase* m_image = nullptr; /* 一帧画面 */
  79. bool m_playStatus = false; /* 是否正在播放 */
  80. bool m_isOpenFile = false; /* 是否打开了视频文件,未打开视频文件也就是未初始化解码线程 */
  81. QSemaphore* m_semRefresh = nullptr; /* 刷新信号量 */
  82. int m_previewImage = 0; /* 预览图片数目 */
  83. // std::function<Play_CallBack> m_funcPlayCB = nullptr; /* 播放回调函数 */
  84. // void* m_context = nullptr; /* 上下文 */
  85. };
  86. #endif /* VideoPlayer_H */