player_adapter.h 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. #pragma once
  2. #include "player_core.h"
  3. #include "opengl_video_renderer.h"
  4. #include <QObject>
  5. #include <QTimer>
  6. #include <memory>
  7. namespace av {
  8. namespace player {
  9. /**
  10. * @brief 播放器适配器,用于将新的播放器核心与Qt UI进行集成
  11. *
  12. * 这个类作为新播放器核心和现有AVPlayer2 UI之间的桥梁,
  13. * 提供Qt信号槽机制,便于UI集成
  14. */
  15. class PlayerAdapter : public QObject, public PlayerEventCallback
  16. {
  17. Q_OBJECT
  18. public:
  19. explicit PlayerAdapter(QObject* parent = nullptr);
  20. ~PlayerAdapter() override;
  21. /**
  22. * @brief 获取播放器核心实例
  23. */
  24. PlayerCore* getPlayerCore() const { return m_playerCore.get(); }
  25. /**
  26. * @brief 设置视频渲染器(传统QLabel渲染器)
  27. */
  28. void setVideoRenderer(VideoRenderer* renderer);
  29. /**
  30. * @brief 设置OpenGL视频渲染器(推荐)
  31. */
  32. void setOpenGLVideoRenderer(OpenGLVideoRenderer* renderer);
  33. // 播放控制接口
  34. Q_INVOKABLE av::ErrorCode openFile(const QString& filename);
  35. Q_INVOKABLE av::ErrorCode play();
  36. Q_INVOKABLE av::ErrorCode pause();
  37. Q_INVOKABLE av::ErrorCode stop();
  38. Q_INVOKABLE av::ErrorCode seek(qint64 timestamp);
  39. Q_INVOKABLE av::ErrorCode setPlaybackSpeed(double speed);
  40. // 状态查询接口
  41. Q_INVOKABLE PlayerState getState() const;
  42. Q_INVOKABLE qint64 getCurrentTime() const;
  43. Q_INVOKABLE qint64 getDuration() const;
  44. Q_INVOKABLE double getPlaybackSpeed() const;
  45. // 音量控制
  46. Q_INVOKABLE void setVolume(double volume);
  47. Q_INVOKABLE double getVolume() const;
  48. Q_INVOKABLE void setMuted(bool muted);
  49. Q_INVOKABLE bool isMuted() const;
  50. // 媒体信息
  51. Q_INVOKABLE MediaInfo getMediaInfo() const;
  52. Q_INVOKABLE PlaybackStats getStats() const;
  53. // 帧获取接口(用于视频渲染器)
  54. AVFrame* getNextVideoFrame();
  55. AVFrame* getNextAudioFrame();
  56. void releaseVideoFrame(AVFrame* frame);
  57. void releaseAudioFrame(AVFrame* frame);
  58. // 启动/停止更新定时器
  59. void startUpdateTimer(int intervalMs = 16); // 默认60fps
  60. void stopUpdateTimer();
  61. public slots:
  62. /**
  63. * @brief 更新播放器状态(由定时器调用)
  64. */
  65. void updatePlayer();
  66. signals:
  67. /**
  68. * @brief 播放器状态改变信号
  69. */
  70. void stateChanged(PlayerState state);
  71. /**
  72. * @brief 媒体信息改变信号
  73. */
  74. void mediaInfoChanged(const MediaInfo& info);
  75. /**
  76. * @brief 播放位置改变信号
  77. */
  78. void positionChanged(qint64 position);
  79. /**
  80. * @brief 播放时长改变信号
  81. */
  82. void durationChanged(qint64 duration);
  83. /**
  84. * @brief 音量改变信号
  85. */
  86. void volumeChanged(double volume);
  87. /**
  88. * @brief 静音状态改变信号
  89. */
  90. void mutedChanged(bool muted);
  91. /**
  92. * @brief 播放速度改变信号
  93. */
  94. void playbackSpeedChanged(double speed);
  95. /**
  96. * @brief 错误发生信号
  97. */
  98. void errorOccurred(const QString& error);
  99. /**
  100. * @brief 播放结束信号
  101. */
  102. void playbackFinished();
  103. /**
  104. * @brief 统计信息更新信号
  105. */
  106. void statsUpdated(const PlaybackStats& stats);
  107. /**
  108. * @brief 新视频帧可用信号
  109. */
  110. void videoFrameAvailable();
  111. /**
  112. * @brief 新音频帧可用信号
  113. */
  114. void audioFrameAvailable();
  115. /**
  116. * @brief OpenGL渲染器初始化完成信号
  117. */
  118. void openGLRendererInitialized();
  119. /**
  120. * @brief 渲染器类型改变信号
  121. */
  122. void rendererTypeChanged(const QString& type);
  123. protected:
  124. // PlayerEventCallback 接口实现
  125. void onStateChanged(PlayerState state) override;
  126. void onMediaInfoChanged(const MediaInfo& info) override;
  127. void onPositionChanged(int64_t position) override;
  128. void onErrorOccurred(const std::string& error) override;
  129. void onEndOfFile() override;
  130. private:
  131. std::unique_ptr<PlayerCore> m_playerCore;
  132. QTimer* m_updateTimer;
  133. // 渲染器管理
  134. VideoRenderer* m_videoRenderer = nullptr;
  135. OpenGLVideoRenderer* m_openGLVideoRenderer = nullptr;
  136. QString m_currentRendererType = "None";
  137. // 缓存的状态信息
  138. PlayerState m_lastState = PlayerState::Idle;
  139. qint64 m_lastPosition = 0;
  140. qint64 m_lastDuration = 0;
  141. double m_lastVolume = 1.0;
  142. bool m_muted = false;
  143. double m_lastPlaybackSpeed = 1.0;
  144. /**
  145. * @brief 检查并发送位置变化信号
  146. */
  147. void checkPositionChanged();
  148. /**
  149. * @brief 检查并发送时长变化信号
  150. */
  151. void checkDurationChanged();
  152. /**
  153. * @brief 将std::string转换为QString
  154. */
  155. QString toQString(const std::string& str) const;
  156. /**
  157. * @brief 更新渲染器类型
  158. */
  159. void updateRendererType();
  160. /**
  161. * @brief 获取当前渲染器类型
  162. */
  163. QString getCurrentRendererType() const { return m_currentRendererType; }
  164. };
  165. /**
  166. * @brief 播放器适配器工厂类
  167. */
  168. class PlayerAdapterFactory {
  169. public:
  170. /**
  171. * @brief 创建播放器适配器实例
  172. */
  173. static std::unique_ptr<PlayerAdapter> create(QObject* parent = nullptr);
  174. /**
  175. * @brief 创建共享的播放器适配器实例
  176. */
  177. static std::shared_ptr<PlayerAdapter> createShared(QObject* parent = nullptr);
  178. };
  179. } // namespace player
  180. } // namespace av
  181. // 注册Qt元类型
  182. Q_DECLARE_METATYPE(av::player::PlayerState)
  183. Q_DECLARE_METATYPE(av::player::MediaInfo)
  184. Q_DECLARE_METATYPE(av::player::PlaybackStats)
  185. Q_DECLARE_METATYPE(av::ErrorCode)