1. Kurento是什么 3
2. Kurento簡單介紹 3
2.1 WebRTC媒體server 3
2.2 Kurento 媒體server 4
2.3 Kurento API, client和協議 5
2.4 使用Kurento創建應用程序 7
3. Kurento Media Server的安裝與卸載 8
3.1 Kurento Media Server的安裝 8
3.2 kurento Media Server的啟動與停止 8
3.3. kurento Media Server的卸載 8
4. STUN和TURN服務配置 9
4.1. STUNserver配置 9
4.2. TURNserver配置 10
5. Kurento教程 11
5.1 Node.js 教程1 - Hello world 11
5.1.1 執行演示樣例程序 11
5.1.2 執行時的出錯 12
5.1.3 演示樣例程序的分析 14
5.1.4 應用程序服務端邏輯 16
5.1.5 client邏輯 19
5.1.6 依賴庫 20
5.2 教程3一對多的視頻呼叫 21
5.2.1 執行演示樣例程序 21
5.2.2 理解這個演示樣例程序 21
5.2.3 應用程序服務端邏輯 24
5.2.4 client 29
5.2.5 依賴庫 30
5.3 教程四-一對一的視頻呼叫 31
5.3.1 執行演示樣例程序 31
5.3.2 Understanding this example 31
5.3.3 應用程序服務端邏輯 33
5.3.4 client 40
5.3.5 依賴庫 43
11. Kurento 架構 43
11.1 Kurento API和接口 44
11.2 Kurento 模塊 45
11.3 使用Kurento創建應用程序 46
11.4 client,服務端和Kurento的通信 47
11.5 使用kurento實現實時WebRTC應用 49
11.6 Kurento 設計原則 51
1. Kurento是什么
Kurento是一個WebRTC媒體server,而且包括一個clientAPI集合,用以簡化WWW和移動平台上的高級視頻應用程序的開發。
Kurento的功能包含組通信,轉碼,記錄。混音。廣播和routing of audiovisual flows。
Kurento相同提供高級的媒體處理能力,包含計算機視覺。視頻檢索。虛擬現實和語音分析。
Kurento模塊化的架構使得其集成第三方媒體處理算法(如語音識別,場景分析,人臉識別等)非常easy。
並且它能夠被應用程序開發人員視為透明。
Kurento的核心組成是Kurento媒體server,它用來負責媒體傳輸,處理,載入和記錄。
它是基於GStreamer。優化了資源消耗來實現的。它提供的功能例如以下:
• 網絡流協議,包含HTTP(作為client和服務端工作),RTP和WebRTC.
• 組通信(MCU和SFU功能),支持媒體混合和媒體路由/分發
• 原生支持計算機視覺和虛擬現實濾鏡
• 媒體存儲,支持WebM和MP4的寫操作。能播放GStreamer支持的全部格式
• 自己主動的媒體轉換。支持GStreamer提供的全部codec,包含VP8, H.264, H.263, , AMR, OPUS, Speex, G.711,等。
它還提供的很多基於Java和Javascript的Kurentoclient庫,用來提供給應用程序控制Kurento媒體server。
假設你喜歡其他的編程語言。能夠使用基於WebSocket和JSON-RPC的Kurento協議來實現。
Kurento是開源的,它基於 LGPL version 2.1許可協議,它的源代碼位於GitHub。.
假設你想高速上手。最好的方式是安裝Kurento媒體server並學習官方提供的演示樣例教程。
假設想利用好Kurento,能夠看本指南的高級部分。
2. Kurento簡單介紹
2.1 WebRTC媒體server
WebRTC是一項開源技術,它可以通過JavaScript API實現網頁瀏覽器間的實時通信。它被覺得是一種P2P技術,能實現瀏覽器間的實時通信,而不用通過不論什么類型的媒體中繼。
這樣的方式能足以實現一些主要的應用。可是有些功能。如組通信,媒體流錄制,
媒體廣播或媒體轉碼是非常難實現的。
基於這個原因,非常多應用還是須要有媒體server。
Figure 1.1: Peer-to-peer WebRTC approach vs. WebRTC through a media server
在概念上。WebRTC媒體server是一種多媒體中繼(它位於兩個通信端的中間)。
媒體server能處理媒體流。並有各種功能,包含組通信(分發一個端生成的媒體流到多個接收端,
如像Multi-Conference Unit, MCU的工作方式)。混合(轉換多個輸入流合成一個組合流)。
轉碼(在不兼容的client間選擇codec和格式), 錄制等
Figure 1.2: Typical WebRTC Media Server capabilities
2.2 Kurento 媒體server
Kurento架構的核心是媒體server,它被命名為Kurento媒體server(KMS)。
Kurento媒體server的媒體處理能力是插件式的,意思是它的功能都是插件模塊,
能夠被激活和關閉。並且,開發人員能夠無縫地創建額外的模塊來擴展Kurento媒體server並動態插入。
Kurento媒體server提供即時可用的組通信。混合,轉碼,錄制和播放。
另外,它還提供一些高級的媒體處理模塊。包含有計算機視覺,虛擬現實,透鏡等;
Figure 2.1: Kurento Media Server capabilities
2.3 Kurento API, client和協議
Kurento媒體server的能力是通過Kurento API呈現給應用開發人員的。
這些API是通過叫做Kurento Client庫實現的。
Kurento提供了兩種類型的client庫: Java和JavaScript。
假設你希望使用其他的語言,能夠通過Kurento 協議來直接操作Kurento。
這個協議能夠控制Kurento媒體server。它是基於標准的網絡協議如WebSocket和JSON-RPC。
下圖顯示了Kurentoclient的三種應用場景:
• 在兼容WebRTC的瀏覽器上直接使用Kurento JavaScript Client
• 在Java EE Application Server上使用Kurento Java Client
• 在Node.js server上使用Kurento JavaScript Client
這三種場景在教程中都有完整的演示樣例程序。
Figure 3.1: Connection of Kurento Clients (Java and JavaScript) to Kuento Media Server
Kurento Client的API是基於Media Element的概念,每一個Media Element都有特定的媒體能力。
比如。WebRtcEndpoint有發送和接收WebRTC媒體流的能力。
RecorderEndpoint 有將接收到的媒體流存儲到文件的能力。
FaceOverlayFilter 能檢測視頻流中的人臉並加入一個特定的圖片在人臉之上。
Kurento擁有豐富的媒體元素工具箱來做為它的API的一部分。
Figure 3.2: Some Media Elements provided out of the box by Kurento
更好的理解這些概念須要參見本文檔中關於Kurento API和Kurento Protocol的章節.
你相同還須要看看Java文檔和JS文檔:
• kurento-client-java : JavaDoc of Kurento Java Client.
• kurento-client-js : JsDoc of Kurento JavaScript Client.
• kurento-utils-js : JsDoc of an utility JavaScript library aimed to simplify the development of WebRTC applications.
2.4 使用Kurento創建應用程序
從應用程序開發者的角度來看,媒體元素就像是樂高積木:你僅僅需選擇應用程序想要的元素,然后再它連接到想要的拓撲結構中。
在Kurento的術語中。媒體元素的連接圖被稱作媒體管道。
因此,當你想創建一個管道時,開發者須要確定想要使用的媒體元素的能力。
並確定媒體元素間怎樣連接的拓撲圖。這些連接是通過連接原語控制(以Kurento Client APIs方式顯現)。
這些原語以拓撲上興許的元素作為參數。激活本元素作為源:
sourceMediaElement.connect(sinkMediaElement)
比如,假設你想創建一個錄制WebRTC流到文件的應用程序,
你須要兩個媒體元素:WebRtcEndpoint 和 RecorderEndpoint。當一個client連接到這個應用程序時,
你須要實例化這兩個媒體元素。並使用 WebRtcEndpoint
(它用來接收WebRTC流)來接收流后輸送給RecorderEndpoint (它用來將媒體流錄制到文件)。
最后。你須要連接它們,這樣就能實現將前一個媒體元素接收到的流輸送給后一年媒體元素。
像以下這樣:
WebRtcEndpoint.connect(RecorderEndpoint)
為了簡化在client的WebRTC流的處理。Kurento提供了一個叫WebRtcPeer的實體,
並且,標准的WebRTC API (getUserMedia, RTCPeerConnection,and so on)
相同能連接到WebRtcEndpoints。
很多其它的信息能夠參見演示樣例程序的章節
Figure 4.1: Simple Example of a Media Pipeline
3. Kurento Media Server的安裝與卸載
3.1 Kurento Media Server的安裝
Kurento Media Server必須安裝在Ubuntu 14.04 LTS (32 or 64 bits)下。
考慮到在Ubuntu Server 14.04下安裝Kurento Media Server時,
工具add-apt-repository默認是沒有安裝的。能夠用以下的命令安裝。
# sudo apt-get install software-properties-common
使用以下的命令能夠安裝 Kurento Media Server的最新版本號,根據以下的順序,一次一個命令。
安裝過程中有問答時。回復肯定就可以:
# sudo add-apt-repository ppa:kurento/kurento
# sudo apt-get update
# sudo apt-get install kurento-media-server
3.2 kurento Media Server的啟動與停止
如今,Kurento Media Server安裝並已啟動了。能夠使用以下的命令啟動和停止。
# sudo service kurento-media-server start
# sudo service kurento-media-server stop
Kurento Media Server 的日志文件位於 /var/log/kurento-media-server/media-server.log。
3.3. kurento Media Server的卸載
卸載使用例如以下命令:# sudo apt-get remove kurento-media-server
# sudo apt-get purge kurento-media-server
或者徹底卸載:
# sudo apt-get remove kurento*
# sudo apt-get autoremove
# sudo apt-get update
# sudo apt-get dist-upgrade
3.4 Kurento Media Server的手動編譯安裝
Kurento Media ServerTo build Kurento Media Server you need an Ubuntu 14.04 LTS operating system.
First you have to install all needed development tools and dependencies executing the following commands:
# sudo add-apt-repository ppa:kurento/kurento
# sudo apt-get update
# sudo apt-get install git
# sudo apt-get install libthrift-dev thrift-compiler libjsoncpp-dev
# sudo apt-get install gstreamer1.0* libgstreamer1.0-dev
# sudo apt-get install libgstreamer-plugins-base1.0-dev libnice-dev gtk-doc-tools
# sudo apt-get install cmake libglibmm-2.4-dev uuid-dev libevent-dev libboost-dev
# sudo apt-get install libboost-system-dev libboost-filesystem-dev
# sudo apt-get install libboost-test-dev libsctp-dev
# sudo apt-get install libopencv-dev autoconf git libjsoncpp-dev
# sudo apt-get install libtool libsoup2.4-dev tesseract-ocr-dev tesseract-ocr-eng
# sudo apt-get install libgnutls28-dev gnutls-bin libvpx-dev
Plase take care that the list of dependencies changes as dependencies change and new features are added,
you can check the actual packages that the Ubuntu PPA needs for building from sources in the Build-Depends of the latest release debian/control file.
Second you have to get the source code clonning git repository:
# git clone https://github.com/Kurento/kurento-media-server.git
Then you can compile Kurento Media Server:
# mkdir build
# cd build
# cmake ..
# make
Finally, install it into the system as a service:
# git submodule update --recursive --init
# dpkg-buildpackage -us -uc
# sudo dpkg -i ../kurento_<version>_<arch>.deb
And start and stop it:
# sudo service kurento-media-server start
# sudo service kurento-media-server stop
4. STUN和TURN服務配置
假設Kurento Media Server位於NAT之后,這時就須要使用 STUN or TURN來實現NAT穿透。在大多數情況下,STUNserver能夠滿足須要。僅僅有在NAT是對稱的時,才須要TURNserver。
4.1. STUNserver配置
為了安裝STUNserver,須要取消Kurento Media Server配置文件里的以下兩行的凝視。配置文件位於 /etc/kurento/kurento.conf.json :
"stunServerAddress" : "stun ip address",
"stunServerPort" : 3478
參數 stunServerAddress 應當是一個IP地址。不能是域名。
並且須要注意它的JSON格式,假設 stunServerPort 行是WebRtcEndpoint 區域的最后一行,
那么它不能以逗號(,)結束。
以下是一些可用的公共的STUNserver,比如:
173.194.66.127:19302
173.194.71.127:19302
74.125.200.127:19302
74.125.204.127:19302
173.194.72.127:19302
74.125.23.127:3478
77.72.174.163:3478
77.72.174.165:3478
77.72.174.167:3478
77.72.174.161:3478
208.97.25.20:3478
62.71.2.168:3478
212.227.67.194:3478
212.227.67.195:3478
107.23.150.92:3478
77.72.169.155:3478
77.72.169.156:3478
77.72.169.164:3478
77.72.169.166:3478
77.72.174.162:3478
77.72.174.164:3478
77.72.174.166:3478
77.72.174.160:3478
54.172.47.69:3478
4.2. TURNserver配置
為了安裝TURNserver,須要取消Kurento Media Server配置文件(/etc/kurento/kurento.conf.json)以下這行的凝視:
"turnURL" : "user:password@address:port"
和前面的一樣。TURN地址也必須是IP地址(不能是域名)。相同也要注意JSON格式的最后一行的逗號。TURN配置的示比例如以下:
"turnURL" : "kurento:kurento@193.147.51.36:3478"
或使用免費的numb STUN/TURNserver例如以下:
"turnURL" : "user:password@66.228.45.110:3478"
有一個TURNserver的開源實現:coturn.(https://code.google.com/p/coturn/).