首頁>技術>

1 簡介

Janus 是一個開源的,通過 C 語言實現了對 WebRTC 支援的 Gateway;Janus 自身實現得很簡單,提供外掛機制來支援不同的業務邏輯,配合官方自帶外掛就可以用來實現高效的 Media Server 服務。

本文主要介紹如何在 Ubuntu 16.04 下搭建起 janus 伺服器,實現 janus 官方 Demo 瀏覽器與 Android APP Demo(janus-gateway-android)之間的音視訊通話。

音視訊高階開發技術交流+720209036

瀏覽器開啟音視訊採集的話需要 HTTPS 加密訪問!

效果圖如下:

Janus 官網:https://janus.conf.meetecho.com/index.html

參考文件:https://github.com/meetecho/janus-gateway

2 下載和編譯 Janus

編譯執行 Janus Server 需要依賴較多的一些第三方庫,而這些依賴庫在 Ubuntu 下主要通過 aptitude 進行安裝,首先通過安裝 aptitude:

sudo apt-get install aptitude
2.1 命令安裝依賴

Ubuntu 下通過 aptitude 批量安裝依賴工具包,這裡建議 Ubuntu 映象源(/etc/apt/source.list)不要為了追求速度而改用了國內的某些映象源,如 網易 163,這可能會導致某些工具包下載失敗,建議依然使用官方自帶的映象源。

批量安裝命令:

sudo aptitude install libmicrohttpd-dev libjansson-dev libnice-dev \\ libssl1.0.1-dev libsrtp-dev libsofia-sip-ua-dev libglib2.3.4-dev \\ libopus-dev libogg-dev libcurl4-openssl-dev pkg-config gengetopt \\ libtool automakesudo apt install cmakesudo aptitude install libconfig-devsudo aptitude install libssl-devsudo aptitude install doxygen graphviz# ffmpeg庫 支援--enable-post-processingsudo aptitude install libavcodec-dev libavformat-dev libswscale-dev libavutil-dev

如果出現某個工具包下載失敗,請修改映象源為官方地址,並執行已下命令

sudo apt-get update && sudo apt-get upgrade

以更新映象源,完成後重新安裝。

附錄:解除安裝命令

apt-get remove 會刪除軟體包而保留軟體的配置檔案apt-get purge 會同時清除軟體包和軟體的配置檔案

查詢包命令

2.2 原始碼安裝依賴2.2.1 安裝 WebSocket

janus 支援 WebSocket 是可選項,如果不安裝,編譯 janus 時,預設不支援 WebSocket 的連結請求,而 Android APP Demo 是通過 WebSocket 與 janus 進行通訊的,因為我們希望 Android APP Demo 能與瀏覽器(HTTP)進行視訊通話,所以就必須要在編譯 janus 時支援 WebSocket。

依次執行以下命令,分別進行下載,編譯,安裝:

git clone https://github.com/warmcat/libwebsockets.gitcd libwebsocketsgit branch -a 檢視選擇最新的穩定版本,目前的是remotes/origin/v3.2-stablegit checkout v3.2-stable 切換到最新穩定版本mkdir buildcd buildcmake -DCMAKE_INSTALL_PREFIX:PATH=/usr -DCMAKE_C_FLAGS="-fpic" ..make && sudo make install

安裝成功後,再編譯 janus 時,janus 預設會增加對 WebSocket 的整合,或者通過增加編譯引數 --enable-websockets 開啟 WebSocket 開關,或 --disable-websockets 關閉 WebSocket 開關。

2.2.2 安裝 libsrtp

Janus 需要至少 version 1.5 以上的 libsrtp,如果系統中已經安裝了 libsrtp,則首先解除安裝後,手動安裝新版本,這裡我們安裝 libsrtp 2.2,依次執行以下命令:

wget https://github.com/cisco/libsrtp/archive/v2.2.0.tar.gztar xfv v2.2.0.tar.gzcd libsrtp-2.2.0./configure --prefix=/usr --enable-opensslmake shared_library && sudo make install
2.2.3 安裝libusrsctp

libusrsctp支援--enable-data-channels

git clone https://github.com/Kurento/libusrsctp.gitcd libusrsctp./bootstrap./configuremakesudo make install
2.2.4 安裝libmicrohttpd

libmicrohttpd支援--enable-rest

wget https://ftp.gnu.org/gnu/libmicrohttpd/libmicrohttpd-0.9.71.tar.gztar zxf libmicrohttpd-0.9.71.tar.gzcd libmicrohttpd-0.9.71/./configuremakesudo make install
2.3 編譯 Janus

通過 Git 下載 Janus 原始碼,並編譯安裝:

git clone https://github.com/meetecho/janus-gateway.gitgit tag 檢視當前的 tag,選擇最新穩定的版本v0.10.4git checkout v0.10.4sh autogen.sh./configure --prefix=/opt/janus --enable-websockets --enable-post-processing --enable-docs --enable-rest --enable-data-channelsmakesudo make install

make install的時候,將janus安裝到 /opt/janus路徑,外掛的so庫在/opt/janus/lib/janus/plugins

configure 執行成功後,會輸出 janus 所支援的 協議及外掛,如下:

ompiler: gcclibsrtp version:  2.xSSL/crypto library: OpenSSLDTLS set-timeout: not availableMutex implementation: GMutex (native futex on Linux)DataChannels support: yesRecordings post-processor: yesTURN REST API client: yesDoxygen documentation: yesTransports: REST (HTTP/HTTPS): yes WebSockets: yes RabbitMQ:  no MQTT: no Unix Sockets: yes Nanomsg: noPlugins: Echo Test: yes Streaming: yes Video Call: yes SIP Gateway:  yes NoSIP (RTP Bridge): yes Audio Bridge: yes Video Room: yes Voice Mail: yes Record&Play:  yes Text Room: yes Lua Interpreter: no Duktape Interpreter: noEvent handlers: Sample event handler: yes WebSocket ev. handler: yes RabbitMQ event handler:no MQTT event handler: no Nanomsg event handler: no GELF event handler: yesExternal loggers: JSON file logger: noJavaScript modules: no
3 配置和執行janus3.1 配置nginx

安裝nginx,主要用來提供web訪問。

生成證書
mkdir -p ~/certcd ~/cert# CA私鑰openssl genrsa -out key.pem 2048# 自簽名證書openssl req -new -x509 -key key.pem -out cert.pem -days 1095
安裝nginx
#下載nginx 1.15.8版本wget http://nginx.org/download/nginx-1.15.8.tar.gztar xvzf nginx-1.15.8.tar.gzcd nginx-1.15.8/# 配置,一定要支援https./configure --with-http_ssl_module # 編譯make#安裝sudo make install 
修改nginx配置檔案

/usr/local/nginx/conf/nginx.conf

指向janus所在目錄/opt/janus/share/janus/demos

# HTTPS server # server { listen 443 ssl; server_name localhost; # 配置相應的key ssl_certificate /home/ubuntu/cert/cert.pem; ssl_certificate_key /home/ubuntu/cert/key.pem; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; # 指向janus demo所在目錄 location / { root /opt/janus/share/janus/demos; index index.html index.htm; } }
啟動nginx

sudo /usr/local/nginx/sbin/nginx

然後通過

https://111.229.231.225/

可以訪問到介面,但此時還不能正常通話。

3.2 安裝和啟動coturn
sudo apt-get install libssl-devsudo apt-get install libevent-dev#git clone /file/2020/08/28/20200828113457_5.jpg #cd coturn# 提供另一種安裝方式turnserver是coturn的升級版本wget http://coturn.net/turnserver/v4.5.0.7/turnserver-4.5.0.7.tar.gztar xfz turnserver-4.5.0.7.tar.gzcd turnserver-4.5.0.7 ./configure make sudo make install

啟動

sudo nohup turnserver -L 0.0.0.0 --min-port 30000 --max-port 60000 -a -u lqf:123456 -v -f -r nort.gov &

需要在安全組開放埠:

TCP/UDP 3478

UDP 30000-60000

3.3 配置janus的jcfg檔案

janus配置

janus安裝目錄在/opt/janus

./bin

./etc

./include

./lib

./share

可執行檔案

janus配置檔案

janus標頭檔案

janus庫

存放指令碼或者文件,web demo也在這裡

配置Video room

我們先配置video room

需要配置的檔案為(目錄/opt/janus/etc/janus):

並開通8088,8089;8188,8989

要先把.sample字尾的檔案拷貝成jcfg字尾

# 進到對應的目錄cd /opt/janus/etc/janus# 拷貝檔案sudo cp janus.jcfg.sample janus.jcfgsudo cp janus.transport.http.jcfg.sample janus.transport.http.jcfgsudo cp janus.transport.websockets.jcfg.sample janus.transport.websockets.jcfgsudo cp janus.plugin.videoroom.jcfg.sample janus.plugin.videoroom.jcfgsudo cp janus.transport.pfunix.jcfg.sample janus.transport.pfunix.jcfgsudo cp janus.plugin.streaming.jcfg.sample janus.plugin.streaming.jcfgsudo cp janus.plugin.recordplay.jcfg.sample janus.plugin.recordplay.jcfgsudo cp janus.plugin.voicemail.jcfg.sample janus.plugin.voicemail.jcfgsudo cp janus.plugin.sip.jcfg.sample janus.plugin.sip.jcfgsudo cp janus.plugin.nosip.jcfg.sample janus.plugin.nosip.jcfgsudo cp janus.plugin.textroom.jcfg.sample janus.plugin.textroom.jcfgsudo cp janus.plugin.echotest.jcfg.sample janus.plugin.echotest.jcfg
配置janus.jcfg
# 大概237行stun_server = "111.229.231.225" stun_port = 3478 nice_debug = false#大概274行# credentials to authenticate... turn_server = "111.229.231.225" turn_port = 3478 turn_type = "udp" turn_user = "lqf" turn_pwd = "123456"
配置janus.transport.http.jcfg配置janus.transport.websockets.jcfg
general: { #events = true  # Whether to notify event handlers about transport events (default=true) json = "indented"  # Whether the JSON messages should be indented (default),   # plain (no indentation) or compact (no indentation and no spaces) #pingpong_trigger = 30 # After how many seconds of idle, a PING should be sent #pingpong_timeout = 10 # After how many seconds of not getting a PONG, a timeout should be detected ws = true   # Whether to enable the WebSockets API ws_port = 8188  # WebSockets server port #ws_interface = "eth0" # Whether we should bind this server to a specific interface only #ws_ip = "192.168.0.1" # Whether we should bind this server to a specific IP address only wss = true   # Whether to enable secure WebSockets wss_port = 8989  # WebSockets server secure port, if enabled #wss_interface = "eth0"  # Whether we should bind this server to a specific interface only #wss_ip = "192.168.0.1"  # Whether we should bind this server to a specific IP address only #ws_logging = "err,warn" # libwebsockets debugging level as a comma separated list of things   # to debug, supported values: err, warn, notice, info, debug, parser,   # header, ext, client, latency, user, count (plus 'none' and 'all') #ws_acl = "127.,192.168.0." # Only allow requests coming from this comma separated list of addresses}certificates: { cert_pem = "/home/ubuntu/cert/cert.pem" cert_key = "/home/ubuntu/cert/key.pem" #cert_pwd = "secretpassphrase"}
3.4 修改網頁預設支援的wss協議

修改 /opt/janus/share/janus/demos/videoroomtest.js檔案

原來為(在45行處)

var server = null;if(window.location.protocol === 'http:') server = "http://" + window.location.hostname + ":8088/janus";else server = "https://" + window.location.hostname + ":8089/janus";

將預設的https協議改為wss

var server = "wss://" + window.location.hostname + ":8989";
3.5 執行 Janus

WebSocket 的ws埠號為 8188和8989,記住這個埠號,在 Android APP Demo 中會使用到!

啟動 Janus:

/opt/janus/bin/janus --debug-level=5 --log-file=$HOME/janus-log

根據需要可以選擇是否加上後面兩個啟動引數。

webscoket 一定要啟動ws和wss(安全的ws,類比http-https)。

3.7 測試web和web的通話

https://111.229.231.225/videoroomtest.html

4 視訊通話聯調測試

我們使用 PC 下的 瀏覽器 與 Android APP Demo 進行聯調。

4.1 啟動 Web Demo

這樣外部便可以通過 https://111.229.231.225進行訪問了,進入首頁後,找到 videoRoom,Start

4.2 啟動 Android APP Demo4.2.1 下載原始碼
git clone https://github.com/pcgpcgpcg/janus-gateway-android.git
4.2.2 修改信令地址

janus-gateway-android 支援兩個 Demo 測試:EchoTest 和 VideoRoom,預設情況下會啟用 EchoTest,這個 Demo 僅僅是連線伺服器後,將資料再發回本地進行本地測試,我們要改為與房間內的其它使用者(瀏覽器)進行視訊通話,則需要啟用另外一個測試用例 VideoRoom,按照如下方式修改程式碼:APP Demo 是通過 WebSocket 連線 Janus Server,所以修改 VideoRoomTest.java 中 roomUrl地址為我們啟動的 Janus 伺服器 WebSocket 地址,IP 為 janus server 地址,埠預設為 8188:

然後,搜尋39.106.100.180,替換為自己的IP。

比如

加上

maven{ url'http://maven.aliyun.com/nexus/content/groups/public/' }maven { url 'http://developer.huawei.com/repo/' }jcenter { url 'http://maven.aliyun.com/nexus/content/repositories/jcenter' }

否則下載不了部分元件。

4.2.4 編譯安裝

通過 Android studio 進行編譯安裝到 Android 機。

安裝好後的

4.3 聯調測試

Janus Server 預設會開啟兩個視訊房間:1234 和 5678,分別使用 VP8 和 VP9 視訊編碼器,所以我們通過 Brower 和 Android APP Demo 進行聯調測試時,暫不需要設定房間 ID。

效果圖:

附錄linux – 如何組合音訊和視訊mjr檔案以生成.

我正在使用janus-gateway在網路瀏覽器中錄製.錄製完成後,會生成兩個檔案,一個是音訊,另一個是視訊.兩者都有格式mjr.如何將這兩個檔案組合在一起建立單個檔案?

最佳答案

我正在處理同樣的需要.

如果您執行了預設的janus-gateway安裝,則只會錯過以下步驟:

在你下載git源的資料夾上執行它:

./configure --enable-post-processing

然後

make(sudo) make install

然後為要將其轉換為音訊/視訊格式的每個檔案執行此命令:

./janus-pp-rec /opt/janus/share/janus/recordings/video.mjr /opt/janus/share/janus/recordings/video.webm./janus-pp-rec /opt/janus/share/janus/recordings/audio.mjr /opt/janus/share/janus/recordings/audio.opus

如果你沒有安裝ffmpeg執行這個(我在Ubuntu上,在其他發行版上ffmpeg可能已經在apt-get儲存庫中)

sudo add-apt-repository ppa:kirillshkrogalev/ffmpeg-nextsudo apt-get updatesudo apt-get install ffmpeg

然後最終將音訊與視訊合併:

(sudo) ffmpeg -i audio.opus -i video.webm -c:v copy -c:a opus -strict experimental mergedoutput.webm

從那裡你可以構建一個shell指令碼來自動轉換cron上的所有mjr檔案

最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 微前端“容器”——microcosmos實現