这是我在 Stackoverflow 上的第一篇文章,希望我做对了。
我是 C++ 新手。
我一直在玩 RtAudio 和 Qt(在 linux、桌面和树莓派上)。
后端是 ALSA。
我的台式计算机上的音频输出都很好(ClassCompilant 模式下的 RME Fireface UCX 和带有 HifiBerry 和 PiSound 的 Raspberry Pi 3)
最近,我尝试在我的程序中添加音频输入支持。我阅读了RtAudio 网站上的双工教程,并尝试在我的代码中实现它。
一旦我添加了输入StreamParameters
,openStream
我就听到了非常刺耳的声音。虽然,StreamStatus 在回调中是可以的......
我尝试创建一个空的 C++ 项目,并简单地复制 RtAudio 教程。可悲的是,问题仍然存在......
我将此添加到我在 Qt Creator 中的项目文件中
LIBS += -lpthread -lasound
我认为我的问题类似于这个问题,但我找不到它是如何(或是否)解决的
我尝试了不同的缓冲区大小(从 64 到 4096 甚至更多),裂缝不太听得见,但当缓冲区大小增加时仍然存在
你知道关于双工模式下的 RtAudio 应该做些什么来解决这个问题吗?在双工模式下,缓冲区大小似乎不一样。
编辑 :
出于好奇(和绝望),我使用 RtAudio 帮助中的规范示例尝试了更低的缓冲区大小:事实证明,使用缓冲区大小 1、2、4 和 8 帧可以消除裂缝......
我一使用16帧,声音就很糟糕
即使是 15 帧也可以,我真的不明白发生了什么
代码示例:
RtAudio::StreamOptions options;
options.flags |= RTAUDIO_SCHEDULE_REALTIME;
RtAudio::StreamParameters params_in, params_out;
params_in.deviceId = 3;
params_in.nChannels = 2;
params_out.deviceId = 3;
params_out.nChannels = 2;
仅输出时,它可以工作:
try {
audio.openStream(
¶ms_out,
NULL,
RTAUDIO_SINT16,
48000,
&buffer_frames,
&inout,
(void *) &buffer_bytes,
&options
);
}
catch (RtAudioError& e) {
std::cout << "Error while opening stream" << std::endl;
e.printMessage();
exit(0);
}
NULL
更改为时出现裂缝¶ms_in
:
try {
audio.openStream(
¶ms_out,
¶ms_in,
RTAUDIO_SINT16,
48000,
&buffer_frames,
&inout,
(void *) &buffer_bytes,
&options
);
}
catch (RtAudioError& e) {
std::cout << "Error while opening stream" << std::endl;
e.printMessage();
exit(0);
}
谢谢您的帮助