utils_synchronizer.h 9.3 KB

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