c++ - 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);
}
}
解决方案
推荐阅读
- angular - 'full-calendar' 不是已知元素:
- angular - Angular 9:没有箭头功能的延迟加载模块?
- php - 在函数中传递数据库连接
- html - 如何将 div 元素彼此相邻放置?
- plsql - 将 plsql 脚本的结果保存在 Kettle 变量中
- python - 如何获得此功能以使测验起作用?
- neo4j - 是否有任何可以导入 Neo4j 的属性图模型的协作数据建模工具
- python-3.x - 如何计算从 csv.reader 导入的数组中的值?
- amazon-web-services - 使用 AWS api 网关,如何识别使用 Lambda 代理集成或 Lambda 非代理(自定义)集成配置了哪些 api
- html - 获取 td 标题 nodeJS