QAudioInput记录声音失败

时间:2013-11-30 05:54:57

标签: audio qt5 alsa

出于我的目的,我想用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没有这样的功能。这是我的问题,也许你可以给我一些建议,非常感谢: - )

2 个答案:

答案 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()));
}