這陣子因為公司的專案,一腳踏入了串流的領域,然後慢慢得就沈下去,很快就開始叫救命了。
因為是公司專案要求,所以第一個「時間有限」,第二個「沒有人教」,講到這,真想發發牢騷了,不過算了,回到正題。
專案的部份使用的串流伺服器是KMS,使用的串流是WebRTC,這些東西對筆者來說,可說是一個全新的領域,所以踏進了很多的陷阱,下方慢慢說來:
- Google的recaptcha(判斷是不是機器人)
- 品質控制
- KMS Client listener
- Docker與防火牆
我們一個一個來談吧。
Google的recaptcha(判斷是不是機器人)
開始使用一段時間後,辦公室的人開始發現,怎麼會有同事連到Google搜尋一些東西後,出現了Google確認是不是機器人的檢證(Recaptcha),而且狀況不是一天一次,有時一天超過5~6次,當時整個辦公室網路都是同一個IP對外,所以所有同事多多少少都有遇到這種情況,甚至有些同事把這些東西當成娛樂在玩;想當然,MIS當然一個專案一個專案在找人尋問,而我們也說『應該跟我們這個專案沒關係』,整個情況超過了一個月,後來在找尋其他問題時,發現了--是我們專案造成的,真是對不起MIS的人啊~~。
KMS有提供一些入門的Project,而這些Project大部份都是透過WebRTC來實作,而WebRTC必須設定STUN or TRUN Server,來穿透公司的防火牆,而KMS入門的的Project,都是幫你偷偷的連到Google的STUN Server,程式碼在kurento-utils.js裡,如下圖:
換句話說,你用它的Project用得愈多,也代表連線Google STUN的次數愈多,這樣子當然會被Google認為你是不是機器人了。
解決方法:
kurento-utils.js的底層也是使用WebRTC的library,而WebRTC的library有提供使用者套用自己的STUN/TURN Server的設定,參考網址。
但kurento-utils.js要使用的時候,又不太一樣,實際使用方法如下(參考網址):
var iceServers = [
{
"url": "turn:xxx.xxx.xxx.xxx:xxx",
"username": "the_username",
"credential": "the_password"
}
];
var options = {
localVideo: video,
onicecandidate: onIceCandidate,
configuration: {
iceServers: iceServers
}
};
透過這樣子的設定,就能夠避免WebRTC去問Google的STUN server。
迷思
原本認為KMS本身有設定STUN/TURN的功能(/etc/kurento/modules/kurento/WebRtcEndpoint.conf.ini),而KMS入門的的Project可以吃到這個設定,像是這樣:
但是原來二件事是分開的,結果是這樣:
這種情況下,有時會造成串流無法通過,因為Presenter與KMS與Viewer連到的STRN/TURN Server不同,所以判斷通過防火牆的方式也不同,可能會有無法穿透防火牆的情況。
品質控製
這個部份之所以被拉出來說,主要原因是因為WebRTC的品質控制,是由其WebRTC本身來控制的,原理筆者並不清楚,但它是線上即時的串流,所以解析度與FPS並不是固定的,而是根據當時的網路與資料的情況而自動調整;聽起來非常的完美,但遇到公司的神明們,要求什麼高品質的串流畫面等,只會卡死自己,所以開規格時務必要注意一下。
KMS Client listener
這次與KMS溝通的專案是用JAVA寫的,其中因為要監聽Kurento連線、斷線、重連等時機點,監聽到這些時需要做一些事情。但是,原本認為每個事件在同一個時間點只會被觸發一次,結果卻不是,而不隨著KurentoClient的增加,這些方法被同時呼叫的次數也增加;再加上KurentoClient的Library建立在一個websocket的library上,而那個Library有一個設定是idelTimeOut,而KurentoClient的設定是300秒,也就是說:五分鐘內只要沒有任何與KMS的通訊,斷線與重連就會被呼叫一次...只能說真是夠了。
Docker與防火牆
一開始不太瞭解WebRTC連線時需要STUN/TURN Server,再來是Kurento出了一版可使用在AWS ClounForamtion的YAML(參考網址),看了一下內容,裡頭有如何安裝KMS及Coturn Server(Coturn Server = STUN + TURN Server)的指令,將其轉成Docker後測試,結果卻是失敗了;剛開始不明白失敗的原因,後來才慢慢地知道,STUN本身的設定是必須是UDP port全開的環境上,而Docker不管如何都不可能設定UDP全開,換句話說,STUN Server並不適合在Docker環境裡面;防火牆也一樣,不管如何STUN也不適合架設在防火牆內,如果真的要架設的話,只能架設TURN Server或在Coturn Server中,把STUN關掉。
上述這幾個問題,都是筆者在首次接觸KMS及WebRTC後遇到的陷阱,希望能幫上準備踏入這塊領域的人一些幫助。
留言列表