#ifndef AV_UTILS_SYNCHRONIZER_V2_H #define AV_UTILS_SYNCHRONIZER_V2_H #pragma once #include "../base/types.h" #include #include #include #include #include #include #include #include extern "C" { #include #include } namespace av { namespace utils { // 同步策略枚举 enum class SyncStrategy { AUDIO_MASTER, // 音频作为主时钟源 VIDEO_MASTER, // 视频作为主时钟源 EXTERNAL_MASTER // 外部时钟作为主时钟源 }; // 时钟类型枚举 enum class ClockType { AUDIO, // 音频时钟 VIDEO, // 视频时钟 EXTERNAL // 外部时钟 }; // 帧处理决策枚举 enum class FrameAction { DISPLAY, // 显示帧 DROP, // 丢弃帧 DUPLICATE, // 重复帧 WAIT // 等待 }; // 帧决策结构体 struct FrameDecision { FrameAction action = FrameAction::DISPLAY; double delay = 0.0; // 延迟时间(秒) double syncError = 0.0; // 同步误差(秒) std::string reason; // 决策原因 }; // 同步器配置结构体 struct SyncConfigV2 { SyncStrategy strategy = SyncStrategy::AUDIO_MASTER; // 同步策略 // 同步阈值(秒) double syncThresholdMin = 0.04; // 最小同步阈值 double syncThresholdMax = 0.1; // 最大同步阈值 // 帧处理阈值 double frameDropThreshold = 0.1; // 丢帧阈值 double frameDupThreshold = 0.1; // 重复帧阈值 // 音频同步参数 double audioDiffThreshold = 0.1; // 音频差异阈值 double audioDiffAvgCoef = 0.01; // 音频差异平均系数 int audioDiffAvgCount = 20; // 音频差异平均计数 // 时钟速度调整参数 double clockSpeedMin = 0.9; // 最小时钟速度 double clockSpeedMax = 1.1; // 最大时钟速度 double clockSpeedStep = 0.001; // 时钟速度调整步长 // 缓冲区控制参数 int minFramesForSync = 2; // 同步所需最小帧数 int maxFramesForSync = 10; // 同步所需最大帧数 // 无同步阈值(秒) double noSyncThreshold = 10.0; // 超过此阈值不进行同步 }; // 同步器统计信息结构体 struct SyncStatsV2 { double audioClock = 0.0; // 音频时钟(秒) double videoClock = 0.0; // 视频时钟(秒) double externalClock = 0.0; // 外部时钟(秒) double masterClock = 0.0; // 主时钟(秒) double audioVideoSyncError = 0.0; // 音视频同步误差(秒) double avgSyncError = 0.0; // 平均同步误差(秒) double maxSyncError = 0.0; // 最大同步误差(秒) int64_t droppedFrames = 0; // 丢弃的帧数 int64_t duplicatedFrames = 0; // 重复的帧数 double playbackSpeed = 1.0; // 播放速度 }; // 时钟结构体(基于ffplay.c中的Clock结构体) struct Clock { double pts = 0.0; // 时钟基准 double ptsDrift = 0.0; // 时钟基准减去更新时间 double lastUpdated = 0.0; // 最后更新时间 double speed = 1.0; // 时钟速度 int serial = -1; // 时钟基于此序列号的包 bool paused = false; // 是否暂停 int queueSerial = -1; // 当前包队列序列号,用于检测过时的时钟 }; // 前向声明 namespace av { namespace player { class PlayerCoreV2; } } // 同步器类(基于ffplay.c实现) class SynchronizerV2 { friend class av::player::PlayerCoreV2; // 声明PlayerCoreV2为友元类 public: // 构造函数和析构函数 explicit SynchronizerV2(const SyncConfigV2& config = SyncConfigV2()); ~SynchronizerV2(); // 初始化和清理 ErrorCode initialize(); void close(); // 控制接口 ErrorCode start(); ErrorCode stop(); ErrorCode pause(); ErrorCode resume(); ErrorCode reset(); // 流信息设置 void setStreamInfo(bool hasAudio, bool hasVideo); // 时钟操作 double getClock(ClockType type) const; void setClock(ClockType type, double pts, int serial); void setClockAt(ClockType type, double pts, int serial, double time); void setClockSpeed(ClockType type, double speed); // 主时钟操作 ClockType getMasterClockType() const; double getMasterClock() const; // 同步操作 double computeTargetDelay(double frameDuration, double videoPts) const; FrameDecision synchronizeVideo(double pts, int serial, double duration) const; int synchronizeAudio(short* samples, int samplesSize, double pts); // 配置操作 void setConfig(const SyncConfigV2& config); SyncConfigV2 getConfig() const; void setSyncStrategy(SyncStrategy strategy); SyncStrategy getSyncStrategy() const; // 播放速度控制 void setPlaybackSpeed(double speed); double getPlaybackSpeed() const; // 统计信息 SyncStatsV2 getStats() const; // 回调设置 using SyncErrorCallback = std::function; using FrameDropCallback = std::function; void setSyncErrorCallback(const SyncErrorCallback& callback); void setFrameDropCallback(const FrameDropCallback& callback); // 调试信息 std::string getDebugInfo() const; private: // 内部时钟操作 void initClock(Clock& clock, int serial); void syncClockToSlave(Clock& c, const Clock& slave); void updateExternalClock(); void checkExternalClockSpeed(); // 内部状态 std::atomic m_initialized{false}; std::atomic m_running{false}; std::atomic m_paused{false}; // 配置 SyncConfigV2 m_config; std::atomic m_syncStrategy{SyncStrategy::AUDIO_MASTER}; // 时钟 mutable std::mutex m_clockMutex; Clock m_audioClock; Clock m_videoClock; Clock m_externalClock; // 流信息 std::atomic m_hasAudio{false}; std::atomic m_hasVideo{false}; // 序列号 std::atomic m_audioSerial{0}; std::atomic m_videoSerial{0}; std::atomic m_externalSerial{0}; // 音频同步 double m_audioDiffCum{0.0}; // 用于音视频差异平均计算 int m_audioDiffAvgCount{0}; // 播放控制 std::atomic m_playbackSpeed{1.0}; // 统计信息 mutable std::mutex m_statsMutex; mutable SyncStatsV2 m_stats; // 回调 mutable std::mutex m_callbackMutex; SyncErrorCallback m_syncErrorCallback; FrameDropCallback m_frameDropCallback; // 帧计时器 mutable double m_frameTimer{0.0}; // 辅助函数 double getCurrentTime() const; void updateStats(); void notifySyncError(double error, const std::string& reason) const; void notifyFrameDrop(ClockType type, int64_t pts) const; }; } // namespace utils } // namespace av #endif // AV_UTILS_SYNCHRONIZER_V2_H