Silverlight 语音/视频聊天客户端/服务器入门






4.85/5 (41投票s)
创建自己的 Silverlight 语音/视频聊天系统需要做什么

引言
与 Adobe Flash Player 相比,Microsoft 通过支持 Web 上的实时语音/视频聊天,为 Silverlight 4 提供了第一步。是的,这是一个伟大的进步,但仍然不够,仍然存在许多未解决的问题,作为一名程序员,如果您决定继续使用 Silverlight 技术创建自己的实时语音/视频聊天软件,您必须依靠自己来制定自己的编程解决方案。这可以总结如下:
- 目前没有用于对视频/音频数据进行编码/解码以进行压缩以适应互联网传输的托管库。与 Adobe 技术相比,它支持 H.263 和 H.264 来压缩高分辨率的音频和视频。不幸的是,Silverlight 4 中仍然不可用。
- 目前不支持实时传输协议,例如 RTP。因此,您只有两个选择:要么使用 TCP 或 UDP 传输协议,要么编程自己的实时传输协议。与 Adobe 相比,它支持通过自定义协议进行传输,用于此目的的协议是 RTMP。
- 没有用于将实时视频/音频流直接从 Silverlight 发送到媒体服务器,以及从媒体服务器流式传输到 Silverlight 客户端的实时流媒体服务器。因此,您只有两种解决方案。您必须使用 Microsoft Windows Media Server 或通过 IIS 使用 Smooth Streaming,这将迫使您放弃 Silverlight,因为 Silverlight 不支持与这些服务器进行通信以进行发送,唯一的解决方案也是创建自己的服务器。与 Adobe 相比,他们有一个很棒的产品,即 Flash Media Server,它可以完美地与 Flash Player 配合使用。
背景
总的来说,所有语音/视频聊天系统都必须经历以下阶段:
- 连接摄像头和/或麦克风,然后将输出作为二进制数据返回,然后将其转换为字节,以便于下一步处理。
- 数据将以原始格式返回,因此其大小会非常大,所以我们首先需要将其编码成一种压缩格式。例如,将捕获的图像编码成 JPEG 格式,以及将语音数据转换为 Wave 格式或压缩成任何著名的音频压缩格式,如 G.711、GSM、speex 或其他任何格式标准。我们也可以使用 H.263 或 H.264 等特殊标准来集成视频/语音。这一步是我们最重要的工作,它将直接决定您聊天系统的带宽需求。
- 使用 TCP、UDP 或 RTP/UDP 传输协议中的一种来发送压缩数据。这一步也很重要,因为它一方面取决于传输数据的质量的重要性,另一方面取决于实时传输的重要性。任何系统的目标都是以尽可能最好的质量实时传输数据。
- 服务器接收发送的数据具有特定的功能,具体取决于您对应用程序的要求。例如,在聊天软件中。服务器端的接收数据应该将其发送回聊天室中已连接的客户端。通常,如果软件在互联网上运行,并且客户端在 NAT 后面,则服务器应该有一个公共 IP。幸运的是,Silverlight 中的 Socket 支持此过程而没有问题,正如您将在本文中看到的。
- 客户端将以压缩格式接收数据,因此我们首先需要对其进行解码,然后将其显示在输出设备上。
Using the Code
上述阶段可以通过以下步骤实现:
在客户端
- 要了解如何访问麦克风和摄像头,请观看此视频。
- 要了解如何将捕获的图像解码为 JPEG 格式,请阅读此文章和这篇文章。
- 要了解如何使用 Silverlight 中的
AudioSink
和MediaElement
类从麦克风录制音频然后将其播放到扬声器中。请阅读以下文章: - 要了解如何使用 Silverlight 中的 Socket,请观看此视频,还有关于网络身份验证和受信任网络访问的有用视频。
在服务器端
在我们的案例中,服务器应该执行以下过程:
- 允许客户端与服务器通信 - 要在 Silverlight 中实现此目的,您应该在服务器端创建策略服务,端口为 943,以授予客户端访问服务器域的权限。为此,请创建一个 XML 文件,其中包含以下内容,以允许使用 TCP 端口 4530 和服务器上的所有域 URI 作为示例:
<?xml version="1.0" encoding ="utf-8"?> <access-policy> <cross-domain-access> <policy> <allow-from> <domain uri="*" /> </allow-from> <grant-to> <socket-resource port="4530" protocol="tcp" /> </grant-to> </policy> </cross-domain-access> </access-policy>
然后创建一个 Socket,在端口 943 上授予访问权限,这是 Silverlight 中策略服务的默认端口:(请查看随文章示例一起提供的 PolicyService.cs 类。)
- 接收客户端请求并将其客户端 Socket 添加到 ArrayList - 之后,服务器应该接收客户端数据(音频或视频数据),然后使用我们创建的 Socket ArrayList 将其发送给所有已连接的客户端作为示例。(请查看随文章示例一起提供的 SocketCoderBinaryServer.cs 类。)
最后
客户端和服务器需要做更多的事情,但作为起点,这将非常有助于您开始 Silverlight 中的网络编程,以创建您自己的客户端/服务器语音/视频聊天系统。
参考文献
- SocketCoder.Com,下载 Silverlight 4 Web Conferencing Project 的最新更新
- 模块 1:Silverlight 4 语音聊天示例:http://socketcoder.com/ArticleFile.aspx?index=2&ArticleID=70
- 模块 2:Silverlight 4 摄像头会议示例:http://socketcoder.com/ArticleFile.aspx?index=2&ArticleID=68
- 模块 3:Silverlight 4 桌面演示者示例:http://socketcoder.com/ArticleFile.aspx?index=2&ArticleID=69
- Silverlight.NET http://www.silverlight.net/
- Microsoft MSDN