utils_synchronizer_v2.h 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. #ifndef AV_UTILS_SYNCHRONIZER_V2_H
  2. #define AV_UTILS_SYNCHRONIZER_V2_H
  3. #pragma once
  4. #include "../base/types.h"
  5. #include <atomic>
  6. #include <chrono>
  7. #include <deque>
  8. #include <functional>
  9. #include <limits>
  10. #include <memory>
  11. #include <mutex>
  12. #include <string>
  13. extern "C" {
  14. #include <libavutil/avutil.h>
  15. #include <libavutil/time.h>
  16. }
  17. namespace av {
  18. namespace utils {
  19. // 同步策略枚举
  20. enum class SyncStrategy {
  21. AUDIO_MASTER, // 音频作为主时钟源
  22. VIDEO_MASTER, // 视频作为主时钟源
  23. EXTERNAL_MASTER // 外部时钟作为主时钟源
  24. };
  25. // 时钟类型枚举
  26. enum class ClockType {
  27. AUDIO, // 音频时钟
  28. VIDEO, // 视频时钟
  29. EXTERNAL // 外部时钟
  30. };
  31. // 帧处理决策枚举
  32. enum class FrameAction {
  33. DISPLAY, // 显示帧
  34. DROP, // 丢弃帧
  35. DUPLICATE, // 重复帧
  36. WAIT // 等待
  37. };
  38. // 帧决策结构体
  39. struct FrameDecision {
  40. FrameAction action = FrameAction::DISPLAY;
  41. double delay = 0.0; // 延迟时间(秒)
  42. double syncError = 0.0; // 同步误差(秒)
  43. std::string reason; // 决策原因
  44. };
  45. // 同步器配置结构体
  46. struct SyncConfigV2 {
  47. SyncStrategy strategy = SyncStrategy::AUDIO_MASTER; // 同步策略
  48. // 同步阈值(秒)
  49. double syncThresholdMin = 0.04; // 最小同步阈值
  50. double syncThresholdMax = 0.1; // 最大同步阈值
  51. // 帧处理阈值
  52. double frameDropThreshold = 0.1; // 丢帧阈值
  53. double frameDupThreshold = 0.1; // 重复帧阈值
  54. // 音频同步参数
  55. double audioDiffThreshold = 0.1; // 音频差异阈值
  56. double audioDiffAvgCoef = 0.01; // 音频差异平均系数
  57. int audioDiffAvgCount = 20; // 音频差异平均计数
  58. // 时钟速度调整参数
  59. double clockSpeedMin = 0.9; // 最小时钟速度
  60. double clockSpeedMax = 1.1; // 最大时钟速度
  61. double clockSpeedStep = 0.001; // 时钟速度调整步长
  62. // 缓冲区控制参数
  63. int minFramesForSync = 2; // 同步所需最小帧数
  64. int maxFramesForSync = 10; // 同步所需最大帧数
  65. // 无同步阈值(秒)
  66. double noSyncThreshold = 10.0; // 超过此阈值不进行同步
  67. };
  68. // 同步器统计信息结构体
  69. struct SyncStatsV2 {
  70. double audioClock = 0.0; // 音频时钟(秒)
  71. double videoClock = 0.0; // 视频时钟(秒)
  72. double externalClock = 0.0; // 外部时钟(秒)
  73. double masterClock = 0.0; // 主时钟(秒)
  74. double audioVideoSyncError = 0.0; // 音视频同步误差(秒)
  75. double avgSyncError = 0.0; // 平均同步误差(秒)
  76. double maxSyncError = 0.0; // 最大同步误差(秒)
  77. int64_t droppedFrames = 0; // 丢弃的帧数
  78. int64_t duplicatedFrames = 0; // 重复的帧数
  79. double playbackSpeed = 1.0; // 播放速度
  80. };
  81. // 时钟结构体(基于ffplay.c中的Clock结构体)
  82. struct Clock {
  83. double pts = 0.0; // 时钟基准
  84. double ptsDrift = 0.0; // 时钟基准减去更新时间
  85. double lastUpdated = 0.0; // 最后更新时间
  86. double speed = 1.0; // 时钟速度
  87. int serial = -1; // 时钟基于此序列号的包
  88. bool paused = false; // 是否暂停
  89. int queueSerial = -1; // 当前包队列序列号,用于检测过时的时钟
  90. };
  91. // 前向声明
  92. namespace av {
  93. namespace player {
  94. class PlayerCoreV2;
  95. }
  96. }
  97. // 同步器类(基于ffplay.c实现)
  98. class SynchronizerV2 {
  99. friend class av::player::PlayerCoreV2; // 声明PlayerCoreV2为友元类
  100. public:
  101. // 构造函数和析构函数
  102. explicit SynchronizerV2(const SyncConfigV2& config = SyncConfigV2());
  103. ~SynchronizerV2();
  104. // 初始化和清理
  105. ErrorCode initialize();
  106. void close();
  107. // 控制接口
  108. ErrorCode start();
  109. ErrorCode stop();
  110. ErrorCode pause();
  111. ErrorCode resume();
  112. ErrorCode reset();
  113. // 流信息设置
  114. void setStreamInfo(bool hasAudio, bool hasVideo);
  115. // 时钟操作
  116. double getClock(ClockType type) const;
  117. void setClock(ClockType type, double pts, int serial);
  118. void setClockAt(ClockType type, double pts, int serial, double time);
  119. void setClockSpeed(ClockType type, double speed);
  120. // 主时钟操作
  121. ClockType getMasterClockType() const;
  122. double getMasterClock() const;
  123. // 同步操作
  124. double computeTargetDelay(double frameDuration, double videoPts) const;
  125. FrameDecision synchronizeVideo(double pts, int serial, double duration) const;
  126. int synchronizeAudio(short* samples, int samplesSize, double pts);
  127. // 配置操作
  128. void setConfig(const SyncConfigV2& config);
  129. SyncConfigV2 getConfig() const;
  130. void setSyncStrategy(SyncStrategy strategy);
  131. SyncStrategy getSyncStrategy() const;
  132. // 播放速度控制
  133. void setPlaybackSpeed(double speed);
  134. double getPlaybackSpeed() const;
  135. // 统计信息
  136. SyncStatsV2 getStats() const;
  137. // 回调设置
  138. using SyncErrorCallback = std::function<void(double error, const std::string& reason)>;
  139. using FrameDropCallback = std::function<void(ClockType type, int64_t pts)>;
  140. void setSyncErrorCallback(const SyncErrorCallback& callback);
  141. void setFrameDropCallback(const FrameDropCallback& callback);
  142. // 调试信息
  143. std::string getDebugInfo() const;
  144. private:
  145. // 内部时钟操作
  146. void initClock(Clock& clock, int serial);
  147. void syncClockToSlave(Clock& c, const Clock& slave);
  148. void updateExternalClock();
  149. void checkExternalClockSpeed();
  150. // 内部状态
  151. std::atomic<bool> m_initialized{false};
  152. std::atomic<bool> m_running{false};
  153. std::atomic<bool> m_paused{false};
  154. // 配置
  155. SyncConfigV2 m_config;
  156. std::atomic<SyncStrategy> m_syncStrategy{SyncStrategy::AUDIO_MASTER};
  157. // 时钟
  158. mutable std::mutex m_clockMutex;
  159. Clock m_audioClock;
  160. Clock m_videoClock;
  161. Clock m_externalClock;
  162. // 流信息
  163. std::atomic<bool> m_hasAudio{false};
  164. std::atomic<bool> m_hasVideo{false};
  165. // 序列号
  166. std::atomic<int> m_audioSerial{0};
  167. std::atomic<int> m_videoSerial{0};
  168. std::atomic<int> m_externalSerial{0};
  169. // 音频同步
  170. double m_audioDiffCum{0.0}; // 用于音视频差异平均计算
  171. int m_audioDiffAvgCount{0};
  172. // 播放控制
  173. std::atomic<double> m_playbackSpeed{1.0};
  174. // 统计信息
  175. mutable std::mutex m_statsMutex;
  176. mutable SyncStatsV2 m_stats;
  177. // 回调
  178. mutable std::mutex m_callbackMutex;
  179. SyncErrorCallback m_syncErrorCallback;
  180. FrameDropCallback m_frameDropCallback;
  181. // 帧计时器
  182. mutable double m_frameTimer{0.0};
  183. // 辅助函数
  184. double getCurrentTime() const;
  185. void updateStats();
  186. void notifySyncError(double error, const std::string& reason) const;
  187. void notifyFrameDrop(ClockType type, int64_t pts) const;
  188. };
  189. } // namespace utils
  190. } // namespace av
  191. #endif // AV_UTILS_SYNCHRONIZER_V2_H