这是我第一篇关于Stackoverflow的文章,我希望我做得对。
我是C++的新手。
我一直在玩RtAudio和Qt (在linux、桌面和raspberry pi上)。
后端是ALSA。
音频输出在我的桌面计算机上都很好( ClassCompilant模式下的RME Fireface,以及带有HifiBerry和PiSound的Raspberry Pi 3)。
最近,我尝试在我的程序中添加音频输入支持。我在RtAudio网站上阅读了RtAudio,并试图在代码中实现它。
当我将输入StreamParameters添加到openStream时,我就听到了非常刺耳的声音。虽然,StreamStatus在回调中很好.
我尝试创建一个空的C++项目,并简单地复制RtAudio教程。可悲的是问题依然存在..。
我将其添加到中的项目文件中。
LIBS += -lpthread -lasound
我认为我的问题类似于这一个,但我找不到(或者如果)它是如何解决的
我试过不同的缓冲器尺寸(从64到4096或更多),裂纹较难听到,但当缓冲区尺寸增加时,裂纹仍然存在。
您知道对于双工模式下的RtAudio应该做些什么来解决这个问题吗?在双工模式下,缓冲区大小似乎是不一样的。
编辑:
出于好奇(和绝望),我尝试了更低的缓冲区大小,使用了来自RtAudio help的典型示例:结果是使用缓冲区大小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);
}谢谢你的帮助
发布于 2018-11-09 13:27:20
回答我自己的问题。
我是在Raspberry Pi 3/ PiSound上从头开始测试的。
原来我第一次肯定做错了什么。来自RtAudio的规范示例(以及我为我的程序所做的输入实现)在64,128等缓冲区大小下工作得很好。
桌面的构建仍然有古怪的声音,但适用于奇怪的缓冲区大小(比如25、30或27)。这个问题很可能来自Fireface,它在Linux上不受很好的支持(即使是在ClassCompilant模式下)。
谢谢你的帮助,如果我浪费了你的时间,我很抱歉。
https://stackoverflow.com/questions/53189676
复制相似问题