Qt:QAudioInput 与 QAudioRecorder
Qt: QAudioInput vs QAudioRecorder
我正在使用 Qt Multimedia 5 分析来自音频输入设备的音频(FFT、LUFS 和 dBFS 等)。
获取音频数据,主要有两个选项,QAudioRecorder and QAudioInput。
他们都可以用PCM读取音频数据(QAudioInput使用QBuffer,QAudioRecorder使用QAudioBuffer)和设置格式(例如,采样率),我应该使用什么?我想知道QAudioRecorder和QAudioInput的区别
QAudioBuffer
非常方便,您可以使用 QAudioProbe
class 在新缓冲区可用时得到通知 - 在 Qt 5 中。QAudioProbe
是不幸的是 Mac OS 不支持。
QAudioProbe
在 Qt 6 中不存在,在 Qt 5 中也不完全支持。
在 Qt 5 和 Qt 6 中以最小延迟访问“实时”原始音频数据的唯一方法是制作您自己的 QIODevice
并从 QAudioSource
在 [=31] 中提供数据=]push 模式 - 见 Audio Source example, specifically the AudioInfo
class.
过程如下:
- 创建您的 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);
};
我正在使用 Qt Multimedia 5 分析来自音频输入设备的音频(FFT、LUFS 和 dBFS 等)。 获取音频数据,主要有两个选项,QAudioRecorder and QAudioInput。 他们都可以用PCM读取音频数据(QAudioInput使用QBuffer,QAudioRecorder使用QAudioBuffer)和设置格式(例如,采样率),我应该使用什么?我想知道QAudioRecorder和QAudioInput的区别
QAudioBuffer
非常方便,您可以使用 QAudioProbe
class 在新缓冲区可用时得到通知 - 在 Qt 5 中。QAudioProbe
是不幸的是 Mac OS 不支持。
QAudioProbe
在 Qt 6 中不存在,在 Qt 5 中也不完全支持。
在 Qt 5 和 Qt 6 中以最小延迟访问“实时”原始音频数据的唯一方法是制作您自己的 QIODevice
并从 QAudioSource
在 [=31] 中提供数据=]push 模式 - 见 Audio Source example, specifically the AudioInfo
class.
过程如下:
- 创建您的 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);
};