1

我正在使用 Qt Multimedia 5 分析来自音频输入设备的音频(FFT、LUFS 和 dBFS 等)。要获取音频数据,有两个主要选项,QAudioRecorderQAudioInput。他们都可以使用 PCM 读取音频数据(QAudioInput 使用 QBuffer 和 QAudioRecorder 使用 QAudioBuffer)并设置格式(例如,采样率),我应该使用什么?我想知道 QAudioRecorder 和 QAudioInput 之间的区别。

4

1 回答 1

1

QAudioBuffer非常方便,QAudioProbe只要有新的缓冲区可用,您就可以使用该类来获得通知 - 在 Qt 5QAudioProbe中。不幸的是,Mac OS 不支持。

QAudioProbe在 Qt 6 中不存在,在 Qt 5 中也不完全支持。

在 Qt 5 和 Qt 6 中以最小延迟访问“实时”原始音频数据的唯一方法是制作您自己的QIODevice数据并从推送模式中获取数据 - 请参阅QAudioSource音频源示例,特别是AudioInfo

过程如下:

  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);
};
于 2021-09-20T14:18:48.340 回答