| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220 |
- #pragma once
- #include "player_core.h"
- #include "opengl_video_renderer.h"
- #include <QObject>
- #include <QTimer>
- #include <memory>
- namespace av {
- namespace player {
- /**
- * @brief 播放器适配器,用于将新的播放器核心与Qt UI进行集成
- *
- * 这个类作为新播放器核心和现有AVPlayer2 UI之间的桥梁,
- * 提供Qt信号槽机制,便于UI集成
- */
- class PlayerAdapter : public QObject, public PlayerEventCallback
- {
- Q_OBJECT
- public:
- explicit PlayerAdapter(QObject* parent = nullptr);
- ~PlayerAdapter() override;
- /**
- * @brief 获取播放器核心实例
- */
- PlayerCore* getPlayerCore() const { return m_playerCore.get(); }
-
- /**
- * @brief 设置OpenGL视频渲染器(推荐)
- */
- void setOpenGLVideoRenderer(OpenGLVideoRenderer* renderer);
-
- // 播放控制接口
- Q_INVOKABLE av::ErrorCode openFile(const QString& filename);
- Q_INVOKABLE av::ErrorCode play();
- Q_INVOKABLE av::ErrorCode pause();
- Q_INVOKABLE av::ErrorCode stop();
- Q_INVOKABLE av::ErrorCode seek(qint64 timestamp);
- Q_INVOKABLE av::ErrorCode setPlaybackSpeed(double speed);
-
- // 状态查询接口
- Q_INVOKABLE PlayerState getState() const;
- Q_INVOKABLE qint64 getCurrentTime() const;
- Q_INVOKABLE qint64 getDuration() const;
- Q_INVOKABLE double getPlaybackSpeed() const;
-
- // 音量控制
- Q_INVOKABLE void setVolume(double volume);
- Q_INVOKABLE double getVolume() const;
- Q_INVOKABLE void setMuted(bool muted);
- Q_INVOKABLE bool isMuted() const;
-
- // 媒体信息
- Q_INVOKABLE MediaInfo getMediaInfo() const;
- Q_INVOKABLE PlaybackStats getStats() const;
-
- // 帧获取接口(用于视频渲染器)
- AVFrame* getNextVideoFrame();
- AVFrame* getNextAudioFrame();
- void releaseVideoFrame(AVFrame* frame);
- void releaseAudioFrame(AVFrame* frame);
-
- // 启动/停止更新定时器
- void startUpdateTimer(int intervalMs = 16); // 默认60fps
- void stopUpdateTimer();
-
- public slots:
- /**
- * @brief 更新播放器状态(由定时器调用)
- */
- void updatePlayer();
-
- signals:
- /**
- * @brief 播放器状态改变信号
- */
- void stateChanged(PlayerState state);
-
- /**
- * @brief 媒体信息改变信号
- */
- void mediaInfoChanged(const MediaInfo& info);
-
- /**
- * @brief 播放位置改变信号
- */
- void positionChanged(qint64 position);
-
- /**
- * @brief 播放时长改变信号
- */
- void durationChanged(qint64 duration);
-
- /**
- * @brief 音量改变信号
- */
- void volumeChanged(double volume);
-
- /**
- * @brief 静音状态改变信号
- */
- void mutedChanged(bool muted);
-
- /**
- * @brief 播放速度改变信号
- */
- void playbackSpeedChanged(double speed);
-
- /**
- * @brief 错误发生信号
- */
- void errorOccurred(const QString& error);
-
- /**
- * @brief 播放结束信号
- */
- void playbackFinished();
-
- /**
- * @brief 统计信息更新信号
- */
- void statsUpdated(const PlaybackStats& stats);
-
- /**
- * @brief 新视频帧可用信号
- */
- void videoFrameAvailable();
-
- /**
- * @brief 新音频帧可用信号
- */
- void audioFrameAvailable();
-
- /**
- * @brief OpenGL渲染器初始化完成信号
- */
- void openGLRendererInitialized();
-
- /**
- * @brief 渲染器类型改变信号
- */
- void rendererTypeChanged(const QString& type);
-
- protected:
- // PlayerEventCallback 接口实现
- void onStateChanged(PlayerState state) override;
- void onMediaInfoChanged(const MediaInfo& info) override;
- void onPositionChanged(int64_t position) override;
- void onErrorOccurred(const std::string& error) override;
- void onEndOfFile() override;
-
- private:
- std::unique_ptr<PlayerCore> m_playerCore;
- QTimer* m_updateTimer;
-
- // 渲染器管理
- OpenGLVideoRenderer* m_openGLVideoRenderer = nullptr;
- QString m_currentRendererType = "None";
-
- // 缓存的状态信息
- PlayerState m_lastState = PlayerState::Idle;
- qint64 m_lastPosition = 0;
- qint64 m_lastDuration = 0;
- double m_lastVolume = 1.0;
- bool m_muted = false;
- double m_lastPlaybackSpeed = 1.0;
-
- /**
- * @brief 检查并发送位置变化信号
- */
- void checkPositionChanged();
-
- /**
- * @brief 检查并发送时长变化信号
- */
- void checkDurationChanged();
-
- /**
- * @brief 将std::string转换为QString
- */
- QString toQString(const std::string& str) const;
-
- /**
- * @brief 更新渲染器类型
- */
- void updateRendererType();
-
- /**
- * @brief 获取当前渲染器类型
- */
- QString getCurrentRendererType() const { return m_currentRendererType; }
- };
- /**
- * @brief 播放器适配器工厂类
- */
- class PlayerAdapterFactory {
- public:
- /**
- * @brief 创建播放器适配器实例
- */
- static std::unique_ptr<PlayerAdapter> create(QObject* parent = nullptr);
-
- /**
- * @brief 创建共享的播放器适配器实例
- */
- static std::shared_ptr<PlayerAdapter> createShared(QObject* parent = nullptr);
- };
- } // namespace player
- } // namespace av
- // 注册Qt元类型
- Q_DECLARE_METATYPE(av::player::PlayerState)
- Q_DECLARE_METATYPE(av::player::MediaInfo)
- Q_DECLARE_METATYPE(av::player::PlaybackStats)
- Q_DECLARE_METATYPE(av::ErrorCode)
|