我想使用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)。