utils_synchronizer.h 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. #pragma once
  2. #include "../base/types.h"
  3. #include <memory>
  4. #include <chrono>
  5. #include <functional>
  6. #include <atomic>
  7. #include <mutex>
  8. #include <condition_variable>
  9. #include <map>
  10. #include <vector>
  11. extern "C" {
  12. #include <libavformat/avformat.h>
  13. #include <libavutil/time.h>
  14. }
  15. namespace av {
  16. namespace utils {
  17. using namespace av::base;
  18. // 同步策略
  19. enum class SyncStrategy {
  20. AUDIO_MASTER, // 以音频为主
  21. VIDEO_MASTER, // 以视频为主
  22. EXTERNAL_CLOCK, // 外部时钟
  23. AUTO_SELECT // 自动选择
  24. };
  25. // 同步状态
  26. enum class SyncState {
  27. IDLE, // 空闲
  28. SYNCING, // 同步中
  29. SYNCHRONIZED, // 已同步
  30. DRIFT, // 时钟漂移
  31. ERROR // 错误
  32. };
  33. // 时钟类型
  34. enum class ClockType {
  35. AUDIO,
  36. VIDEO,
  37. EXTERNAL
  38. };
  39. // 同步统计信息
  40. struct SyncStats {
  41. double audioClock = 0.0; // 音频时钟
  42. double videoClock = 0.0; // 视频时钟
  43. double externalClock = 0.0; // 外部时钟
  44. double masterClock = 0.0; // 主时钟
  45. double audioDelay = 0.0; // 音频延迟
  46. double videoDelay = 0.0; // 视频延迟
  47. double syncError = 0.0; // 同步误差
  48. double maxSyncError = 0.0; // 最大同步误差
  49. double avgSyncError = 0.0; // 平均同步误差
  50. uint64_t syncCount = 0; // 同步次数
  51. uint64_t dropCount = 0; // 丢帧次数
  52. uint64_t duplicateCount = 0; // 重复帧次数
  53. SyncState state = SyncState::IDLE; // 同步状态
  54. std::chrono::steady_clock::time_point lastUpdateTime; // 最后更新时间
  55. };
  56. // 同步配置
  57. struct SyncConfig {
  58. SyncStrategy strategy = SyncStrategy::AUDIO_MASTER; // 同步策略
  59. double maxAudioDelay = 0.1; // 最大音频延迟(秒)
  60. double maxVideoDelay = 0.04; // 最大视频延迟(秒)
  61. double syncThreshold = 0.01; // 同步阈值(秒)
  62. double maxSyncError = 1.0; // 最大同步误差(秒)
  63. bool enableFrameDrop = true; // 启用丢帧
  64. bool enableFrameDuplicate = true; // 启用重复帧
  65. bool enableAdaptiveSync = true; // 启用自适应同步
  66. bool enableStats = true; // 启用统计
  67. int smoothingWindow = 10; // 平滑窗口大小
  68. double clockUpdateInterval = 0.1; // 时钟更新间隔(秒)
  69. };
  70. // 时钟信息
  71. struct ClockInfo {
  72. double pts = 0.0; // 显示时间戳
  73. double time = 0.0; // 系统时间
  74. double speed = 1.0; // 播放速度
  75. bool paused = false; // 是否暂停
  76. std::chrono::steady_clock::time_point lastUpdate; // 最后更新时间
  77. };
  78. // 同步事件回调
  79. using SyncEventCallback = std::function<void(SyncState state, double error)>;
  80. using FrameDropCallback = std::function<void(ClockType type, double pts)>;
  81. using FrameDuplicateCallback = std::function<void(ClockType type, double pts)>;
  82. // 音视频同步器
  83. class Synchronizer {
  84. public:
  85. explicit Synchronizer(const SyncConfig& config = SyncConfig());
  86. virtual ~Synchronizer();
  87. // 基本控制
  88. ErrorCode initialize();
  89. ErrorCode start();
  90. ErrorCode stop();
  91. ErrorCode pause();
  92. ErrorCode resume();
  93. ErrorCode reset();
  94. ErrorCode close();
  95. // 时钟管理
  96. ErrorCode setAudioClock(double pts, double time = -1);
  97. ErrorCode setVideoClock(double pts, double time = -1);
  98. ErrorCode setExternalClock(double time);
  99. ErrorCode updateClock(ClockType type, double pts, double time = -1);
  100. double getAudioClock() const;
  101. double getVideoClock() const;
  102. double getExternalClock() const;
  103. double getMasterClock() const;
  104. ClockType getMasterClockType() const;
  105. // 同步控制
  106. ErrorCode synchronize();
  107. ErrorCode synchronizeAudio(double audioPts, double& delay);
  108. ErrorCode synchronizeVideo(double videoPts, double& delay);
  109. bool shouldDropFrame(ClockType type, double pts);
  110. bool shouldDuplicateFrame(ClockType type, double pts);
  111. // 延迟计算
  112. double calculateAudioDelay(double audioPts) const;
  113. double calculateVideoDelay(double videoPts) const;
  114. double calculateSyncError() const;
  115. // 配置管理
  116. void setConfig(const SyncConfig& config);
  117. SyncConfig getConfig() const;
  118. void setSyncStrategy(SyncStrategy strategy);
  119. SyncStrategy getSyncStrategy() const;
  120. void setSyncThreshold(double threshold);
  121. void setMaxSyncError(double maxError);
  122. // 播放控制
  123. void setPlaybackSpeed(double speed);
  124. double getPlaybackSpeed() const;
  125. void setPaused(bool paused);
  126. bool isPaused() const;
  127. // 状态查询
  128. SyncState getState() const;
  129. bool isSynchronized() const;
  130. SyncStats getStats() const;
  131. void resetStats();
  132. // 回调设置
  133. void setSyncEventCallback(SyncEventCallback callback);
  134. void setFrameDropCallback(FrameDropCallback callback);
  135. void setFrameDuplicateCallback(FrameDuplicateCallback callback);
  136. // 高级功能
  137. void enableAdaptiveSync(bool enable);
  138. void setClockUpdateInterval(double interval);
  139. void setSmoothingWindow(int window);
  140. private:
  141. // 内部方法
  142. void updateMasterClock();
  143. void updateSyncState();
  144. void updateStats();
  145. double getCurrentTime() const;
  146. double smoothClock(ClockType type, double newValue);
  147. bool isClockValid(ClockType type) const;
  148. void selectMasterClock();
  149. void handleSyncDrift();
  150. void notifyStateChange(SyncState newState);
  151. // 时钟相关
  152. double getClockValue(ClockType type) const;
  153. void setClockValue(ClockType type, double value, double time = -1);
  154. void resetClock(ClockType type);
  155. void pauseClock(ClockType type, bool pause);
  156. // 同步算法
  157. double calculateOptimalDelay(ClockType type, double pts);
  158. bool needFrameDrop(ClockType type, double pts);
  159. bool needFrameDuplicate(ClockType type, double pts);
  160. void adjustPlaybackSpeed();
  161. // 统计更新
  162. void updateSyncError(double error);
  163. void updateDropCount();
  164. void updateDuplicateCount();
  165. private:
  166. SyncConfig config_;
  167. // 时钟信息
  168. ClockInfo audioClock_;
  169. ClockInfo videoClock_;
  170. ClockInfo externalClock_;
  171. ClockType masterClockType_;
  172. // 同步状态
  173. std::atomic<SyncState> state_;
  174. std::atomic<bool> initialized_;
  175. std::atomic<bool> running_;
  176. std::atomic<bool> paused_;
  177. // 统计信息
  178. SyncStats stats_;
  179. mutable std::mutex statsMutex_;
  180. // 平滑处理
  181. std::vector<double> audioClockHistory_;
  182. std::vector<double> videoClockHistory_;
  183. std::vector<double> syncErrorHistory_;
  184. // 回调函数
  185. SyncEventCallback syncEventCallback_;
  186. FrameDropCallback frameDropCallback_;
  187. FrameDuplicateCallback frameDuplicateCallback_;
  188. // 线程同步
  189. mutable std::mutex clockMutex_;
  190. mutable std::mutex configMutex_;
  191. // 时间相关
  192. std::chrono::steady_clock::time_point startTime_;
  193. std::chrono::steady_clock::time_point lastClockUpdate_;
  194. };
  195. // 多流同步器
  196. class MultiStreamSynchronizer {
  197. public:
  198. explicit MultiStreamSynchronizer(const SyncConfig& config = SyncConfig());
  199. virtual ~MultiStreamSynchronizer();
  200. // 流管理
  201. ErrorCode addStream(int streamIndex, ClockType type);
  202. ErrorCode removeStream(int streamIndex);
  203. bool hasStream(int streamIndex) const;
  204. std::vector<int> getStreamIndices() const;
  205. // 同步控制
  206. ErrorCode synchronizeStream(int streamIndex, double pts, double& delay);
  207. ErrorCode synchronizeAllStreams();
  208. bool shouldDropFrame(int streamIndex, double pts);
  209. bool shouldDuplicateFrame(int streamIndex, double pts);
  210. // 时钟管理
  211. ErrorCode updateStreamClock(int streamIndex, double pts, double time = -1);
  212. double getStreamClock(int streamIndex) const;
  213. double getMasterClock() const;
  214. int getMasterStreamIndex() const;
  215. // 配置和状态
  216. void setConfig(const SyncConfig& config);
  217. SyncConfig getConfig() const;
  218. SyncState getState() const;
  219. std::map<int, SyncStats> getAllStats() const;
  220. SyncStats getStats(int streamIndex) const;
  221. void resetStats();
  222. void resetStats(int streamIndex);
  223. // 控制
  224. ErrorCode start();
  225. ErrorCode stop();
  226. ErrorCode pause();
  227. ErrorCode resume();
  228. ErrorCode reset();
  229. private:
  230. SyncConfig defaultConfig_;
  231. std::map<int, std::unique_ptr<Synchronizer>> streamSynchronizers_;
  232. std::map<int, ClockType> streamTypes_;
  233. int masterStreamIndex_;
  234. std::atomic<SyncState> globalState_;
  235. mutable std::shared_mutex streamsMutex_;
  236. std::mutex masterMutex_;
  237. void updateMasterStream();
  238. void syncToMaster();
  239. };
  240. // 同步器工厂
  241. class SynchronizerFactory {
  242. public:
  243. // 创建标准同步器
  244. static std::unique_ptr<Synchronizer> createStandardSynchronizer();
  245. // 创建低延迟同步器
  246. static std::unique_ptr<Synchronizer> createLowLatencySynchronizer();
  247. // 创建高精度同步器
  248. static std::unique_ptr<Synchronizer> createHighPrecisionSynchronizer();
  249. // 创建实时同步器
  250. static std::unique_ptr<Synchronizer> createRealtimeSynchronizer();
  251. // 创建多流同步器
  252. static std::unique_ptr<MultiStreamSynchronizer> createMultiStreamSynchronizer(const SyncConfig& config = SyncConfig());
  253. };
  254. } // namespace utils
  255. } // namespace av