AudioData.h 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. #ifndef _AUDIODATA_H_
  2. #define _AUDIODATA_H_
  3. #include <QString>
  4. #include <QDateTime>
  5. #include <qdatetime.h>
  6. #include <vector>
  7. #include "GlobalVariable.h"
  8. #include "ChannelParam.h"
  9. /* =========================================================================================
  10. * WAV文件头信息结构体及其功能函数
  11. * =========================================================================================*/
  12. #pragma pack(1)
  13. /**
  14. * @brief Wav头信息
  15. *
  16. */
  17. struct WavHeader
  18. {
  19. char RIFF[4] = {'R', 'I', 'F', 'F'}; /* RIFF标识符 */
  20. uint64_t fileSize = 0; // 文件大小
  21. char WAVE[4] = {'W', 'A', 'V', 'E'}; // WAVE标识符
  22. char fmt[4] = {'f', 'm', 't', ' '}; // fmt子块标识符
  23. uint32_t fmtChunkSize = 16; // fmt子块大小
  24. uint16_t audioFormat = 1; // 音频格式,1表示PCM
  25. uint16_t numChannels = 2; // 声道数,1表示单声道,2表示立体声
  26. uint32_t sampleRate = 48000; // 采样率
  27. uint32_t byteRate = 0; // 字节率,等于采样率 * 声道数 * 每个采样点的字节数
  28. uint16_t blockAlign = 4; // 块对齐,等于声道数 * 每个采样点的字节数
  29. uint16_t bitsPerSample = 16; // 每个采样点的位数,16位深度
  30. char data[4] = {'d', 'a', 't', 'a'}; // data子块标识符
  31. uint32_t dataChunkSize = 0; // 数据块大小,等于音频数据的字节数
  32. /* 一些需要手动设置的参数 */
  33. void setSampleRate(uint32_t rate) { sampleRate = rate; }
  34. void setNumChannels(uint16_t channels) { numChannels = channels; }
  35. void setBitsPerSample(uint16_t bits) { bitsPerSample = bits; }
  36. void setDataSize(uint32_t size) { dataChunkSize = size; }
  37. /* 计算一些其他需要计算的数据 */
  38. void calculateDerivedFields()
  39. {
  40. byteRate = sampleRate * numChannels * (bitsPerSample / 8);
  41. blockAlign = numChannels * (bitsPerSample / 8);
  42. fileSize = sizeof(WavHeader) - 8 + dataChunkSize; // 文件大小 = 头部大小 - 8 + 数据块大小
  43. }
  44. };
  45. #pragma pack()
  46. /* 修改wav文件已写入的大小 */
  47. bool modifyWavFileHeader(const QString& fileName, WavHeader& header);
  48. /* 修改录音文件名 */
  49. bool modifyFileName(const QString& fileName, const QString& newFileName);
  50. /* =========================================================================================
  51. * 其他数据结构
  52. * =========================================================================================*/
  53. // 反相数结构
  54. struct StPhase
  55. {
  56. StPhase() : iReversedNum(0), iUnReversedNum(0) {}
  57. StPhase(const StPhase& obj) { *this = obj; }
  58. // 1秒钟内的反相数
  59. int iReversedNum;
  60. // 1秒钟内的非反相数
  61. int iUnReversedNum;
  62. int GetPhaseNum() { return iReversedNum + iUnReversedNum; }
  63. StPhase& operator=(const StPhase& obj)
  64. {
  65. iReversedNum = obj.iReversedNum;
  66. iUnReversedNum = obj.iUnReversedNum;
  67. return *this;
  68. }
  69. };
  70. // 一秒钟的数据
  71. struct OneSecondData
  72. {
  73. OneSecondData();
  74. ~OneSecondData();
  75. OneSecondData(const OneSecondData& obj);
  76. OneSecondData& operator=(const OneSecondData &obj);
  77. void Init();
  78. // 音频是否有错误
  79. // bool AudioLeftRightDiff();
  80. // 判定静音
  81. int calSilentDB(const StVolumeParam &param);
  82. bool CalcDBOneSecond(const StVolumeParam &param);
  83. // 判定过载
  84. int CalcOverload(const StVolumeParam &param);
  85. bool CalcOverloadOneSecond(const StVolumeParam &param);
  86. // 判定反相: 持续时间内就一个是否反相的值
  87. // bLastReversed:上一次的反相,如果反相不明显时,维持上一次的反相
  88. void CalcPhase(const StVolumeParam &param, StPhase &phase, bool bLastReversed);
  89. // 判定反相: 每秒都有一个是否反相的值,持续时间内每秒都反相,就表示反相
  90. bool CalcPhaseOneSecond(const StVolumeParam &param, bool bLastReversed);
  91. /* 判断是否是固定的音量 */
  92. bool isConstDB(int &nLeftDB, int &nRightDB);
  93. // // 打印输出
  94. // void OutPutVolumeInfo(QString strHeader);
  95. // void OutPutVolumeInfoEx(QString strHeader, CShowCmdLog &logFile);
  96. public:
  97. int nAudioError;
  98. // 一个音量包有30个DB
  99. int aryLeftDB[VOLUME_INFO_NUM];
  100. int aryRightDB[VOLUME_INFO_NUM];
  101. // 相位值列表
  102. float aryPhase[VOLUME_INFO_NUM];
  103. QDateTime startTime; /* 开始时间戳 */
  104. QDateTime endTime; /* 结束时间戳 */
  105. };
  106. /**
  107. * @brief 音频原始数据
  108. *
  109. */
  110. struct AudioSrcData
  111. {
  112. public:
  113. AudioSrcData(uint32_t recordSize = 0);
  114. AudioSrcData(const AudioSrcData& obj);
  115. AudioSrcData& operator=(const AudioSrcData &obj);
  116. AudioSrcData(AudioSrcData&& obj) = delete;
  117. void operator=(AudioSrcData&& obj) = delete;
  118. ~AudioSrcData();
  119. /* 分配内存空间 */
  120. bool allocateMemory(uint32_t size);
  121. /* 置零 */
  122. void clear();
  123. /* 添加数据,返回添加的数据长度 */
  124. uint32_t appendData(const char* srcData, uint32_t size);
  125. /* 返回是数据否满了 */
  126. bool isFull() const { return (dataSize >= totalSize); }
  127. /* 判断是否为空 */
  128. bool isEmpty() const { return (dataSize == 0); }
  129. char *pData = nullptr; /* 数据缓存 */
  130. uint32_t totalSize = 0; /* 总长度 */
  131. uint32_t dataSize = 0; /* 有效数据长度 */
  132. QDateTime startTime; /* 数据时间戳,开始时间 */
  133. QDateTime endTime; /* 数据时间戳,结束时间 */
  134. private:
  135. };
  136. /**
  137. * @brief 存储左右声道的数据
  138. *
  139. */
  140. struct AudioLeftRightData
  141. {
  142. AudioLeftRightData(int totalSize);
  143. ~AudioLeftRightData();
  144. AudioLeftRightData(const AudioLeftRightData& obj);
  145. AudioLeftRightData& operator=(const AudioLeftRightData &obj);
  146. /* 判断是否是同一个数据,通过数据大小和时间戳来判断 */
  147. bool isSameData(const AudioLeftRightData& obj) const;
  148. /* 音频数据 */
  149. std::vector<double> vecLeftData; /* 左声道数据 */
  150. std::vector<double> vecRightData; /* 右声道数据 */
  151. int totalSize = 0; /* 总长度,两个声道的总长度是一样的 */
  152. int numMSecond = 0; /* 数据对应的毫秒数 */
  153. QDateTime startTime; /* 开始时间戳 */
  154. QDateTime endTime; /* 结束时间戳 */
  155. };
  156. /**
  157. * @brief 存储wav小文件路径的结构体
  158. *
  159. */
  160. struct WavFilePath
  161. {
  162. std::string fileName; /* 文件路径 */
  163. QDateTime startDateTime; /* 开始时间戳 */
  164. QDateTime endDateTime; /* 结束时间戳 */
  165. WavFilePath() = default;
  166. WavFilePath& operator=(const WavFilePath& obj);
  167. bool operator==(const WavFilePath& obj) const;
  168. };
  169. #endif // _AUDIODATA_H_