2

我开始研究一个 VOIP 程序来学习一些 VOIP 的基础知识。我大部分时间都在工作,但是在我将系统转换为使用 WaveMixerStream32 后遇到了问题。

我的程序使用 16 位波形格式从 WaveIn 读取输入,使用 Speex 编解码器对其进行压缩,然后通过网络将其发送到客户端。起初,我一直在错误地使用 BufferedWaveProvider,这导致我考虑使用 WaveMixerStream32。但是,要使用它,我需要将 BufferedWaveProvider 转换为 WaveStream32,然后可以在 WaveMixerStream32 中使用它。

我用来转换的代码是:

provider = new BufferedWaveProvider(format) { DiscardOnBufferOverflow = true };
wave16ToFloat = new Wave16ToFloatProvider(provider); // I have tried with and without this converter.
wpws = new WaveProviderToWaveStream(wave16ToFloat);
channel = new WaveChannel32(wpws);

我从This Question获得了 IWaveProvider 到 WaveStream 转换器。

然后我将最终流添加到 WaveMixerStream32 中,如下所示:

waveMixer.AddInputStream(channel);

虽然它比我原来的效果好得多,但最终音频的音高比输入要深得多。

我做错了什么/我该如何解决?

4

2 回答 2

3

您很可能正在播放立体声音频,就好像它是单声道一样。这将使球场减半。检查 WaveFormat 在信号链中的每个点是否具有预期值。请注意,WaveChannel32 会将单声道转换为立体声。

于 2013-08-27T22:32:00.603 回答
2

在遵循 Mark 和 Hans 的回答并修改采样率之后,我发现我的 WaveOutput 期望的采样率是 44.1kHz,而我只给了它 32kHz。我最初将 WaveIn 采样率设置为 32kHz,因为我预计我的编解码器 Speex 需要该采样率才能正常工作(它的采样率设置仅高达 32kHz)。但是,将 WaveIn 采样率更改为 44.1kHz 后,所有音高问题都消失了。

于 2013-08-29T01:50:46.347 回答