出于我的目的,我想使用Qt5.1录制WAV格式的声音,16000Hz,16位和1通道,但默认情况下声音都是32位。所以我必须找到一个可以设置"Bit Size"的类,该类是QAudioFormat,因为该类中有一个函数setBitSize()。所以我不能再使用QAudioRecorder类了,因为它不能以QAudioFormat为参数,但QAudioInput可以。我使用QAudio Input录制声音,代码如下:
#include<QAudioFormat>
#include<QAudioInput>
#include<QString>
#include<QFile>
#include<QDebug>
int main()
{
QFile output;
output.setFileName("record.raw");
output.open(QIODevice::WriteOnly);
QAudioFormat settings;
settings.setCodec("audio/PCM");
settings.setSampleRate(16000);
settings.setSampleSize(16);
settings.setChannelCount(1);
settings.setByteOrder(QAudioFormat::LittleEndian);
settings.setSampleType(QAudioFormat::UnSignedInt);
QAudioInput *audio=new QAudioInput(settings);
audio->start(&output);
sleep(3);
audio->stop();
output.close();
delete audio;
return 0;
}
程序运行后,record.wav仍然为空。我已经使用QAudioRecorder成功地录制了声音,唯一不同的是QAudioRecord类有setAudioInput()函数(即"audio->setAudioOutput("alsa:default");)。所以我认为这可能是问题的关键,但QAudioInput没有这样的函数。这是我的问题,也许你可以给我一些建议,非常感谢:-)
我很高兴找到了和我有同样问题的人。几天来,我一直在尝试用QAudioRecorder用麦克风录制,但样本大小不同。多亏了你的例子,我成功地摆脱了QAudioRecorder。现在轮到我来帮你了。
我认为当程序处于睡眠功能时,它不再录制。您需要使用Qt提供的信号和插槽的概念来记录计时器运行时的情况。
#include "AudioInput.h"
void AudioInput::setup(){
output.setFileName("record.raw");
output.open(QIODevice::WriteOnly);
QAudioFormat settings;
settings.setCodec("audio/PCM");
settings.setSampleRate(16000);
settings.setSampleSize(16);
settings.setChannelCount(1);
settings.setByteOrder(QAudioFormat::LittleEndian);
settings.setSampleType(QAudioFormat::UnSignedInt);
audio=new QAudioInput(settings);
audio->start(&output);
QTimer::singleShot(3000, this, SLOT(terminateRecording()));
}
void AudioInput::terminateRecording(){
audio->stop();
output.close();
delete audio;
}
我把你的代码放在一个名为AudioInput的类中,唯一的区别是我用QTimer::singleShot(3000, this, SLOT(terminateRecording()));
替换了sleep(3000)
。与sleep
相反,此功能不会在3秒内冻结程序,但只会在时间结束时向terminateRecording()
发送信号。
这是代码的其余部分:
int main(int argc, char** argv){
QCoreApplication app(argc,argv);
AudioInput t;
t.setup();
app.exec();
return 0;
}
标题:
class AudioInput : public QObject{
Q_OBJECT
public Q_SLOTS:
void terminateRecording();
public:
void setup();
private:
QAudioInput *audio;
QFile output;
};
所以基本上,您似乎遇到的问题是后端不支持您试图推入QAudioInput的设置。幸运的是,Qt有一种方法可以获得最接近的可用格式,这里很热门:
void AudioInput::setup(){
output.setFileName("record.raw");
output.open(QIODevice::WriteOnly);
QAudioFormat settings;
settings.setCodec("audio/PCM");
settings.setSampleRate(16000);
settings.setSampleSize(16);
settings.setChannelCount(1);
settings.setByteOrder(QAudioFormat::LittleEndian);
settings.setSampleType(QAudioFormat::SignedInt);
QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice());
if (!info.isFormatSupported(settings)) {
settings = info.nearestFormat(settings); // This is the magic line
settings.setSampleRate(16000);
qDebug() << "Raw audio format not supported by backend. Trying the nearest format.";
}
audio=new QAudioInput(settings);
audio->start(&output);
QTimer::singleShot(3000, this, SLOT(terminateRecording()));
}