【发布时间】:2018-11-10 02:18:21
【问题描述】:
这是我在 Stackoverflow 上的第一篇文章,希望我做得对。
我是 C++ 新手。
我一直在玩 RtAudio 和 Qt(在 linux、桌面和树莓派上)。
后端是 ALSA。
我的台式计算机上的音频输出都很好(在 ClassCompilant 模式下的 RME Fireface UCX 和带有 HifiBerry 和 PiSound 的 Raspberry Pi 3)
最近,我尝试在我的程序中添加音频输入支持。 我在 RtAudio 网站上阅读了duplex tutorial,并尝试在我的代码中实现它。
当我将输入 StreamParameters 添加到 openStream 时,我听到了非常刺耳的声音。
虽然,StreamStatus 在回调中是可以的...
我尝试创建一个空的 C++ 项目,并简单地复制 RtAudio 教程。 可悲的是,问题仍然存在......
我将此添加到我在 Qt Creator 中的项目文件中
LIBS += -lpthread -lasound
我认为我的问题类似于 this one,但我找不到它是如何(或是否)解决的
我尝试了不同的缓冲区大小(从 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改成&params_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);
}
感谢您的帮助
【问题讨论】:
-
听起来你的后端无法支持这么小的缓冲区。你用的是什么后端?
-
感谢您的评论。后端是 ALSA,我尝试了从 64 到 16384 的缓冲区:缓冲区增加时裂缝较少出现,但永远不会消失。输出仅适用于 64 个缓冲区。
-
也许试试插孔音频?或者为音频构建一个“RT 内核”。
-
我正在尝试 JACK,内核是来自Blokas Pisound 的树莓派上的 RT。我会试试杰克,谢谢!
-
请记住,PI 有点供电不足,可能它的音频芯片也可能如此。如果问题是由于尝试进行全双工音频而引起的,则可能是接口带宽问题……很可能是没有足够的汁液来实现全双工。