前言
大家好鲤遥,我是許RR饰恕。最近公司在做一個互聯(lián)網(wǎng)門診的業(yè)務(wù),基礎(chǔ)業(yè)務(wù)是病人能夠通過網(wǎng)頁或者視頻的視頻來“call”醫(yī)生仁期,然后醫(yī)生選擇接聽桑驱,達(dá)到一個通過視頻的互聯(lián)網(wǎng)診斷的效果竭恬,讓病人不到醫(yī)院就能向醫(yī)生問診跛蛋。然后負(fù)責(zé)這個項目的老大讓我負(fù)責(zé)搭建一個kurento
服務(wù)器用于傳輸流媒體,另外加一個必須的打洞服務(wù)器用于穿透網(wǎng)絡(luò)痊硕,讓kurento
服務(wù)器能夠找到客戶端的真實ip
地址赊级。本來我以為是個很簡單的活,搭建環(huán)境嘛岔绸,沒想到是一個糾纏了我三天的噩夢理逊,坑和問題無處不在橡伞,能弄出來全虧了我的兩位師兄,@帥氣小伙和@codenjin師兄晋被,在兩位師兄身上我看到了什么才是一個真正的后端程序員兑徘。
使用docker安裝kurento
https://doc-kurento.readthedocs.io/en/6.9.0/ 這是官方文檔的地址,細(xì)讀了官方文檔我發(fā)現(xiàn)這個kurento只能安裝在Ubuntu上羡洛,這真是扯淡挂脑,這還是我第一次看到這么“完美”只支持Ubuntu的軟件,然后公司只分給一臺centos的服務(wù)器給我欲侮。幸好有解決方案崭闲,直接裝不行我不能裝docker嗎,docker總不會不支持吧威蕉。而且官方也有docker使用kurento的文檔:https://hub.docker.com/r/kurento/kurento-media-server/刁俭, 執(zhí)行以下命令安裝并啟動鏡像:
docker run -d --name kms -p 8888:8888 kurento/kurento-media-server:xenial-latest
然后使用sudo docker ps
查看鏡像是否啟動,執(zhí)行這個命令如果看到類似下面的輸出韧涨,那么就是啟動成功:
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
嗯牍戚,反正我是沒遇到不成功的,如果不成功說明你倒霉虑粥,自己想辦法解決吧翘魄。假設(shè)上面都運行成功,那么kurento就是安裝成功并且成功的在8888端口運行起來了舀奶。
docker安裝stun和turn服務(wù)器(打洞服務(wù)器)
kurento安裝起來算是簡單的了暑竟,唯一的坑也被docker解決了,但是stun和turn服務(wù)器安裝這塊坑就大了育勺,網(wǎng)上很多教程但荤,但是你會發(fā)現(xiàn)他們說的都不一樣,有說一定要Ubuntu的涧至,有說這個參數(shù)放內(nèi)網(wǎng)ip的腹躁,有說這個參數(shù)放外網(wǎng)IP的,有說這個無所謂的南蓬,有說要生成用戶的纺非,有說要md5碼的。我操我給這幫各執(zhí)其詞的教程和博客折磨的心力憔悴赘方,最后拼拼湊湊的在自己的Ubuntu成功的搭建起來了一個打洞服務(wù)器烧颖,但是我并不建議你用這種方法,因為花費的時間實在太長窄陡,可以用更方便的方法炕淮。@codenjin師兄到GitHub上找到一個老外的GitHub項目,有關(guān)coturn的項目跳夭,老外用將所有的操作都寫進(jìn)了dockerfile里面涂圆,自動打包好一個coturn的鏡像们镜,首先克隆這個項目:https://github.com/konoui/kurento-coturn-docker.git
(可以給個star,畢竟幫忙解決問題了)润歉,克隆好了執(zhí)行以下操作:
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,你如果簡單百度過幾篇博客就應(yīng)該知道我在說什么踩衩。你可以用這個網(wǎng)址去測試stun和turn的有效性:
https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/
測試stun有效性(出現(xiàn)兩個地址加”done“才為有效):打了紅圈的說明這是成功的胞皱,只有成功才會顯示“done”,不成功一般會說“auth failed”或者“not reachable?”不要在意那個問號九妈,只要不是done說明你就是失敗的反砌。哦,如果只有一個地址也“done”的話萌朱,那也是不行的宴树,不信你隨便拿個ip地址試試。
kurento設(shè)置打洞服務(wù)器地址
這個比較簡單晶疼,但是是必不可缺的一步酒贬,如果是使用docker的鏡像的話,那么應(yīng)該進(jìn)入kurento的鏡像編輯kurento的配置文件:
#進(jìn)入鏡像
docker exec -it kms /bin/bash
#安裝vim
apt-get update
apt-get install vim
#進(jìn)入配置文件夾
cd /etc/kurento/modules/kurento/
#編輯配置文件
vim WebRtcEndpoint.conf.ini
若要配置打洞服務(wù)器翠霍,配置文件應(yīng)該改成這樣的:
stunServerAddress=you_url
stunServerPort=you_port
turnURL=kurento:kurento@you_url?transport=tcp
跑通官網(wǎng)java kurento-hello-world demo
以上的坑和這個坑都不算啥锭吨,這個才是最大的坑,如果你使用kurento并且在遠(yuǎn)端部署了kurento和打洞服務(wù)器并且試圖跑通kurento官網(wǎng)給的java kurento-hello-world demo(https://github.com/Kurento/kurento-tutorial-java.git里面那個kurento-hello-wrold)寒匙, 那就慘了零如,你會發(fā)現(xiàn)部署在自己本地的kurento能夠完美跑通,但是kurento一部署到遠(yuǎn)端就無法連通锄弱,你會感覺自己的打洞服務(wù)器沒配好考蕾,然后反復(fù)的去配,反復(fù)的看網(wǎng)上的教程会宪,但是偏偏網(wǎng)上的教程各執(zhí)一詞肖卧,你瞬間迷茫了。
我就是這樣的掸鹅,弄了兩天后最后@帥氣小伙師兄發(fā)現(xiàn)是官網(wǎng)給的demo完全沒有使用到我們自己配的打洞服務(wù)器塞帐。。巍沙。所以這個demo肯定跑不通葵姥,因為它根本他喵的就沒用到你配好的打洞服務(wù)器啊赎瞎!它用的是遠(yuǎn)在墻外的谷歌的stun服務(wù)器芭评铩颊咬!谷歌再強也穿不了中國的防火長墻啊务甥。
在kurento-hello-wrold項目文件夾中牡辽,執(zhí)行以下操作:
cd /src/main/resources/static/js/
vim index.js
在函數(shù)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團(tuán)隊源碼中很多坑沒有說明就是為了用了他們項目的人能夠出錢去購買他們的技術(shù)支持,不能中老外的圈套编矾。