在linux中使用QAudioInput录制并在windows中播放

Posted

技术标签:

【中文标题】在linux中使用QAudioInput录制并在windows中播放【英文标题】:Record in linux with QAudioInput and play it in windows 【发布时间】:2015-12-06 07:31:02 【问题描述】:

出于我的目的,我想以原始格式(仅样本)、8kHz、16 位(小端)和 1 通道录制声音。然后,我想将这些样本传输到窗口并使用 QAudioOutput 播放。所以我有两个独立的程序:一个用于使用 QAudioInput 录制语音,另一个提供一个包含一些样本的文件,然后我使用 QAudioOutput 播放它。下面是我创建 QAudioInput 和 QAudioOutput 的源代码。

//Initialize audio
void AudioBuffer::initializeAudio()

  m_format.setFrequency(8000); //set frequency to 8000
  m_format.setChannels(1); //set channels to mono
  m_format.setSampleSize(16); //set sample sze to 16 bit
  m_format.setSampleType(QAudioFormat::UnSignedInt ); //Sample type as usigned integer sample
  m_format.setByteOrder(QAudioFormat::LittleEndian); //Byte order
  m_format.setCodec("audio/pcm"); //set codec as simple audio/pcm

  QAudioDeviceInfo infoIn(QAudioDeviceInfo::defaultInputDevice());
  if (!infoIn.isFormatSupported(m_format))
  
      //Default format not supported - trying to use nearest
      m_format = infoIn.nearestFormat(m_format);
  

  QAudioDeviceInfo infoOut(QAudioDeviceInfo::defaultOutputDevice());

  if (!infoOut.isFormatSupported(m_format))
  
     //Default format not supported - trying to use nearest
     m_format = infoOut.nearestFormat(m_format);
  
  createAudioInput();
  createAudioOutput();


void AudioBuffer::createAudioOutput()

  m_audioOutput = new QAudioOutput(m_Outputdevice, m_format, this);


void AudioBuffer::createAudioInput()

   if (m_input != 0) 
     disconnect(m_input, 0, this, 0);
     m_input = 0;
    

   m_audioInput = new QAudioInput(m_Inputdevice, m_format, this);


这些程序分别在 Windows 和 Linux 中运行良好。但是,当我在 Linux 中录制声音并在 Windows 中播放时,它会产生很大的噪音。

我发现在 windows 和 Linux 中捕获的样本是不同的。第一张图片与 Linux 中捕获的声音有关,第二张与 Windows 中的声音有关。

在 Linux 中捕获的声音:

在 Windows 中捕获的声音:

更多细节是 Windows 和 Linux 中的沉默是不同的。我尝试了很多东西,包括交换字节,即使我在两个平台上都设置了小端。

现在,我对 alsa 配置有疑问。有没有遗漏的设置?

你认为不使用 QAudioInput 直接录制声音会更好吗?

【问题讨论】:

你能检查isFormatSupported在这两种情况下是否为真吗? 输入输出均为真! 删除计算nearestFormat代码的两行并在其中放置abort(),然后在linux上记录一个新文件,将文件移动到windows,然后在那里重试。确保您在两者上都使用了新版本,并应用了更改,并且您正在播放从 linux 机器传输的新捕获的文件。 【参考方案1】:

声音是UnSignedInt,但是样本值有负值和正值!看来你在捕捉时遇到了麻烦。将QAudioFormat::UnSignedInt 更改为QAudioFormat::SignedInt

【讨论】:

以上是关于在linux中使用QAudioInput录制并在windows中播放的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Qt 中将音频从麦克风录制到 QFile

如何使用 QAudioInput 从两个通道捕获音频信号

是否可以使用 MediaProjection API 并在录制过程中处理每个录制的帧?

从麦克风捕获声音时不执行 QAudioInput::notify()

Qt文档阅读笔记-QAudioInput&QAudioFormat解析与实例

Qt文档阅读笔记-QAudioInput&QAudioFormat解析与实例