Hero img
Ubuntuにjanusをインストールしてみた

raspberry pi 3 BにUbuntuを入れJanusをインストールした備忘録

Janus-Getwayを使うためraspbery pi 3にインストールした備忘録です。


目次

  • 目標
  • 環境
  • janusを使うために
  • nginxのインストール
  • janus用パッケージのインストール
  • libnice
  • 必要なパッケージを先にインストール
  • libwebsocketをインストール
  • libsrtインストール2.2.0をインストール。
  • janusをインストール
  • ビルド
  • janus初期設定
  • デモ用のHTMLをnginxのフォルダーに設定します。
  • webserver設定
  • janusのHTTPS化
  • websocketのwss化
  • 起動
  • https化の確認
  • websocket確認
  • 動作確認
  • videoroomの確認
  • videostreamのテスト
  • websocketの確認
  • まとめ

目標

Ubuntuにjanusを入れ起動させる。
websocketも使えるようにする。
rtp映像配信ができるようにする。

環境

  • OS Ubuntu 24.04 LTS
  • raspbery pi 3 B
  • アーキテクチャ aarch64
  • nginx

janusを使うために

janusを使うために必要なパッケージをインストールします。

janus-install-main

nginxのインストール

nginxをインストールしておきます。

sudo apt install nginx

janus用パッケージのインストール

janusに必要なパッケージをインストールしていきます。 公式書いてある通りなのでそのまま実行しインストールします。

apt install libmicrohttpd-dev libjansson-dev \
	libssl-dev libsofia-sip-ua-dev libglib2.0-dev \
	libopus-dev libogg-dev libcurl4-openssl-dev liblua5.3-dev \
	libconfig-dev pkg-config libtool automake

libnice

libniceも必要なのですが、ubuntuの場合は手動インストールとあるため、手動でlibniceをインストールします。

必要なパッケージを先にインストール

libniceのインストールのためにまず、meson ninjaとcmakeをインストールします。

apt install cmake
sudo apt install meson ninja-build

libniceをインストール

ninjaが使える状態になったので、libniceをインストールします。

git clone https://gitlab.freedesktop.org/libnice/libnice
cd libnice
meson --prefix=/usr build && ninja -C build && sudo ninja -C build install

libwebsocketをインストール

公式ではgitからダウンロードビルドをしているが、その後のbuildが上手くいかなかったため、試しにapt でインストールしたらすんなりできた。

apt install libwebsockets-dev

libsrtインストール2.2.0をインストール。

libsrtは最新のものを使える場合もあるようですが、素直に2.2.0にしました。

wget https://github.com/cisco/libsrtp/archive/v2.2.0.tar.gz
tar xfv v2.2.0.tar.gz
cd libsrtp-2.2.0
./configure --prefix=/usr --enable-openssl
make shared_library && sudo make install

janusをインストール

下準備が整ったため、janus-getwayインストールします。

git clone https://github.com/meetecho/janus-gateway.git
cd janus-gateway

ビルド

websocket有効にしてインストール。不要なものがあればこのconfigureで指定できます。 今回はwebsocketsを有効にするだけです。

./autogen.sh
./configure --prefix=/opt/janus --enable-websockets 
make
sudo make install

不要なもや必要なものがある場合

makeする前に必要なものや不要なものがあれば引数を加えてあげます。

--disable-websockets --disable-data-channels --disable-rabbitmq --disable-mqtt --enable-docs

ビルド時間

ラズパイのスペックが低いのか結構時間がかかった。体感20分ぐらい?

janus初期設定

インストールが完了したら、janusの設定ファイルを初期化します。

sudo make configs

設定ファイル

実行するとjanusの設定ファイルが全てリセットされます。

初期化すると次のフォルダにjcfgファイルがたくさん生成されます。
janusの設定はここを修正してください。

janusの設定ファイルパス
/opt/janus/etc/janus

デモ用のHTMLをnginxのフォルダーに設定します。

janusのビルドが正常に終わるとhtmlフォルダがあるのでそれをnginxで表示できるフォルダに移動させます。 nginxのデフォルトは「/var/www/thml」となっています。

sudo cp -a html/* /var/www/thml

webserver設定

nginxを使ってjanusのHTMLを表示できるようにします。
SSLでないとカメラデバイスを取得できないため、自己証明書を適用しSSL化します。

自己証明書の作成方法からcrtとkeyを作成しnginxに設定します。

/etc/nginx/sites-available/defualt
server {
        listen 80 default_server;
        listen [::]:80 default_server;

        # SSL configuration
        #
         listen 443 ssl default_server;# <----------これ
         listen [::]:443 ssl default_server; <----------これ
         ssl_certificate /etc/nginx/ssl/server.crt; <----------これ
         ssl_certificate_key /etc/nginx/ssl/server.key; <----------これ
        # Note: You should disable gzip for SSL traffic.
        # See: https://bugs.debian.org/773332
        #
        # Read up on ssl_ciphers to ensure a secure configuration.
        # See: https://bugs.debian.org/765782
        #
        # Self signed certs generated by the ssl-cert package
        # Don't use them in a production server!
        #
        #省略

janusのHTTPS化

同様にjaunsもhttpsが使えるようにします。

/opt/janus/etc/janus/janus.transport.http.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)
        base_path = "/janus"                    # Base path to bind to in the web server (plain HTTP only)
        http = true                                             # Whether to enable the plain HTTP interface
        port = 8088                                             # Web server HTTP port
        #interface = "eth0"                             # Whether we should bind this server to a specific interface only
        #ip = "192.168.0.1"                             # Whether we should bind this server to a specific IP address (v4 or v6) only
        https = true                            # Whether to enable HTTPS (default=false)   <-------これ
        secure_port = 8089                              # Web server HTTPS port, if enabled  <-------これ

        certificates: {

        cert_pem = "/etc/nginx/ssl/server.crt"      #<-------これ
        cert_key =  "/etc/nginx/ssl/server.key"     #<-------これ
        #cert_pwd = "secretpassphrase"
        #ciphers = "PFS:-VERS-TLS1.0:-VERS-TLS1.1:-3DES-CBC:-ARCFOUR-128"

websocketのwss化

websocketもwsからwssに変更します。

/opt/janus/etc/janus/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 port1            
        #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
        #ws_unix = "/run/ws.sock"               # Use WebSocket server over UNIX socket instead of TCP
        wss = true                              # Whether to enable secure WebSockets            <-------これ
        wss_port = 8989                         # WebSockets server secure port, if enabled         <-------これ

certificates: {
        cert_pem = "/etc/nginx/ssl/server.crt"              #<-------これ
        cert_key =  "/etc/nginx/ssl/server.key"             #<-------これ
        #cert_pem = "/path/to/cert.pem"
        #cert_key = "/path/to/key.pem"
        #cert_pwd = "secretpassphrase"
        #ciphers = "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256"
}


起動

ngixnとjanusを起動します。

sudo systemctl restart nginx
sudo /opt/janus/bin/janus

janus起動の際WARNが出てくるが気にせず起動させます。

janus-install-januslog

https化の確認

janusで正常にHTTPSで起動出来た場合は次のような文字が表示されます。

HTTP webserver started (port 8088, /janus path listener)...
HTTPS webserver started (port 8089, /janus path listener)...

websocket確認

websocketが正常に動作している場合は次のように表示されます。

Websockets server started (port 8188)...
Secure Websockets server started (port 8989)...

動作確認

ブラウザーでjanusでもページを読みんでみます。 https://[ipaddress]/にアクセスします。

janus-install-main

videoroomの確認

janus-install-video-room janus-install-video-room-start janus-install-video-room-join janus-install-video-room-connected

videostreamのテスト

配信はffmpegで配信してみます。

ffmpeg -f lavfi -re -i "testsrc=size=1280x720:rate=30" -c:v libvpx  -f rtp "rtp://192.168.1.105:5004
janus-install-stream1

ソースはopus/VP8 live stream coming form external sourceを選んでください。

janus-install-stream-view1 janus-install-stream-view2

websocketの確認

Chromeのdevtoolsでwssの接続を確認します。

jnausページを表示

エラーが出るので、janus「ローカルip」のページを開いて、そこでDevToolsを起動してください。

websocket接続を試してみます。 janus-install-websocket-dev

janus-install-websocket-testcode
devtoolsのコード
var ws = new WebSocket("wss://192.168.1.105:8989", 'janus-protocol');
ws.onmessage = (msg) => console.log(msg.data);
ws.send(JSON.stringify({janus:"create" , transaction:"abc"}));

まとめ

websocket接続、ffmpegの配信・映像受信、ビデオルームの参加の確認ができました。 自前でzoomのような簡易会議室が使用でき、監視カメラのような使い方もできるようになりました。 色々とパッケージが必要になり、一部のパッケージはビルドが必要になるため少し、janusを使うハードルが高い気がします。
ossで使えるwebrtc sfuなのでありがたいのですが環境構築に時間がかかり、websocket通信のライブラリーサンプルが少ないので困る。使ったことはないが、mediasoupを使う方が良いのか?
あと、janusを前使った時は32bitのハードウェアで動かなかった気がする。

関連記事

コメント

コメントを書く

質問や、間違いがありましたら、お気軽にどうぞ

※お名前とコメントの内容を入力してください。
※全てこのブログ上に公表されます。
※許可なく管理者によって修正・削除する場合がございます。 詳しくはプライバシーポリシーを参照ください