0

这是我在 Stackoverflow 上的第一篇文章,希望我做对了。

我是 C++ 新手。

我一直在玩 RtAudio 和 Qt(在 linux、桌面和树莓派上)。

后端是 ALSA。

我的台式计算机上的音频输出都很好(ClassCompilant 模式下的 RME Fireface UCX 和带有 HifiBerry 和 PiSound 的 Raspberry Pi 3)

最近,我尝试在我的程序中添加音频输入支持。我阅读了RtAudio 网站上的双工教程,并尝试在我的代码中实现它。

一旦我添加了输入StreamParametersopenStream我就听到了非常刺耳的声音。虽然,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(
        &params_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(
        &params_out,
        &params_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);
}

谢谢您的帮助

4

1 回答 1

0

回答我自己的问题。

我在 Raspberry Pi 3 / PiSound 上重新进行了测试。

事实证明我第一次肯定做错了什么。来自 RtAudio 的规范示例(以及我为我的程序所做的输入实现)在 64、128 等缓冲区大小下运行良好。

桌面版本仍然有刺耳的声音,但可以使用奇怪的缓冲区大小(如 25、30 或 27)。问题很可能来自 Fireface UCX,它在 Linux 上没有得到很好的支持(即使在 ClassCompilant 模式下)。

谢谢你的帮助,如果我浪费了你的时间,我很抱歉。

于 2018-11-09T13:27:20.140 回答