AudioData.h 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  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. int32_t fileSize = 0; // 文件大小
  21. char WAVE[4] = {'W', 'A', 'V', 'E'}; // WAVE标识符
  22. char fmt[4] = {'f', 'm', 't', ' '}; // fmt子块标识符
  23. int32_t fmtChunkSize = 16; // fmt子块大小
  24. int16_t audioFormat = 1; // 音频格式,1表示PCM
  25. int16_t numChannels = 2; // 声道数,1表示单声道,2表示立体声
  26. int32_t sampleRate = 48000; // 采样率
  27. int32_t byteRate = 0; // 字节率,等于采样率 * 声道数 * 每个采样点的字节数
  28. int16_t blockAlign = 4; // 块对齐,等于声道数 * 每个采样点的字节数
  29. int16_t bitsPerSample = 16; // 每个采样点的位数,16位深度
  30. char data[4] = {'d', 'a', 't', 'a'}; // data子块标识符
  31. int32_t dataChunkSize = 0; // 数据块大小,等于音频数据的字节数
  32. /* 一些需要手动设置的参数 */
  33. void setSampleRate(int32_t rate) { sampleRate = rate; }
  34. void setNumChannels(uint16_t channels) { numChannels = channels; }
  35. void setBitsPerSample(uint16_t bits) { bitsPerSample = bits; }
  36. void setDataSize(int32_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 OneDBData
  111. {
  112. OneDBData() = default;
  113. ~OneDBData() = default;
  114. OneDBData(const OneDBData& obj) { *this = obj; }
  115. OneDBData& operator=(const OneDBData &obj);
  116. void clear();
  117. int leftDB = VOLUME_MIN_BD; /* 左声道音量包 */
  118. int rightDB = VOLUME_MIN_BD; /* 右声道音量包 */
  119. float phase = 0.0; /* 相位包 */
  120. QDateTime startTime; /* 开始时间戳 */
  121. QDateTime endTime; /* 结束时间戳 */
  122. };
  123. /**
  124. * @brief 音频原始数据
  125. *
  126. */
  127. struct AudioSrcData
  128. {
  129. public:
  130. AudioSrcData(int32_t recordSize = 0);
  131. AudioSrcData(const AudioSrcData& obj);
  132. AudioSrcData& operator=(const AudioSrcData &obj);
  133. AudioSrcData(AudioSrcData&& obj) = delete;
  134. void operator=(AudioSrcData&& obj) = delete;
  135. ~AudioSrcData();
  136. /* 分配内存空间 */
  137. bool allocateMemory(int32_t size);
  138. /* 置零 */
  139. void clear();
  140. /* 添加数据,返回添加的数据长度 */
  141. int32_t appendData(const char* srcData, int32_t size);
  142. /* 返回是数据否满了 */
  143. bool isFull() const { return (dataSize >= totalSize); }
  144. /* 判断是否为空 */
  145. bool isEmpty() const { return (dataSize == 0); }
  146. char *pData = nullptr; /* 数据缓存 */
  147. int32_t totalSize = 0; /* 总长度 */
  148. int32_t dataSize = 0; /* 有效数据长度 */
  149. QDateTime startTime; /* 数据时间戳,开始时间 */
  150. QDateTime endTime; /* 数据时间戳,结束时间 */
  151. private:
  152. };
  153. /**
  154. * @brief 存储左右声道的数据
  155. *
  156. */
  157. struct AudioLeftRightData
  158. {
  159. AudioLeftRightData(int totalSize);
  160. ~AudioLeftRightData();
  161. AudioLeftRightData(const AudioLeftRightData& obj);
  162. AudioLeftRightData& operator=(const AudioLeftRightData &obj);
  163. /* 判断是否是同一个数据,通过数据大小和时间戳来判断 */
  164. bool isSameData(const AudioLeftRightData& obj) const;
  165. /* 音频数据 */
  166. std::vector<double> vecLeftData; /* 左声道数据 */
  167. std::vector<double> vecRightData; /* 右声道数据 */
  168. int totalSize = 0; /* 总长度,两个声道的总长度是一样的 */
  169. int numMSecond = 0; /* 数据对应的毫秒数 */
  170. QDateTime startTime; /* 开始时间戳 */
  171. QDateTime endTime; /* 结束时间戳 */
  172. };
  173. /**
  174. * @brief 存储wav小文件路径的结构体
  175. *
  176. */
  177. struct WavFilePath
  178. {
  179. std::string fileName; /* 文件路径 */
  180. QDateTime startDateTime; /* 开始时间戳 */
  181. QDateTime endDateTime; /* 结束时间戳 */
  182. WavFilePath() = default;
  183. WavFilePath& operator=(const WavFilePath& obj);
  184. bool operator==(const WavFilePath& obj) const;
  185. };
  186. #endif // _AUDIODATA_H_