我想将混合声音从WCF服务器传输到所有连接的客户端。为此使用WCF服务回调。使用naudio库混合声音。
这是服务器端(WCF方法)的一个小例子:
MixingSampleProvider _mixer = new MixingSampleProvider(sound32.WaveFormat);
SampleToWaveProvider _sampleToWave = new SampleToWaveProvider(_mixer);
// service method
byte[] buffer = new byte[1000];
do{
_sampleToWave.Read(buffer, 0, 1000);
client.Callback.SendBuffer(buffer);
} while (_isPlaying)
和客户端:
BufferedWaveProvider _bufferedWave = new BufferedWaveProvider(sound32.WaveFormat);
// DirectSoundOut _output = new DirectSoundOut();
WaveOut _output = new WaveOut();
_output.Init(_bufferedWave);
// callback event method
if (_output.PlaybackState != PlaybackState.Playing)
_bufferedWave.AddSamples(buffer, 0, 1000);
// now in timer_tick event method
// if(_bufferedWave.BufferedDuration.TotalSeconds > 0.5)
// _output.Play();
// else
// _output.Pause();
我是新手,所以我有几个问题。 这个想法是好的吗?是否有更简单的选择来处理这个?
[EDIT_1] 我用本地两种方法创建了测试应用程序,应该模拟这个,我发现,当缓冲声播放时,_bufferedWave.BufferedBytes不会清除(并且它会立即溢出)。有人可以告诉我,为什么?
[EDIT_1]将_output字段的类型从DirectSoundOut更改为WaveOut,这很有帮助。 我做的第二个改变是,我添加了DispatcherTimer来处理缓冲持续时间大于0.5的时间(根据naudio MP3Streaming示例)。
现在,我正在与缓冲时间作斗争。我只能在_timer_Tick事件方法中听到声音:
_bufferedWave.BufferedDuration.TotalSeconds > XX // this XX is time I can hear sound
任何想法或意见?
答案 0 :(得分:0)
我不确定这会按你希望的方式运作。 WCF是基于TCP的,并且TCP不是为广播音频视频或任何需要速度的东西(如游戏)而设计的,因为它不断检查数据包。
我以前使用naudio通过网络将声音传输到侦听器客户端,但要使其工作,您需要使用UDP。
如果你想让它在互联网上工作,你需要研究UDP打孔。
在发送音频之前,您应该将其从16位压缩到8位,然后在使用类似ALaw或MuLaw解码器/编码器的接收时将其压缩到16位。