前言
大家好,我是许RR。最近公司在做一个互联网门诊的业务,基础业务是病人能够通过网页或者视频的视频来“call”医生,然后医生选择接听,达到一个通过视频的互联网诊断的效果,让病人不到医院就能向医生问诊。然后负责这个项目的老大让我负责搭建一个kurento
服务器用于传输流媒体,另外加一个必须的打洞服务器用于穿透网络,让kurento
服务器能够找到客户端的真实ip
地址。本来我以为是个很简单的活,搭建环境嘛,没想到是一个纠缠了我三天的噩梦,坑和问题无处不在,能弄出来全亏了我的两位师兄,@帅气小伙和@codenjin师兄,在两位师兄身上我看到了什么才是一个真正的后端程序员。
使用docker安装kurento
https://doc-kurento.readthedocs.io/en/6.9.0/ 这是官方文档的地址,细读了官方文档我发现这个kurento只能安装在Ubuntu上,这真是扯淡,这还是我第一次看到这么“完美”只支持Ubuntu的软件,然后公司只分给一台centos的服务器给我。幸好有解决方案,直接装不行我不能装docker吗,docker总不会不支持吧。而且官方也有docker使用kurento的文档:https://hub.docker.com/r/kurento/kurento-media-server/, 执行以下命令安装并启动镜像:
docker run -d --name kms -p 8888:8888 kurento/kurento-media-server:xenial-latest
然后使用sudo docker ps
查看镜像是否启动,执行这个命令如果看到类似下面的输出,那么就是启动成功:
7bbe2673abd8 kurento/kurento-media-server:xenial-latest "/entrypoint.sh" 5 days ago Up 3 seconds (health: starting) 0.0.0.0:8888->8888/tcp kms
嗯,反正我是没遇到不成功的,如果不成功说明你倒霉,自己想办法解决吧。假设上面都运行成功,那么kurento就是安装成功并且成功的在8888端口运行起来了。
docker安装stun和turn服务器(打洞服务器)
kurento安装起来算是简单的了,唯一的坑也被docker解决了,但是stun和turn服务器安装这块坑就大了,网上很多教程,但是你会发现他们说的都不一样,有说一定要Ubuntu的,有说这个参数放内网ip的,有说这个参数放外网IP的,有说这个无所谓的,有说要生成用户的,有说要md5码的。我操我给这帮各执其词的教程和博客折磨的心力憔悴,最后拼拼凑凑的在自己的Ubuntu成功的搭建起来了一个打洞服务器,但是我并不建议你用这种方法,因为花费的时间实在太长,可以用更方便的方法。@codenjin师兄到GitHub上找到一个老外的GitHub项目,有关coturn的项目,老外用将所有的操作都写进了dockerfile里面,自动打包好一个coturn的镜像,首先克隆这个项目:https://github.com/konoui/kurento-coturn-docker.git
(可以给个star,毕竟帮忙解决问题了),克隆好了执行以下操作:
cd /kurento-coturn-docker/coturn/
//使用dockerfile,记住加点
sudo docker build --tag coturn .
//后台运行coturn
sudo docker run -p 3478:3478 -p 3478:3478/udp coturn
嗯,这个dockerfile给你配置turn的用户名和密码都是kurento,你如果简单百度过几篇博客就应该知道我在说什么。你可以用这个网址去测试stun和turn的有效性:
https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/
测试stun有效性(出现两个地址加”done“才为有效):打了红圈的说明这是成功的,只有成功才会显示“done”,不成功一般会说“auth failed”或者“not reachable?”不要在意那个问号,只要不是done说明你就是失败的。哦,如果只有一个地址也“done”的话,那也是不行的,不信你随便拿个ip地址试试。
kurento设置打洞服务器地址
这个比较简单,但是是必不可缺的一步,如果是使用docker的镜像的话,那么应该进入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
若要配置打洞服务器,配置文件应该改成这样的:
stunServerAddress=you_url
stunServerPort=you_port
turnURL=kurento:kurento@you_url?transport=tcp
跑通官网java kurento-hello-world demo
以上的坑和这个坑都不算啥,这个才是最大的坑,如果你使用kurento并且在远端部署了kurento和打洞服务器并且试图跑通kurento官网给的java kurento-hello-world demo(https://github.com/Kurento/kurento-tutorial-java.git里面那个kurento-hello-wrold), 那就惨了,你会发现部署在自己本地的kurento能够完美跑通,但是kurento一部署到远端就无法连通,你会感觉自己的打洞服务器没配好,然后反复的去配,反复的看网上的教程,但是偏偏网上的教程各执一词,你瞬间迷茫了。
我就是这样的,弄了两天后最后@帅气小伙师兄发现是官网给的demo完全没有使用到我们自己配的打洞服务器。。。所以这个demo肯定跑不通,因为它根本他喵的就没用到你配好的打洞服务器啊!它用的是远在墙外的谷歌的stun服务器啊!谷歌再强也穿不了中国的防火长墙啊。
在kurento-hello-wrold项目文件夹中,执行以下操作:
cd /src/main/resources/static/js/
vim index.js
在函数function uiStart()里,增加一个叫iceservers
的变量,格式如下:
var iceservers={
"iceServers":[
{
urls:"stun:139.198.123.138:3478"
},
{
urls:["turn:139.198.123.138:3478"]
username:"kurento",
credential: "kurento"
}
]
}
再修改底下的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
};
```
希望有同样目的的同志能够看到这篇博文,不然肯定被折磨的死去活来。kurento团队源码中很多坑没有说明就是为了用了他们项目的人能够出钱去购买他们的技术支持,不能中老外的圈套。