首页 > 解决方案 > Qt 输入音频测量

问题描述

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

  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);
  }
}

标签: c++qtaudiosignal-processingvolume

解决方案


推荐阅读