Q音频输入录制声音失败



出于我的目的,我想使用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()));
}

相关内容

  • 没有找到相关文章