#ifndef IPLAYERCONTROLLER_H #define IPLAYERCONTROLLER_H #include #include #include #include #include #include namespace AVPlayer2 { namespace Core { /** * 播放器状态枚举 */ enum class PlayerState { Stopped, // 停止状态 Loading, // 加载中 Loaded, // 已加载 Playing, // 播放中 Paused, // 暂停 Seeking, // 跳转中 Buffering, // 缓冲中 Error // 错误状态 }; /** * 播放模式枚举 */ enum class PlayMode { Normal, // 正常播放 Loop, // 循环播放 Shuffle, // 随机播放 RepeatOne // 单曲循环 }; /** * 缩放模式枚举 */ enum class ScaleMode { Fit, // 适应窗口 Fill, // 填充窗口 Stretch, // 拉伸 Original, // 原始大小 Custom // 自定义 }; } // namespace Core namespace Types { /** * 播放器配置 */ struct PlayerConfig { bool enableHardwareDecoding; // 启用硬件解码 bool enableAudioOutput; // 启用音频输出 bool enableVideoOutput; // 启用视频输出 bool enableSubtitles; // 启用字幕 int maxVideoFrameBuffer; // 最大视频帧缓冲 int maxAudioFrameBuffer; // 最大音频帧缓冲 double seekAccuracy; // 跳转精度(秒) bool autoPlay; // 自动播放 double defaultVolume; // 默认音量(0.0-1.0) Core::PlayMode defaultPlayMode; // 默认播放模式 Core::ScaleMode defaultScaleMode; // 默认缩放模式 std::string userAgent; // 用户代理 int networkTimeout; // 网络超时(毫秒) PlayerConfig() { enableHardwareDecoding = true; enableAudioOutput = true; enableVideoOutput = true; enableSubtitles = true; maxVideoFrameBuffer = 10; maxAudioFrameBuffer = 20; seekAccuracy = 1.0; autoPlay = false; defaultVolume = 1.0; defaultPlayMode = Core::PlayMode::Normal; defaultScaleMode = Core::ScaleMode::Fit; userAgent = "AVPlayer2/1.0"; networkTimeout = 30000; } }; /** * 播放器统计信息 */ struct PlayerStats { std::chrono::microseconds totalDuration; // 总时长 std::chrono::microseconds currentPosition; // 当前位置 double playbackSpeed; // 播放速度 int videoFrameRate; // 视频帧率 int audioSampleRate; // 音频采样率 int videoBitrate; // 视频比特率 int audioBitrate; // 音频比特率 int droppedFrames; // 丢弃帧数 int renderedFrames; // 渲染帧数 double bufferHealth; // 缓冲健康度(0.0-1.0) std::string videoCodec; // 视频编解码器 std::string audioCodec; // 音频编解码器 PlayerStats() { totalDuration = std::chrono::microseconds(0); currentPosition = std::chrono::microseconds(0); playbackSpeed = 1.0; videoFrameRate = 0; audioSampleRate = 0; videoBitrate = 0; audioBitrate = 0; droppedFrames = 0; renderedFrames = 0; bufferHealth = 0.0; } }; /** * 播放列表项 */ struct PlaylistItem { std::string id; // 项目ID std::string url; // 媒体URL std::string title; // 标题 std::string artist; // 艺术家 std::string album; // 专辑 std::chrono::microseconds duration; // 时长 std::map metadata; // 元数据 PlaylistItem() { duration = std::chrono::microseconds(0); } }; /** * 字幕信息 */ struct SubtitleTrack { int index; // 轨道索引 std::string language; // 语言 std::string title; // 标题 std::string codec; // 编解码器 bool isDefault; // 是否默认 bool isForced; // 是否强制 SubtitleTrack() { index = -1; isDefault = false; isForced = false; } }; /** * 音频轨道信息 */ struct AudioTrack { int index; // 轨道索引 std::string language; // 语言 std::string title; // 标题 std::string codec; // 编解码器 int channels; // 声道数 int sampleRate; // 采样率 int bitrate; // 比特率 bool isDefault; // 是否默认 AudioTrack() { index = -1; channels = 0; sampleRate = 0; bitrate = 0; isDefault = false; } }; } // namespace Types namespace Core { /** * 播放器控制器抽象接口 * 提供完整的媒体播放控制功能 */ class IPlayerController { public: virtual ~IPlayerController() = default; /** * 初始化播放器 * @param config 播放器配置 * @return 是否初始化成功 */ virtual bool initialize(const Types::PlayerConfig& config) = 0; /** * 释放播放器资源 */ virtual void release() = 0; // ========== 媒体加载 ========== /** * 加载媒体文件 * @param url 媒体文件URL或路径 * @return 是否开始加载 */ virtual bool loadMedia(const std::string& url) = 0; /** * 卸载当前媒体 */ virtual void unloadMedia() = 0; // ========== 播放控制 ========== /** * 开始播放 * @return 是否开始播放 */ virtual bool play() = 0; /** * 暂停播放 */ virtual void pause() = 0; /** * 停止播放 */ virtual void stop() = 0; /** * 跳转到指定位置 * @param position 目标位置(微秒) * @return 是否开始跳转 */ virtual bool seekTo(std::chrono::microseconds position) = 0; /** * 相对跳转 * @param offset 偏移量(微秒,正数向前,负数向后) * @return 是否开始跳转 */ virtual bool seekBy(std::chrono::microseconds offset) = 0; // ========== 播放参数 ========== /** * 设置播放速度 * @param speed 播放速度(1.0为正常速度) */ virtual void setPlaybackSpeed(double speed) = 0; /** * 获取播放速度 * @return 当前播放速度 */ virtual double getPlaybackSpeed() const = 0; /** * 设置音量 * @param volume 音量(0.0-1.0) */ virtual void setVolume(double volume) = 0; /** * 获取音量 * @return 当前音量 */ virtual double getVolume() const = 0; /** * 设置静音 * @param muted 是否静音 */ virtual void setMuted(bool muted) = 0; /** * 获取静音状态 * @return 是否静音 */ virtual bool isMuted() const = 0; // ========== 状态查询 ========== /** * 获取播放器状态 * @return 当前状态 */ virtual PlayerState getState() const = 0; /** * 获取当前播放位置 * @return 当前位置(微秒) */ virtual std::chrono::microseconds getCurrentPosition() const = 0; /** * 获取媒体总时长 * @return 总时长(微秒) */ virtual std::chrono::microseconds getDuration() const = 0; /** * 获取缓冲进度 * @return 缓冲进度(0.0-1.0) */ virtual double getBufferProgress() const = 0; /** * 是否可以播放 * @return 是否可以播放 */ virtual bool canPlay() const = 0; /** * 是否可以暂停 * @return 是否可以暂停 */ virtual bool canPause() const = 0; /** * 是否可以跳转 * @return 是否可以跳转 */ virtual bool canSeek() const = 0; // ========== 轨道管理 ========== /** * 获取音频轨道列表 * @return 音频轨道列表 */ virtual std::vector getAudioTracks() const = 0; /** * 获取字幕轨道列表 * @return 字幕轨道列表 */ virtual std::vector getSubtitleTracks() const = 0; /** * 选择音频轨道 * @param index 轨道索引 * @return 是否选择成功 */ virtual bool selectAudioTrack(int index) = 0; /** * 选择字幕轨道 * @param index 轨道索引(-1表示关闭字幕) * @return 是否选择成功 */ virtual bool selectSubtitleTrack(int index) = 0; /** * 获取当前音频轨道索引 * @return 当前音频轨道索引 */ virtual int getCurrentAudioTrack() const = 0; /** * 获取当前字幕轨道索引 * @return 当前字幕轨道索引 */ virtual int getCurrentSubtitleTrack() const = 0; // ========== 播放列表 ========== /** * 设置播放模式 * @param mode 播放模式 */ virtual void setPlayMode(PlayMode mode) = 0; /** * 获取播放模式 * @return 当前播放模式 */ virtual PlayMode getPlayMode() const = 0; /** * 添加播放列表项 * @param item 播放列表项 * @return 是否添加成功 */ virtual bool addPlaylistItem(const Types::PlaylistItem& item) = 0; /** * 移除播放列表项 * @param index 项目索引 * @return 是否移除成功 */ virtual bool removePlaylistItem(int index) = 0; /** * 清空播放列表 */ virtual void clearPlaylist() = 0; /** * 获取播放列表 * @return 播放列表 */ virtual std::vector getPlaylist() const = 0; /** * 播放指定项目 * @param index 项目索引 * @return 是否开始播放 */ virtual bool playItem(int index) = 0; /** * 播放下一项 * @return 是否开始播放 */ virtual bool playNext() = 0; /** * 播放上一项 * @return 是否开始播放 */ virtual bool playPrevious() = 0; /** * 获取当前播放项索引 * @return 当前播放项索引 */ virtual int getCurrentPlaylistIndex() const = 0; // ========== 视频控制 ========== /** * 设置视频缩放模式 * @param mode 缩放模式 */ virtual void setScaleMode(ScaleMode mode) = 0; /** * 获取视频缩放模式 * @return 当前缩放模式 */ virtual ScaleMode getScaleMode() const = 0; /** * 设置视频旋转角度 * @param angle 旋转角度(度) */ virtual void setRotation(int angle) = 0; /** * 获取视频旋转角度 * @return 当前旋转角度 */ virtual int getRotation() const = 0; // ========== 统计信息 ========== /** * 获取播放器统计信息 * @return 统计信息 */ virtual Types::PlayerStats getStats() const = 0; /** * 重置统计信息 */ virtual void resetStats() = 0; // ========== 回调设置 ========== /** * 设置状态变化回调 * @param callback 状态变化回调函数 */ virtual void setStateChangedCallback( std::function callback) = 0; /** * 设置位置变化回调 * @param callback 位置变化回调函数 */ virtual void setPositionChangedCallback( std::function callback) = 0; /** * 设置时长变化回调 * @param callback 时长变化回调函数 */ virtual void setDurationChangedCallback( std::function callback) = 0; /** * 设置缓冲进度回调 * @param callback 缓冲进度回调函数 */ virtual void setBufferProgressCallback( std::function callback) = 0; /** * 设置媒体加载完成回调 * @param callback 媒体加载完成回调函数 */ virtual void setMediaLoadedCallback( std::function callback) = 0; /** * 设置播放完成回调 * @param callback 播放完成回调函数 */ virtual void setPlaybackFinishedCallback( std::function callback) = 0; /** * 设置错误回调 * @param callback 错误回调函数 */ virtual void setErrorCallback( std::function callback) = 0; }; /** * 播放器控制器工厂接口 */ class IPlayerControllerFactory { public: virtual ~IPlayerControllerFactory() = default; /** * 创建播放器控制器实例 * @param name 控制器名称 * @return 播放器控制器智能指针 */ virtual std::unique_ptr createPlayerController(const std::string& name = "") = 0; /** * 获取默认播放器配置 * @return 默认配置 */ virtual Types::PlayerConfig getDefaultConfig() = 0; /** * 获取支持的媒体格式列表 * @return 支持的格式列表 */ virtual std::vector getSupportedFormats() = 0; /** * 检查是否支持指定格式 * @param format 媒体格式 * @return 是否支持 */ virtual bool isFormatSupported(const std::string& format) = 0; }; } // namespace Core } // namespace AVPlayer2 #endif // IPLAYERCONTROLLER_H