AudioData.h 7.5 KB

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