我正在制作一个VOIP计划以获得乐趣,而且我大部分都在努力。自我上一个问题以来,出现了另一个问题。当使用MixingWaveProvider通过客户端播放两个或更多声音时,最终混合音频中会出现奇怪的断言,咔嗒声,快照和静音。大多数时候,它听起来像某人的声音播放,停顿的一部分,并让一个人的声音播放了一会儿。只要两个人都在说话,这种情况就会持续下去(每个声音似乎都“轮流”输出到waveMixer)。
我不打算发布Speex编码/解码代码,因为无论是否使用此问题都会发生。我通过WaveInEvent获取输入,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秒左右的声音,我已经检查过它没有耗尽/暂停声音中流。虽然这应该是一件好事,但声音失真仍然存在,并且它和以前一样糟糕。混音器或我的设置似乎有问题。
答案 0 :(得分:1)
听起来你已经诊断出了这个问题。如果BufferedWaveProviders没有填满,那么你会沉默。您需要实现某种自动暂停,以延迟播放,直到有足够的缓冲音频。这样做的一种欺骗方法是以5秒的静音启动每个缓冲区,这样可以在缓冲区播放时接收另外5秒的音频。