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

本文关键字:混合 声音 WCF 回调 | 更新日期: 2023-09-27 18:31:36

我想将混合声音从WCF服务器传输到所有连接的客户端。为此使用 WCF 服务回调。声音使用音频库进行混合。

下面是服务器端(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

有什么想法或意见吗?

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

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

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

如果您希望这在互联网上工作,那么您将需要研究 UDP 打孔。

此外,在传输音频之前,您应该将其从 16 位压缩到 8 位,然后在使用 ALaw 或 MuLaw 解码器/编码器接收后将其压缩回 16 位。