在Centos7上搭建Kurento

官方网址:https://github.com/Kurento/kurento-media-server
官网教程:https://doc-kurento.readthedocs.io/en/latest/user/installation.html
Kurento是一个WebRTC媒体服务器,同时提供了一系列的客户端API,可以简化供浏览器、移动平台使用的视频类应用程序的开发。Kurento支持:

  • 群组通信(group communications)
  • 媒体流的转码(transcoding)、录制(recording)、广播(broadcasting)、路由(routing)
  • 高级媒体处理特性,包括:机器视觉(CV)、视频索引、增强现实(AR)、语音分析

Kurento的模块化架构使其与第三方媒体处理算法 —— 语音识别、人脸识别 —— 很容易集成。和大部分多媒体通信技术一样,Kurento应用的整体架构包含两个层(layer)或者叫平面(plane)

  • 信号平面(Signaling Plane):负责通信的管理,例如媒体协商、QoS、呼叫建立、身份验证等
  • 媒体平面(Media Plane):负责媒体传输、编解码等

WebRTC让浏览器能够进行实时的点对点通信(在没有服务器的情况下)。但是要想实现群组通信、媒体流录制、媒体广播、转码等高级特性,没有媒体服务器是很难实现的。
Kurento的核心是一个媒体服务器(Kurento Media Server,KMS),负责媒体的传输、处理、加载、录制,主要基于 GStreamer实现。此媒体服务器的特性包括:

  • 网络流协议处理,包括HTTP、RTP、WebRTC
  • 支持媒体混合(mixing)、路由和分发的群组通信(MCU、SFU功能)
  • 对机器视觉和增强现实过滤器的一般性支持
  • 媒体存储支持,支持对WebM、MP4进行录像操作,可以播放任何GStreamer支持的视频格式
  • 对于GStreamer支持的编码格式,可以进行任意的转码,例如VP8, H.264, H.263, AMR, OPUS, Speex, G.711

安装coturn

Github:https://github.com/coturn/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:kurento -v -f -r psvmc.cn &
#然后查看相应的端口号3478是否存在进程
sudo lsof -i:3478

这样就说明已经可以启动了,接下来我们先停掉turnserver,重新配置
turnserver 默认加载配置文件/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.conf:

vi /usr/local/etc/turnserver.conf

内容:

# 设置转发的ip(局域网ip),如果不设置,他会自己选择默认的
relay-ip=******

# 转发的外网ip(本机外网ip),用于NAT 地址映射
external-ip=******

# 转发的线程数,其实默认不设置最好
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"

# 用户登录域(例如:dev.com)
realm=****

# 证书
cert=/usr/local/etc/turn_server_cert.pem
pkey=/usr/local/etc/turn_server_pkey.pem
 
# 输出log 
log-file=stdout

mobility

重新启动turnserver:

nohup turnserver -c /usr/local/etc/turnserver.conf -v | ts '[%Y-%m-%d %H:%M:%S]'  >> /usr/local/etc/turn.log 2>&1 &

注意:这个ts命令,是openssl的一个指令,用来打印日期

yum install moreutils
man ts
echo -e "hello world" | ts '[%Y-%m-%d %H:%M:%S]'

打开服务器端口:

firewall-cmd --zone=public --add-port=3478/tcp --permanent
firewall-cmd --zone=public --add-port=3478/udp --permanent
firewall-cmd --reload

测试stun

https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/

remove掉默认的stun

stun:stun.l.google.com:19302

测试stun不需要账号密码,添加上stun:YOUR__IP:3478,然后点击Gather candidates
只要出现Done即为成功,下面提示的fail不用在意

测试turn

添加turn:YOUR__IP:3478,username/password填配置文件里的kurento/kurento
同样只要出现Done即为成功

用docker安装kurento

docker pull kurento/kurento-media-server:latest

运行

docker run -d --name kms -p:8888:8888/tcp kurento/kurento-media-server:latest

查看一下

docker ps -a
ede4f883c11d kurento/kurento-media-server:latest “/entrypoint.sh” 5 seconds ago Up 4 seconds (health: starting) 0.0.0.0:8888->8888/tcp

进入Docker

sudo docker exec -it 704d3ed68a49 bash

测试服务是否正常

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

正常启动会显示
{card-describe title="提示"}
HTTP/1.1 500 Internal Server Error
Server: WebSocket++/0.7.0
{/card-describe}
退出容器

exit

该Kurento媒体服务器的端口(KMS)过程中默认监听8888客户端WebSocket连接

ws://YOUR_IP:8888/kurento

配置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=YOUR_IP
stunServerPort=3478
turnURL=kurento:kurento@YOUR_IP:3478?transport=udp

退出容器,重启kurento

exit
docker restart kms

测试

git clone https://gitee.com/psvmc/kurento-tutorial-java.git
cd kurento-tutorial-java/kurento-hello-world
vi src/main/resources/static/js/index.js

在函数function uiStart()里,增加一个叫iceservers的变量,格式如下:

let iceservers={
    "iceServers":[
        {
            urls:"stun:YOUR_IP:3478"
        },
        {
            urls:["turn:YOUR_IP:3478"],
            username:"kurento",
            credential: "kurento"
        }
    ]
}

修改option:

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://your_ip:8888/kurento

启动完之后用浏览器打开demo页面https://your_ip:8443/