这是我关于Stackoverflow的第一篇文章,希望我做对了。
我是C ++的新手。
我一直在使用RtAudio和Qt(在Linux,台式机和Raspberry Pi上)。
后端是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
更改为¶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);
}
谢谢您的帮助
答案 0 :(得分:0)
回答我自己的问题。
我在Raspberry Pi 3 / PiSound上从头开始进行测试。
事实证明,我第一次肯定做错了什么。 RtAudio的规范示例(以及我为程序执行的输入实现)在64、128等缓冲区大小下可以很好地工作。
桌面版本的声音仍然有些刺耳,但是可以使用奇怪的缓冲区大小(例如25、30或27)。该问题很可能是由于Fireface UCX所致,该Linux在Linux(甚至在ClassCompilant模式下)也没有很好地支持。
谢谢您的帮助,对不起,如果我浪费您的时间。