ISyncController.h 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356
  1. #ifndef ISYNCCONTROLLER_H
  2. #define ISYNCCONTROLLER_H
  3. #include <chrono>
  4. #include <functional>
  5. #include <memory>
  6. #include <string>
  7. namespace AVPlayer2 {
  8. namespace Core {
  9. /**
  10. * 同步状态枚举
  11. */
  12. enum class SyncState {
  13. Stopped, // 停止状态
  14. Running, // 运行状态
  15. Paused, // 暂停状态
  16. Seeking, // 跳转状态
  17. Buffering // 缓冲状态
  18. };
  19. /**
  20. * 同步模式枚举
  21. */
  22. enum class SyncMode {
  23. AudioMaster, // 以音频为主时钟
  24. VideoMaster, // 以视频为主时钟
  25. ExternalMaster, // 以外部时钟为主
  26. FreeRun // 自由运行模式
  27. };
  28. /**
  29. * 时钟类型枚举
  30. */
  31. enum class ClockType {
  32. Audio, // 音频时钟
  33. Video, // 视频时钟
  34. External, // 外部时钟
  35. System // 系统时钟
  36. };
  37. } // namespace Core
  38. namespace Types {
  39. /**
  40. * 时间戳信息
  41. */
  42. struct TimestampInfo {
  43. std::chrono::microseconds pts; // 显示时间戳
  44. std::chrono::microseconds dts; // 解码时间戳
  45. std::chrono::microseconds duration; // 持续时间
  46. std::chrono::system_clock::time_point systemTime; // 系统时间
  47. double timeBase; // 时间基准
  48. TimestampInfo() {
  49. pts = std::chrono::microseconds(0);
  50. dts = std::chrono::microseconds(0);
  51. duration = std::chrono::microseconds(0);
  52. systemTime = std::chrono::system_clock::now();
  53. timeBase = 1.0;
  54. }
  55. };
  56. /**
  57. * 时钟信息
  58. */
  59. struct ClockInfo {
  60. Core::ClockType type; // 时钟类型
  61. std::chrono::microseconds currentTime; // 当前时间
  62. std::chrono::microseconds lastUpdate; // 最后更新时间
  63. double speed; // 播放速度
  64. bool isPaused; // 是否暂停
  65. double drift; // 时钟漂移
  66. ClockInfo() {
  67. type = Core::ClockType::System;
  68. currentTime = std::chrono::microseconds(0);
  69. lastUpdate = std::chrono::microseconds(0);
  70. speed = 1.0;
  71. isPaused = false;
  72. drift = 0.0;
  73. }
  74. };
  75. /**
  76. * 同步统计信息
  77. */
  78. struct SyncStats {
  79. double audioVideoDelay; // 音视频延迟(毫秒)
  80. double averageDelay; // 平均延迟
  81. double maxDelay; // 最大延迟
  82. double minDelay; // 最小延迟
  83. int droppedFrames; // 丢弃帧数
  84. int duplicatedFrames; // 重复帧数
  85. int syncAdjustments; // 同步调整次数
  86. double clockDrift; // 时钟漂移
  87. SyncStats() {
  88. audioVideoDelay = 0.0;
  89. averageDelay = 0.0;
  90. maxDelay = 0.0;
  91. minDelay = 0.0;
  92. droppedFrames = 0;
  93. duplicatedFrames = 0;
  94. syncAdjustments = 0;
  95. clockDrift = 0.0;
  96. }
  97. };
  98. /**
  99. * 同步配置
  100. */
  101. struct SyncConfig {
  102. Core::SyncMode mode; // 同步模式
  103. double maxAudioDelay; // 最大音频延迟(毫秒)
  104. double maxVideoDelay; // 最大视频延迟(毫秒)
  105. double syncThreshold; // 同步阈值(毫秒)
  106. bool enableFrameDrop; // 是否启用丢帧
  107. bool enableFrameDuplication; // 是否启用重复帧
  108. double speedAdjustmentRange; // 速度调整范围
  109. int maxConsecutiveDrops; // 最大连续丢帧数
  110. SyncConfig() {
  111. mode = Core::SyncMode::AudioMaster;
  112. maxAudioDelay = 100.0;
  113. maxVideoDelay = 100.0;
  114. syncThreshold = 40.0;
  115. enableFrameDrop = true;
  116. enableFrameDuplication = false;
  117. speedAdjustmentRange = 0.1;
  118. maxConsecutiveDrops = 5;
  119. }
  120. };
  121. } // namespace Types
  122. namespace Core {
  123. /**
  124. * 同步控制器抽象接口
  125. * 提供音视频同步功能
  126. */
  127. class ISyncController {
  128. public:
  129. virtual ~ISyncController() = default;
  130. /**
  131. * 初始化同步控制器
  132. * @param config 同步配置
  133. * @return 是否初始化成功
  134. */
  135. virtual bool initialize(const Types::SyncConfig& config) = 0;
  136. /**
  137. * 启动同步控制器
  138. * @return 是否启动成功
  139. */
  140. virtual bool start() = 0;
  141. /**
  142. * 停止同步控制器
  143. */
  144. virtual void stop() = 0;
  145. /**
  146. * 暂停同步
  147. */
  148. virtual void pause() = 0;
  149. /**
  150. * 恢复同步
  151. */
  152. virtual void resume() = 0;
  153. /**
  154. * 重置同步状态
  155. */
  156. virtual void reset() = 0;
  157. /**
  158. * 设置同步模式
  159. * @param mode 同步模式
  160. */
  161. virtual void setSyncMode(SyncMode mode) = 0;
  162. /**
  163. * 获取同步模式
  164. * @return 当前同步模式
  165. */
  166. virtual SyncMode getSyncMode() const = 0;
  167. /**
  168. * 设置播放速度
  169. * @param speed 播放速度(1.0为正常速度)
  170. */
  171. virtual void setPlaybackSpeed(double speed) = 0;
  172. /**
  173. * 获取播放速度
  174. * @return 当前播放速度
  175. */
  176. virtual double getPlaybackSpeed() const = 0;
  177. /**
  178. * 更新音频时钟
  179. * @param timestamp 时间戳信息
  180. */
  181. virtual void updateAudioClock(const Types::TimestampInfo& timestamp) = 0;
  182. /**
  183. * 更新视频时钟
  184. * @param timestamp 时间戳信息
  185. */
  186. virtual void updateVideoClock(const Types::TimestampInfo& timestamp) = 0;
  187. /**
  188. * 更新外部时钟
  189. * @param timestamp 时间戳信息
  190. */
  191. virtual void updateExternalClock(const Types::TimestampInfo& timestamp) = 0;
  192. /**
  193. * 获取主时钟时间
  194. * @return 主时钟当前时间(微秒)
  195. */
  196. virtual std::chrono::microseconds getMasterClockTime() = 0;
  197. /**
  198. * 获取指定类型时钟信息
  199. * @param type 时钟类型
  200. * @return 时钟信息
  201. */
  202. virtual Types::ClockInfo getClockInfo(ClockType type) = 0;
  203. /**
  204. * 计算音频延迟
  205. * @param audioTimestamp 音频时间戳
  206. * @return 延迟时间(毫秒)
  207. */
  208. virtual double calculateAudioDelay(const Types::TimestampInfo& audioTimestamp) = 0;
  209. /**
  210. * 计算视频延迟
  211. * @param videoTimestamp 视频时间戳
  212. * @return 延迟时间(毫秒)
  213. */
  214. virtual double calculateVideoDelay(const Types::TimestampInfo& videoTimestamp) = 0;
  215. /**
  216. * 判断是否应该丢弃视频帧
  217. * @param videoTimestamp 视频时间戳
  218. * @return 是否应该丢弃
  219. */
  220. virtual bool shouldDropVideoFrame(const Types::TimestampInfo& videoTimestamp) = 0;
  221. /**
  222. * 判断是否应该重复视频帧
  223. * @param videoTimestamp 视频时间戳
  224. * @return 是否应该重复
  225. */
  226. virtual bool shouldDuplicateVideoFrame(const Types::TimestampInfo& videoTimestamp) = 0;
  227. /**
  228. * 计算音频样本调整
  229. * @param audioTimestamp 音频时间戳
  230. * @param sampleCount 样本数
  231. * @return 调整后的样本数
  232. */
  233. virtual int calculateAudioSampleAdjustment(const Types::TimestampInfo& audioTimestamp,
  234. int sampleCount) = 0;
  235. /**
  236. * 跳转到指定时间
  237. * @param seekTime 目标时间(微秒)
  238. */
  239. virtual void seekTo(std::chrono::microseconds seekTime) = 0;
  240. /**
  241. * 获取同步状态
  242. * @return 同步状态
  243. */
  244. virtual SyncState getState() const = 0;
  245. /**
  246. * 获取同步统计信息
  247. * @return 统计信息
  248. */
  249. virtual Types::SyncStats getStats() const = 0;
  250. /**
  251. * 重置统计信息
  252. */
  253. virtual void resetStats() = 0;
  254. /**
  255. * 设置同步状态变化回调
  256. * @param callback 状态变化回调函数
  257. */
  258. virtual void setStateChangedCallback(
  259. std::function<void(SyncState)> callback) = 0;
  260. /**
  261. * 设置时钟更新回调
  262. * @param callback 时钟更新回调函数
  263. */
  264. virtual void setClockUpdateCallback(
  265. std::function<void(ClockType, const Types::ClockInfo&)> callback) = 0;
  266. /**
  267. * 设置同步调整回调
  268. * @param callback 同步调整回调函数
  269. */
  270. virtual void setSyncAdjustmentCallback(
  271. std::function<void(const std::string&, double)> callback) = 0;
  272. /**
  273. * 设置错误回调
  274. * @param callback 错误回调函数
  275. */
  276. virtual void setErrorCallback(
  277. std::function<void(const std::string&, const std::string&)> callback) = 0;
  278. };
  279. /**
  280. * 同步控制器工厂接口
  281. */
  282. class ISyncControllerFactory {
  283. public:
  284. virtual ~ISyncControllerFactory() = default;
  285. /**
  286. * 创建同步控制器实例
  287. * @param name 控制器名称
  288. * @return 同步控制器智能指针
  289. */
  290. virtual std::unique_ptr<ISyncController> createSyncController(const std::string& name = "") = 0;
  291. /**
  292. * 获取默认同步配置
  293. * @return 默认配置
  294. */
  295. virtual Types::SyncConfig getDefaultConfig() = 0;
  296. /**
  297. * 获取支持的同步模式列表
  298. * @return 支持的同步模式
  299. */
  300. virtual std::vector<SyncMode> getSupportedSyncModes() = 0;
  301. };
  302. } // namespace Core
  303. } // namespace AVPlayer2
  304. #endif // ISYNCCONTROLLER_H