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