我开始研究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);
虽然它比我原来的效果要好得多,但最终音频的音高比输入深得多。
我做错了什么/我该如何解决?
答案 0 :(得分:3)
很可能你正在播放立体声音频,好像它是单声道的。这会使球场减半。检查WaveFormat在信号链中的每个点是否具有预期值。请注意,WaveChannel32将单声道制作成立体声。
答案 1 :(得分:2)
在听完Mark和Hans的回答并修改采样率之后,我发现我的WaveOutput期望采样率为44.1kHz,而我只给它32kHz。我最初将WaveIn采样率设置为32kHz,因为我预计我的编解码器Speex需要采样率才能正常工作(它的采样率设置仅高达32kHz)。然而,在将WaveIn采样率改为44.1kHz后,所有音调问题都消失了。