在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中播放的主要内容,如果未能解决你的问题,请参考以下文章
是否可以使用 MediaProjection API 并在录制过程中处理每个录制的帧?
从麦克风捕获声音时不执行 QAudioInput::notify()