我想使用QAudioInput从麦克风捕获声音,对其进行处理然后再播放。据我了解,我需要连接到notify信号和内部处理程序,以便用户使用readAll()函数来获取原始数据。但是问题是,此处理函数永远不会执行。这是我的代码:

void MainWindow::on_pushButton_clicked()
{

    QList<QAudioDeviceInfo> list = QAudioDeviceInfo::availableDevices(QAudio::AudioInput);

    if(list.isEmpty())
    {
        qDebug() << "No audio input device";
        return;
    }

    QAudioDeviceInfo info = QAudioDeviceInfo::defaultInputDevice();

    QAudioFormat format;
    // Set up the desired format, for example:
    format.setSampleRate(44100);
    format.setChannelCount(1);
    format.setSampleSize(32);
    format.setCodec("audio/pcm");
    format.setByteOrder(QAudioFormat::LittleEndian);
    format.setSampleType(QAudioFormat::UnSignedInt);

    if (!info.isFormatSupported(format)) {
        qWarning() << "Default format not supported, trying to use the nearest.";
        format = info.nearestFormat(format);
    }

    qDebug() << "input device :" << info.deviceName();

    audio = new QAudioInput(info, format);
    qDebug("created()");

    connect(audio, SIGNAL(notify()), this, SLOT(onNotify()));
    audio->setNotifyInterval(10);

    bufferInput = audio->start();
}

void MainWindow::onNotify()
{
    qDebug() << "onNotify()";
    //QByteArray array = bufferInput->readAll();
    //bufferOutput->write(array);
}

(audio的类型为QAudioInput*bufferInput的类型为QIODevice*)

当我单击该按钮时,将显示“输入设备=”和“创建的()”消息,但未显示“onNotify()”。

我究竟做错了什么?

最佳答案

QAudioInput似乎已损坏。或者我完全误会了一些东西。
对我来说唯一可靠的方法是使用readyRead()返回的QIODevice缓冲区的start()信号。不幸的是,这在我的系统上很少触发(大约每40到60毫秒一次)。

我发现的是,当我在notify()上调用resume()时(因为在调用QAudioInput之后它处于空闲状态)或在start()上执行readAll()(!),QIODevice开始触发。但是至少对于PyQt,这会在一分钟左右后导致堆栈溢出。
我会怀疑平台也很重要,因为实际的QAudioInput实现取决于所使用的平台和音频系统(在我的情况下为Fedora 32上的PulseAudio)。

08-07 21:31