MixingWaveProvider的多个输入导致质量受损

本文关键字:输入 MixingWaveProvider | 更新日期: 2023-09-27 18:29:40

我制作一个VOIP程序是为了好玩,而且我大部分时间都在工作。自从我上次提问以来,又出现了另一个问题。当使用MixingWaveProvider通过客户端播放两个或多个声音时,在最终的混合音频中会出现奇怪的结巴、点击、快照和静态。大多数时候,它听起来像是某人的一部分声音在播放、暂停,并让另一个人的声音播放一小段时间。只要双方都在说话,这种情况就会持续下去(每个声音似乎都"轮流"输出到waveMixer)。

我不会麻烦发布Speex编码/解码代码,因为这个问题会在使用或不使用它的情况下发生。我通过WaveInEvent获得输入,它将信息馈送到UDP网络流中。UDP流将声音数据发送到其他客户端。

以下是我用来初始化WaveOut和MixingWaveProvider32:的代码

waveOut = new DirectSoundOut(settings.GetOutputDevice(), 50);
waveMixer = new MixingWaveProvider32();
waveOut.Init(waveMixer);
waveOut.Play();

当客户端连接时,我将接收到的数据包数据输入到用户的BufferedWaveProvider:

provider = new BufferedWaveProvider(format) { DiscardOnBufferOverflow = true };
wave16ToFloat = new Wave16ToFloatProvider(provider);

之后,我使用此代码将上述32位提供程序添加到MixingWaveProvider32:

waveMixer.AddInputStream(wave16ToFloat);

在MixingWaveProvider32传递给WaveOut之前添加流,问题似乎不那么严重。但是,我确实需要能够动态地添加它们。假设这就是为什么会发生这种情况。

这可能与我的网络实现有关,所以如果在这里找不到其他东西,我会研究一下。有没有可能每个语音数据包都阻止了下一个语音数据包的读取,从而产生来回的声音?如果是这样的话,我该如何在服务器上更长时间地缓冲数据,或者等待在客户端上发送更大的数据块?

编辑:

我几乎可以肯定,这是由BufferedWaveProviders每秒完全耗尽几次造成的。数据包填充得不够快,而且它们耗尽了,没有留下任何可传输的东西。正如我上面所问的,有没有什么方法可以从客户端以大块的形式发送它们?或者我可以以某种方式使缓冲区的排水速度变慢吗?

编辑2:

我现在已经实现了一个自动暂停缓冲区,以确保它保持填充状态。当内部缓冲区的声音超过1秒时,缓冲区将取消暂停,当数据低于0.5秒时,缓冲区时将暂停。然而,缓冲区在声音的1秒左右徘徊,我已经检查过它是否没有耗尽/暂停声音。虽然这应该是一件好事,但声音失真仍然存在,而且和以前一样糟糕。混音器或我的设置似乎有问题。

MixingWaveProvider的多个输入导致质量受损

听起来您已经诊断出了问题。如果BufferedWaveProviders没有填满,那么您将获得静音。您需要实现某种自动暂停,以延迟播放,直到有足够的缓冲音频。一种作弊的方法是在每个缓冲区开始时保持五秒钟的静音,希望在缓冲区播放时再接收五秒钟的音频。