出于我的目的,我想用Qt5.1录制WAV格式,16000Hz,16bit和1声道的声音,但声音默认都是32bit。所以我必须找到一个可以设置“Bit Size”的类,而类是QAudioFormat,因为类中有一个函数setBitSize()。所以我不能再使用QAudioRecorder类,因为它不能将QAudioFormat作为参数,而是QAudioInput。我用QAudioInput用以下代码录制声音:
#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成功录制了声音,唯一不同的是QAudioRecorder类具有setAudioInput()函数(即“audio-&gt; setAudioInput(”alsa:default“);)。所以我想也许这就是问题,但QAudioInput没有这样的功能。这是我的问题,也许你可以给我一些建议,非常感谢: - )
答案 0 :(得分:3)
我很高兴找到与我同样问题的人。我一直试图用带有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的类中,唯一的区别是我将sleep(3000)
替换为QTimer::singleShot(3000, this, SLOT(terminateRecording()));
。与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;
};
答案 1 :(得分:0)
所以基本上你似乎遇到的问题是后端不支持你试图推入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()));
}