Qt输入音频测量

时间:2020-03-22 17:21:25

标签: c++ qt audio signal-processing volume

我想以峰值或分贝或其他方式测量输入音量的水平,我只想测量并检测响度。我有这段代码,但不能连续检测。它只是检测水平在开始和之后,水平开始降低。 头文件的相关部分:

  Q_INVOKABLE void start();
  Q_INVOKABLE void stop();
  std::shared_ptr<QAudioInput> source;
  QIODevice *device;
  QAudioFormat format;
  int peak = 0, n;
  int16_t v;

C ++文件:

#include "Bot.h"

void Bot::start() {
  format.setByteOrder(QAudioFormat::LittleEndian);
  format.setChannelCount(2);
  format.setCodec("audio/pcm");
  format.setSampleRate(8000);
  format.setSampleSize(16);
  format.setSampleType(QAudioFormat::SignedInt);
  source = std::shared_ptr<QAudioInput>(new QAudioInput(format));
  device = source->start();
  connect(device, SIGNAL(readyRead()), this, SLOT(onReadyRead()));
}

void Bot::stop() {
  source = nullptr;
  device = nullptr;
  peak = 0;
  emit volumeChanged(peak);
}

void Bot::onReadyRead() {
  peak = 0;
  n = source->bytesReady();
  n /= 2;
  if (n >= 80) {
    for (int i = 0; i < n; i++) {
      v = 0;
      device->read((char *)&v, 2);
      if (v < 0) {
        v = -v;
      }
      if (peak < v) {
        peak = v;
      }
    }
    peak = peak * 100 / 32768;
    if (peak < 0) {
      peak = 0;
    }
    emit volumeChanged(peak);
  }
}

0 个答案:

没有答案