首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Qt: QAudioInput vs QAudioRecorder

Qt: QAudioInput vs QAudioRecorder
EN

Stack Overflow用户
提问于 2021-09-20 12:54:51
回答 1查看 146关注 0票数 1

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

EN

回答 1

Stack Overflow用户

发布于 2021-09-20 14:18:48

QAudioBuffer非常方便,只要有新的缓冲区可用,就会使用QAudioProbe类进行通知--在Qt5中。不幸的是,Mac不支持QAudioProbe

QAudioProbe在Qt6中不存在,在Qt5中也不完全支持。

在Qt5和Qt6中访问“实时”原始音频数据的唯一方法是制作自己的QIODevice,并在推送模式下从QAudioSource获得数据-请参阅Audio Source example,特别是AudioInfo class

具体流程如下:

  1. 创建io设备的实例。
  2. 将其传递给QAudioSource::start(QIODevice*)。音频源将向您提供的设备写入原始数据。
  3. 在设备的实现中,您可以直接处理数据,也可以合成QAudioBuffer实例并以信号形式将其发送出去。

下面这样的代码将会起作用:

代码语言:javascript
运行
复制
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);
};
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69254792

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档