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

Posted

技术标签:

【中文标题】使用回调从 WCF 发送混合声音【英文标题】:Send mixed sound from WCF using callbacks 【发布时间】:2014-11-24 09:24:48 【问题描述】:

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

我不确定这是否会如您所愿。 WCF 是基于 TCP 的,并且 TCP 不是为广播音频视频或任何需要速度的东西(如游戏)而设计的,因为它会不断检查数据包。

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

如果您希望它在 Internet 上运行,那么您需要研究 UDP 打孔。

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

【讨论】:

正如您所写,如果我使用真实的服务器和客户端进行尝试,我的想法将无法正常工作。你有任何简单的例子来使用 UDP 打孔进行类似的音频传输吗?是否有任何选项可以使用 wcf 来完成此操作,如下所示:wcf - udp transport? 查看这个以获得 UDP 打孔的一个很好的解释和实现,虽然我自己还没有尝试过 fluxbytes.com/csharp/udp-hole-punching-implementation-in-c 并且这个对 Skype 如何工作的解释非常好:h-online.com/security/features/… 我已经没有尝试过包裹在 WCF 中的 UDP,但我不确定它会如何影响流量。 WCF 的想法是创建一个 API 来发送命令和返回对象/值,它并不是真正为流媒体设计的。不过这可能会有所帮助:bit.ly/1xUNIMf 仅供参考:我现在已经根据WCF duplex bi-directional streaming with websocket transport 实现了 websocket WCF 绑定。并且 IIS 或 Azure 中的 UDP 多播绑定存在问题,因为没有支持。客户端之间没有直接通信,所以服务器必须是发送者,客户端是多播数据的接收者? 是的,我已经阅读过这个问题。您是否尝试过将其托管在控制台应用程序中? 不,但我会尝试。谢谢你的帮助。如果这一切都能奏效,我会接受这个作为我问题的答案。

以上是关于使用回调从 WCF 发送混合声音的主要内容,如果未能解决你的问题,请参考以下文章

在iOS中将最近混合的声音文件分成两个声音

如何使用 Azure WCF 中继和混合连接按钮?

是否可以将多线程JavaFX AudioClip声音的混合结果记录到磁盘上?

声音特效?混合器

Android 混合原始声音。源是java数组而不是文件或资源

WCF WebHttp 混合身份验证(基本和匿名)