player_adapter.h 4.8 KB

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