player_adapter.h 5.4 KB

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