CreateLongFileThread.h 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #ifndef _CREATELONGFILETHREAD_H_
  2. #define _CREATELONGFILETHREAD_H_
  3. #include "BaseRecordThread.h"
  4. #include "AudioData.h"
  5. #include "GlobalVariable.h"
  6. #include <mutex>
  7. #include <QFile>
  8. #include <QDir>
  9. #include <qt5/QtCore/qchar.h>
  10. /**
  11. 这个线程类记录一个长的录音文件,1小时一个文件
  12. 功能1:记录一个长的录音文件,1小时一个文件
  13. 1、如果是刚开始录音,到下一个整点记录一个文件,后续都是满1小时一个文件
  14. 2、数据先放到缓冲区中,满1分钟写一次文件
  15. 功能2:
  16. 1、录制报警文件
  17. 2、由其他线程传来报警参数,开启录制,报警结束后,结束录制
  18. 3、由于静音、过载、反相、一致性报警、噪音报警条件是和对比项相关联的,因此这里可能回同时存在多个录音,
  19. 根据对比项ID和对比项通道以及报警类型来区分
  20. 4、报警文件的命名规则:Alarm_CompareItemID_RoadNum_AlarmType_yyyyMMdd_hhmmss-yyyyMMdd_hhmmss.wav
  21. 例如:Alarm_1_1_Silent_20250101_120000-20250101_120100.wav
  22. */
  23. class CreateLongFileThread : public BaseRecordThread
  24. {
  25. public:
  26. CreateLongFileThread(RecordThreadInfo_t& threadInfo);
  27. ~CreateLongFileThread() override;
  28. /* 设置数据 */
  29. bool setData(const AudioSrcData& srcData) override;
  30. /* 开启录制 */
  31. bool startRecordAlarmFile(const AlarmInfo_t& alarmInfo);
  32. /* 停止录制,alarmInfo既是传入参数,也是传出参数,传出文件路径和开始位置 */
  33. bool stopRecordAlarmFile(AlarmInfo_t& alarmInfo);
  34. private:
  35. /* 执行任务函数 */
  36. void task() override;
  37. /* 初始化一些数据 */
  38. bool initData() override;
  39. /* 清理数据 */
  40. void clearData() override;
  41. /* 设置今日目录 */
  42. inline bool setTodayPath(bool isNewFile);
  43. /* 打开文件 */
  44. bool openFile(QFile& wavFile, bool isNewFile);
  45. /* 写入音频数据到文件 */
  46. bool writeAudioDataToFile(const AudioSrcData& audioData, const QString& fileName);
  47. /* 生成文件名 */
  48. inline QString generateFileName(const QDateTime& startTime, const QDateTime& endTime) const;
  49. /* 判断是否过了整点 */
  50. inline bool isOneHourPassed();
  51. private:
  52. /* 临时缓存数据, 一分钟写入一次,给这个分配2分钟的数据大小 */
  53. std::mutex m_mutexBuffer;
  54. AudioSrcData m_bufferData;
  55. AudioSrcData m_srcData; /* 当前的音频数据 */
  56. int32_t m_writeCriticalSize = 0; /* 写入文件的临界大小,单位:字节,缓存超过这个大小就写入文件 */
  57. int32_t m_oneHourSize = 0; /* 一小时的音频数据大小 */
  58. int m_openFileErrorSize = 0; /* 打开文件错误次数 */
  59. QString m_recordPath; /* 记录长文件的路径 */
  60. QDir m_todayDir; /* 今日目录 */
  61. QString m_wavFileName; /* wav文件对象 */
  62. WavHeader m_wavHeader; /* 当前wav文件头信息 */
  63. int64_t m_writtenSize = 0; /* 已经写入的数据大小 */
  64. QDateTime m_writtenStartTime; /* 已经写入数据的开始时间点 */
  65. QDateTime m_writtenNowTime; /* 已经写入数据的最后时间点 */
  66. /*===============================================================================*/
  67. /* 报警文件相关 */
  68. std::map<AlarmInfo_t, bool> m_mapAlarmFileName; /* 报警文件名,key是报警信息,value是文件名 */
  69. };
  70. #endif // _CREATELONGFILETHREAD_H_