使用回调从WCF发送混合声音

时间:2014-11-24 09:24:49

标签: c# wcf audio-streaming naudio audio

我想将混合声音从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

任何想法或意见?

1 个答案:

答案 0 :(得分:0)

我不确定这会按你希望的方式运作。 WCF是基于TCP的,并且TCP不是为广播音频视频或任何需要速度的东西(如游戏)而设计的,因为它不断检查数据包。

我以前使用naudio通过网络将声音传输到侦听器客户端,但要使其工作,您需要使用UDP。

如果你想让它在互联网上工作,你需要研究UDP打孔。

在发送音频之前,您应该将其从16位压缩到8位,然后在使用类似ALaw或MuLaw解码器/编码器的接收时将其压缩到16位。