CSyncProc.h 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #pragma once
  2. #include <queue>
  3. #include <mutex>
  4. #include <map>
  5. #include <functional>
  6. #include <opencv2/opencv.hpp>
  7. /**************************************************************************************
  8. 功能点和关键点:
  9. 1、保存视频帧
  10. 2、接收音频信号的同步消息,并执行同步
  11. 3、建立同步帧缓冲区
  12. 4、给解码模块提供同步后视频帧
  13. 5、删除视频帧,确定在下一帧已经收到的情况下才可以删除,因为可能要补帧
  14. 6、音频失步之后处理。
  15. 7、帧比对都以全景的时间戳和播放时间为基准
  16. *************************************************************************************/
  17. class CPacketInfo;
  18. class CVideoDataManager;
  19. class AVCodecContext;
  20. class AVPacket;
  21. class AVFrame;
  22. //最大的同步之后的数据包队列
  23. #define MAX_SYNCOACKET_QUEUE 25
  24. #define VIDEO_TIME_INTERVAL 40
  25. class CSyncProc
  26. {
  27. public:
  28. CSyncProc();
  29. ~CSyncProc();
  30. CSyncProc(const CSyncProc& proc);
  31. CSyncProc & operator=(const CSyncProc& proc);
  32. public:
  33. typedef std::function<bool()> FunUpdate;
  34. struct TimeParam
  35. {
  36. void * pParam;
  37. double dTime;
  38. };
  39. public:
  40. static CSyncProc& getInstance();
  41. void AddFun(void * p, FunUpdate fun);
  42. bool UpdateTimeQueue(CVideoDataManager * pMan, double dTime);
  43. //音频同步信号收全后,要对数据包进行对齐。
  44. static unsigned __stdcall SyncThread(void * param);
  45. void SyncProcessor();
  46. bool GetSync()
  47. {
  48. return /*true*/ m_bSync;
  49. }
  50. //接收到的m_vecPacket数据整理到m_qPacket。
  51. static unsigned __stdcall RecvDataToSyncDataThread(void * param);
  52. void RecvDataToSyncDataProcessor();
  53. void AddDataManager(CVideoDataManager * pMan);
  54. void Start();
  55. private:
  56. std::mutex m_lockTime;
  57. //m_maxInternal单位是s ,音频信号队列收全后,执行m_mapFun函数,对包进行对齐
  58. double m_maxInternal{ 5};
  59. std::queue<TimeParam> m_qTimeParam;
  60. std::map<void*, FunUpdate> m_mapFun;
  61. bool m_bSync{ false };
  62. //所有的数据管理对象
  63. std::mutex m_lockManager;
  64. std::vector<CVideoDataManager *> m_vecPacketManager;
  65. };