我正在使用 Qt Multimedia 5 分析来自音频输入设备的音频(FFT、LUFS 和 dBFS 等)。要获取音频数据,有两个主要选项,QAudioRecorder和QAudioInput。他们都可以使用 PCM 读取音频数据(QAudioInput 使用 QBuffer 和 QAudioRecorder 使用 QAudioBuffer)并设置格式(例如,采样率),我应该使用什么?我想知道 QAudioRecorder 和 QAudioInput 之间的区别。
问问题
146 次
1 回答
1
QAudioBuffer
非常方便,QAudioProbe
只要有新的缓冲区可用,您就可以使用该类来获得通知 - 在 Qt 5QAudioProbe
中。不幸的是,Mac OS 不支持。
QAudioProbe
在 Qt 6 中不存在,在 Qt 5 中也不完全支持。
在 Qt 5 和 Qt 6 中以最小延迟访问“实时”原始音频数据的唯一方法是制作您自己的QIODevice
数据并从推送模式中获取数据 - 请参阅QAudioSource
音频源示例,特别是类。AudioInfo
过程如下:
- 创建 io 设备的实例。
- 传递给
QAudioSource::start(QIODevice*)
. 音频源会将原始数据写入您提供的设备。 - 在设备的实现中,您可以直接处理数据,也可以合成一个
QAudioBuffer
实例并以信号的形式发送出去。
像下面这样的东西会起作用:
class AudioProbeDevice : public QIODevice
{
Q_OBJECT
QAudioFormat m_format;
public:
AudioProbeDevice (QObject* parent = {}) : QIODevice(parent) {}
void start(QAudioInput *source)
{
Q_ASSERT(source);
m_format = source->format();
open(QIODevice::WriteOnly);
}
qint64 readData(char *, qint64) override { return 0; }
qint64 writeData(const char *data, qint64 count) override
{
QAudioBuffer buffer({data, static_cast<int>(count)}, m_format);
emit audioAvailable(buffer);
return count;
}
Q_SIGNAL void audioAvailable(const QAudioBuffer &buffer);
};
于 2021-09-20T14:18:48.340 回答