#pragma once #include "player_core.h" #include #include #include 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 设置视频渲染器 */ void setVideoRenderer(VideoRenderer* 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(); 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 m_playerCore; QTimer* m_updateTimer; // 缓存的状态信息 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 播放器适配器工厂类 */ class PlayerAdapterFactory { public: /** * @brief 创建播放器适配器实例 */ static std::unique_ptr create(QObject* parent = nullptr); /** * @brief 创建共享的播放器适配器实例 */ static std::shared_ptr 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)