如何使用 QAudioInput 从两个通道捕获音频信号

Posted

技术标签:

【中文标题】如何使用 QAudioInput 从两个通道捕获音频信号【英文标题】:How can I capture audio signal from two channels with QAudioInput 【发布时间】:2014-03-01 22:06:22 【问题描述】:

我想用 QAudioInput 从我的音频设备捕获声音。我有一个立体声(双声道)输入信号,通常我只需调用函数 setChannelCount() 和我的声道数,在这种情况下 2. 我的目标是将来自通道1的信号保存在文件1中,将来自通道2的信号保存在文件2中。我的问题是如何分离这两个信号。

【问题讨论】:

【参考方案1】:

QAudioInput 的文档来看,您需要自己的QIODevice 专业化,您可以在其中覆盖writeData,以便将数据散播到2 个文件中。我没有尝试编译它,但它应该会给你一个大致的想法。

class MyIODevice : public QIODevice

public:
    MyIODevice(QIODevice* file1, QIODevice* file2)
      : m_file1(file1), m_file2(file2) 

    qint64 writeData(const char* data, qint64 maxSize)
    
        // for 32-bits with the channels interleaved.
        // I'm also making an assumption that QAudioInput will call this with
        // a complete frame of data.
        for (int i = 0; i < maxSize / 8; ++i)
        
            m_file1->writeData(data, 4);
            data += 4;
            m_file2->writeData(data, 4);
            data += 4;
        
    
private:
    QIODevice* m_file1;
    QIODevice* m_file2;
;

正如所写,这仅适用于一种音频格式,但可以通过将有关格式的一些参数传递给构造函数等来轻松使其更通用...

【讨论】:

谢谢,但在保存之前,我想实时处理来自通道 1 的信号 1 和来自通道 2 的信号 2,我真的可以使用相同的音频格式但来自两个通道。所以我打算使用两个缓冲区 1 和 2。我的问题是当我使用 2(setChannelCount(2)) 调用函数 setChannelCount() 时,我不知道如何分离这两个信号。如何设置或分离来自通道 1 的信号和频道 2. QAudioformat 文档对我没有帮助 @TheMan 我没有早点看到你的评论,但你现在问的是一个与你原来的帖子不同的问题。

以上是关于如何使用 QAudioInput 从两个通道捕获音频信号的主要内容,如果未能解决你的问题,请参考以下文章

在linux中使用QAudioInput录制并在windows中播放

如何在 java/xuggler 中混音多个音频通道?

请教STM32 定时器PWM输入捕获 引脚通道配置

信号 goroutine 在通道关闭时停止

Qt文档阅读笔记-QAudioInput&QAudioFormat解析与实例

Qt文档阅读笔记-QAudioInput&QAudioFormat解析与实例