WebRTC是一项开源技术,它能够通过JavaScript API实现网页浏览器间的实时通信。它被认为是一种P2P技术,不用通过任何类型的媒体中继, 能实现浏览器间的实时通信。这种方式能足以实现一些基本的应用,但是有些功能,如组通信,媒体流录制,媒体广播或媒体转码是很难实现的。基于这个原因,很多应用还是需要有媒体服务器。
![Peer-to-peer WebRTC approach vs. WebRTC through a media server](/2014th7cj/d/file/p/20170217/jhhnqlcriq1.png "Peer-to-peer WebRTC approach vs. WebRTC through a media server")
在概念上,WebRTC媒体服务器是一种多媒体中继(它位于两个通信端的中间)。媒体服务器能处理媒体流,并有各种功能,包括组通信(分发一个端生成的媒体流到多个接收端,如像Multi-Conference Unit, MCU的工作方式),混合(转换多个输入流合成一个组合流),转码(在不兼容的客户端间选择codec和格式), 录制等。
![Typical WebRTC Media Server capabilities](/2014th7cj/d/file/p/20170217/jhhnqlcriq1.png "Typical WebRTC Media Server capabilities")
### Kurento 媒体服务器
Kurento架构的核心是媒体服务器,它被命名为Kurento媒体服务器(**KMS**)。Kurento媒体服务器的媒体处理能力是插件式的,意思是它的功能都是可以被激活和关闭插件模块。而且,开发者可以无缝地创建额外的模块来扩展Kurento媒体服务器并动态插入。
Kurento媒体服务器提供即时可用的组通信,混合,转码,录制和播放。另外,它还提供一些高级的媒体处理模块,包括有计算机视觉,虚拟现实,透镜等。
![Kurento Media Server capabilities](/2014th7cj/d/file/p/20170217/l2hco3lce1y.png "Kurento Media Server capabilities")
### Kurento API, 客户端和协议
Kurento媒体服务器的能力是通过Kurento API呈现给应用开发者的。这些API是通过叫做Kurento Client库实现的。Kurento提供了两种类型的客户端库: Java和JavaScript。如果你希望使用其它的语言,可以通过Kurento 协议来直接操作 Kurento。这个协议允许控制 Kurento媒体服务器,它是基于标准的网络协议如[WebSocket](https://www.websocket.org/) 和 [JSON-RPC](http://json-rpc.org/)。
下图显示了Kurento客户端的三种应用场景:
- 在兼容WebRTC的浏览器上直接使用 Kurento JavaScript Client
- 在Java EE Application Server上使用Kurento Java Client
- 在Node.js 服务器上使用Kurento JavaScript Client
![Connection of Kurento Clients (Java and JavaScript) to Kuento Media Server](/2014th7cj/d/file/p/20170217/pzlwxq020sn.png "Connection of Kurento Clients (Java and JavaScript) to Kuento Media Server")
这三种场景在教程中都有完整的示例程序。
Kurento Client的API是基于Media Element的概念,每个Media Element都有特定的媒体能力。例如,WebRtcEndpoint有发送和接收WebRTC媒体流的能力;RecorderEndpoint 有将接收到的媒体流存储到文件的能力;FaceOverlayFilter 能检测视频流中的人脸并添加一个特定的图片在人脸之上。Kurento拥有丰富的媒体元素工具箱来做为它的API的一部分。
![Some Media Elements provided out of the box by Kurento](/2014th7cj/d/file/p/20170217/4vgiyni5kdl.png "Some Media Elements provided out of the box by Kurento")
更好的理解这些概念需要参见本文档中关于 [Kurento API](http://doc-kurento.readthedocs.io/en/stable/mastering/kurento_API.html) 和 [Kurento Protocol](http://doc-kurento.readthedocs.io/en/stable/mastering/kurento_protocol.html) 的章节。你同样还需要看看Java文档和JS文档:
- [kurento-client-java](http://doc-kurento.readthedocs.io/en/stable/_static/langdoc/javadoc/index.html) : JavaDoc of Kurento Java Client.
- [kurento-client-js](http://doc-kurento.readthedocs.io/en/stable/_static/langdoc/jsdoc/kurento-client-js/index.html) : JsDoc of Kurento JavaScript Client.
- [kurento-utils-js](http://doc-kurento.readthedocs.io/en/stable/_static/langdoc/jsdoc/kurento-utils-js/index.html) : JsDoc of an utility JavaScript library aimed to simplify the development of WebRTC applications.
### 使用Kurento创建应用程序
从应用程序开发人员的角度来看,媒体元素就像是乐高积木:你只需选择应用程序想要的元素,然后再它连接到想要的拓扑结构中。在Kurento的术语中,媒体元素的连接图被称作** 媒体管道 **。因此,当你想创建一个管道时,开发人员需要确定想要使用的媒体元素的能力,并确定媒体元素间如何连接的拓扑图。这些连接是通过连接原语控制(以Kurento Client APIs方式显现)。这些原语以拓扑上后续的元素作为参数,激活本元素作为源:
```
sourceMediaElement.connect(sinkMediaElement)
```
例如,如果你想创建一个录制WebRTC流到文件的应用程序,你需要两个媒体元素:WebRtcEndpoint 和 RecorderEndpoint。当一个客户端连接到这个应用程序时,你需要实例化这两个媒体元素,并使用 WebRtcEndpoint (它用来接收WebRTC流)来接收流后输送给RecorderEndpoint (它用来将媒体流录制到文件)。最后,你需要连接它们,这样就能实现将前一个媒体元素接收到的流输送给后一年媒体元素,
像下面这样:
```
WebRtcEndpoint.connect(RecorderEndpoint)
```
为了简化在客户端的WebRTC流的处理,Kurento提供了一个叫WebRtcPeer的实体,而且,标准的WebRTC API (getUserMedia, RTCPeerConnection,and so on) 同样能连接到WebRtcEndpoints。更多的信息可以参见[示例程序](http://doc-kurento.readthedocs.io/en/stable/tutorials.html)的章节。
https://www.aliyun.com/jiaocheng/812035.html