【轉載請注明出處】: https://www.jianshu.com/p/b625b7c0c2a4
1. Kurento
Kurento的主要元件是Kurento媒體伺服器(KMS),負責媒體傳輸,處理,記錄和播放。KMS建立在出色的
GStreamer多媒體庫之上,并提供以下功能:
- 網絡流協定,包括 HTTP , RTP 和 WebRTC 。
- 支援媒體混合和媒體路由/排程的組通信(MCU和SFU功能)。
- 對實作計算機視覺和增強現實算法的過濾器的通用支援。
- 媒體存儲支援 WebM MP4的 寫入操作以及GStreamer支援的所有格式的播放。
- GStreamer支援的任何編解碼器之間的自動媒體轉碼,包括VP8,H.264,H.263,AMR,OPUS,Speex,G.711等。
Kurento設計原則
Kurento的設計基于以下主要原則:
- 分開的媒體和信令平面 信号 媒體 是兩個獨立的平面,以便應用程式可以分别處理多媒體處理的那些方面。
-
媒體和應用服務的配置設定
Kurento Media Server和應用程式可以在不同的機器之間并置,更新或分布。
一個應用程式可以調用多個Kurento Media Server的服務。相反的情況也适用,即Kurento Media Server可以滿足多個應用程式的請求。
-
适用于雲
Kurento适合內建到雲環境中以充當PaaS(平台即服務)元件。
-
媒體管道
通過
連結 媒體元素 是一種挑戰多媒體處理複雜性的直覺方法。 -
應用開發
開發人員無需了解内部Kurento Media Server的複雜性:所有應用程式都可以以開發人員喜歡的任何技術或架構部署,從用戶端到伺服器。從浏覽器到雲服務。
-
端到端通信能力
Kurento提供端到端通信功能,是以開發人員無需處理在用戶端裝置上傳輸,編碼/解碼和呈現媒體的複雜性。
-
完全可處理的媒體流
Kurento不僅支援互動式人際通信(例如具有對話呼叫推送/接收功能的Skype),而且還支援人機(例如通過實時流傳輸的視訊點播)和人機(例如遠端視訊錄制) ,多傳感器資料交換)通信。
- 媒體的子產品化處理 管道 實作的子產品化允許通過“面向圖形”的語言定義應用程式的媒體處理功能,其中應用程式開發人員可以通過連結适當的功能來建立所需的邏輯。
-
可稽核的處理
Kurento能夠為QoS監視,計費和審計生成豐富而詳細的資訊。
-
無縫IMS內建
Kurento旨在支援無縫內建到電話營運商的
IMS 基礎架構中。 -
透明媒體适配層
Kurento提供了透明的媒體适配層,以使在螢幕大小,功耗,傳輸速率等方面具有不同要求的不同裝置之間的融合成為可能。
Kurento子產品體系
Kurento被設計為可插入架構,Kurento中的每個插件都稱為一個子產品,可以使用新的自定義子產品擴充Kurento Media Server。更多資訊,請閱讀
Kurento子產品部分。
Kurento子產品分為三類:
-
主要子產品
與Kurento Media Server開箱即用合并:
- kms-core:Kurento Media Server的主要元件。
- kms-elements:Kurento Media Elements的實作(WebRtcEndpoint,PlayerEndpoint等)
- kms-filters:Kurento過濾器的實作(FaceOverlayFilter,ZBarFilter等)
-
内置子產品
Kurento團隊開發的額外子產品,用于增強Kurento Media Server的基本功能。到目前為止,有四個内置子產品,分别是:
- kms-pointerdetector:基于顔色跟蹤檢測視訊流中指針的過濾器。
- kms-chroma:過濾器,它在頂層使用顔色範圍并使之透明,進而在後面顯示另一個圖像。
- kms-crowddetector:用于檢測視訊流中人聚集的過濾器。
- kms-platedetector:用于檢測視訊流中的車牌的過濾器。
-
定制子產品
Kurento Media Server的擴充,提供了新的媒體功能。
2. 安裝 EPEL 鏡像源
yum update
# RHEL/CentOS 7:
yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
# RHEL/CentOS 8:
yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
3. 安裝docker
# 解除安裝舊版本(如果安裝過舊版本的話)
yum remove docker docker-common docker-selinux docker-engine
# 安裝需要的軟體包
yum install -y yum-utils device-mapper-persistent-data lvm2
#設定docker源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 可使用阿裡雲docker源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#安裝docker
yum install docker-ce docker-ce-cli containerd.io
#啟動 docker
systemctl start docker
#開機自啟
systemctl enable docker
#檢視KMS日志
docker logs kms
#實時檢視:
docker logs -f kms
4. 安裝kurento
#安裝最新版kurento
docker pull kurento/kurento-media-server:latest
#啟動鏡像
docker run --name kms -d -p 8888:8888 kurento/kurento-media-server:latest
該Kurento媒體伺服器的端口(KMS)過程中預設監聽8888用戶端WebSocket連接配接。
容器運作後,您可以使用
docker logs指令擷取其日志輸出:
docker logs --follow kms >"kms-$(date '+%Y%m%dT%H%M%S').log" 2>&1
要檢查KMS是否已啟動并正在偵聽連接配接,請使用以下指令:
curl \
--include \
--header "Connection: Upgrade" \
--header "Upgrade: websocket" \
--header "Host: 127.0.0.1:8888" \
--header "Origin: 127.0.0.1" \
http://127.0.0.1:8888/kurento
您應該得到類似于以下内容的響應:
HTTP/1.1 500 Internal Server Error
Server: WebSocket++/0.7.0
忽略“ Server Error ”消息:這是預期的,它實際上證明KMS已啟動并正在偵聽連接配接。
5. 安裝coturn
#安裝依賴
yum install -y openssl-devel libevent-devel git
#clone 源碼
git clone https://github.com/coturn/coturn.git
cd coturn
./configure
make
sudo make install
# 啟動turnserver
nohup turnserver -L 0.0.0.0 -a -u kurento:kurento123pwd -v -f -r zhaolong.org &
#然後檢視相應的端口号3478是否存在程序
sudo lsof -i:3478
這樣就說明已經可以啟動了,接下來我們先停掉turnserver,重新配置。
turnserver 預設加載配置檔案是etc/turnserver.conf或/usr/local/etc/turnserver.conf。
cp /usr/local/etc/turnserver.conf.default /usr/local/etc/turnserver.conf
openssl req -x509 -newkey rsa:2048 -keyout /usr/local/etc/turn_server_pkey.pem -out /usr/local/etc/turn_server_cert.pem -days 99999 -nodes
turnserver 預設使用的是SQLite資料庫,如果是需要使用MySQL或者PostgreSQL,需要先初始化資料庫,sql位置在
/usr/local/share/turnserver/schema.sql
修改的turnserver.conf内容:
# 設定轉發的ip(區域網路ip),如果不設定,他會自己選擇預設的
relay-ip=xx.xx.xx.xx
# 轉發的外網ip(本機外網ip),用于NAT 位址映射
external-ip=xx.xx.xx.xx
# 轉發的線程數,其實預設不設定最好
relay-threads=5
#UDP 最小端口和最大端口
min-port=40000
max-port=60000
# WebRTC 的消息裡會用到
fingerprint
# WebRTC 認證需要
lt-cred-mech
#中繼伺服器的監聽器IP位址
listening-ip=0.0.0.0
#靜态賬号
user=kurento:kurento
# 統計狀态資訊的redis db
redis-statsdb="ip=xx.xx.xxx.xx dbname=3 password=xxxx port=6379 connect_timeout=30"
# 使用者登入域
realm=zhaolong.org
# 證書
cert=/usr/local/etc/turn_server_cert.pem
# 證書key
pkey=/usr/local/etc/turn_server_pkey.pem
# 輸出log
log-file=stdout
mobility
重新啟動turnserver
nohup turnserver >> /var/tmp/turn.log &
記得開放使用的端口:
可以用這個網址去測試stun和turn的有效性:
https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/測試stun
測試stun的時候不需要輸入賬号密碼,隻需要輸入stun:
測試turn
需要輸入turn位址,以turn:開頭,以及賬号密碼
5. 配置kurento伺服器
進入kurento的鏡像編輯kurento的配置檔案:
#進入鏡像
docker exec -it kms /bin/bash
#安裝vim
apt-get update
apt-get install vim
#進入配置檔案夾
cd /etc/kurento/modules/kurento/
#編輯配置檔案
vim WebRtcEndpoint.conf.ini
修改stun 和turn 資訊
stunServerAddress=xx.xx.xx.xx
stunServerPort=pp
turnURL=username:[email protected]:pp?transport=tcp
重新開機kurento容器
#檢視目前啟動的容器
docker ps
docker restart {kurento容器ID}
6. kurento-hello-world
git clone https://github.com/Kurento/kurento-tutorial-java.git
cd kurento-tutorial-java/kurento-hello-world
vim src/main/resources/static/js/index.js
在函數function uiStart()裡,增加一個叫iceservers的變量,格式如下:
var iceservers={
"iceServers":[
{
urls:"stun:xx.xx.xx.xx:3478"
},
{
urls:["turn:xx.xx.xx.xx:3478"]
username:"xxxx",
credential: "xxxx"
}
]
}
再修改底下的options變量:
const options = {
localVideo: uiLocalVideo,
remoteVideo: uiRemoteVideo,
mediaConstraints: { audio: true, video: true },
onicecandidate: (candidate) => sendMessage({
id: 'ADD_ICE_CANDIDATE',
candidate: candidate,
}),
configuration: iceservers //修改在這裡,增加了一個configuration的key
};
啟動項目
mvn -U clean spring-boot:run -Dkms.url=ws://xx.xx.xx.xx:8888/kurento
啟動完之後用谷歌或者火狐浏覽器打開demo頁面
https://localhost:8443/點選
start
啟動
至此,最簡單的HelloWorld已經完成。