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.

过程如下:

  1. 创建您的 io 设备的实例。
  2. 传给QAudioSource::start(QIODevice*)。音频源会将原始数据写入您提供的设备。
  3. 在设备的实现中,您可以直接处理数据,或者合成一个 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);
};