Intel Collaboration Suite for WebRTC を利用しようと考えて,とりあえずサンプルプログラムを動作させました。このツールのうちの Conference Server というものです。version は 3.2.1 です。インストール方法はドキュメントに従います。
最初は ubuntu 14.04 にインストールをしたのですが,最終的には xubuntu 16.04 で利用したいので,以下,対象は xubuntu 16.04 64bit です。
Dependencies
ドキュメントに依ると,Node.js は先にインストールするようにとのことで,ver 4.x が必須です。今のところこれ以上新しくてもいけません。xubuntu 16.04 ならば、Synaptic パッケージマネージャーでインストールしても良いかもしれません(現在インストールされるものは v4.2.6)。ubuntu16.04 で、いつものコマンド
sudo apt-get install nodejs
上記でインストールした場合には、名前が nodejs になるようで、下記のコマンドなどで、node という名で実行できるようにする必要があります(参考サイト:Ubuntu でapt を使用してNode.js をインストールする3 つの方法)。
sudo update-alternatives --install /usr/bin/node node /usr/bin/nodejs 10
しかし今回は、node.js のサイトから v4.7.2 をダウンロードして利用しました。ダウンロードした node-v4.7.2-linux-x64.tar.gz を /opt で展開します。フォルダー名が長いので、node-v4.7.2 に変換しました。パスを通すために、自分のフォルダーにある .bashrc に以下の行を追加しました。
export PATH=/opt/node-v4.7.2/bin:$PATH
端末を開き直して変更を有効にすると、パスが通ります。バージョンを確認します。
$ node -v
v4.7.2
node は Web サーバー機能を提供するのですが、port 80 などの小さい数値の port 番号を利用する場合には、sudo で実行する必要があるようです(参考サイト:「listen EACCES 0.0.0.0:443」というエラーが出るとき)。そのため、sudo にもパスを通しておきます。下記のコマンドで、
sudo visudo
visudo を起動します。
この中にある、secure_path に /opt/node-v4.7.2/bin を書き加えます。これで node.js の準備ができました。
Configure the MCU server machine
続いて、intel のドキュメントにしたがって、いくつかの設定ファイルを変更します。/etc/security/limits.conf の記述に下記を加えます。
* hard nproc unlimited
* soft nproc unlimited
* hard nofile 163840
* soft nofile 163840
* hard stack 1024
* soft stack 1024
次に、/etc/pam.d/login に、下記の行があることを確認します。
session required pam_limits.so
最後に、/etc/sysctl.conf に下記の行を加えます。
fs.file-max=200000
net.core.rmem_max=16777216
net.core.wmem_max=16777216
net.core.rmem_default=16777216
net.core.wmem_default=16777216
net.ipv4.udp_mem = 4096 87380 16777216
net.ipv4.tcp_rmem=4096 87380 16777216
net.ipv4.tcp_wmem=4096 65536 16777216
net.ipv4.tcp_mem=8388608 8388608 16777216
設定を有効にするために、/sbin/sysctl -p を実行するか、再起動せよと言うことです。
Install the MCU package
インテルのサイトから、Intel_CS_WebRTC.v3.2_Update1.zip をダウンロードしました。登録が必要ですが、それほど個人情報は記入しません。この zip の中にある CS_WebRTC_Conference_Server_MCU.v3.2.1.Ubuntu.tgz を取り出して解凍します。解凍は 普通にダブルクリックして Archive Manager を用いました。解凍すると、Release-v3.2.1 というフォルダーが作成されます。以上は、自分のフォルダーの中で作業しています。
Deploy Cisco OpenH264* Library
H.264 を利用するために、non GPU-accelerated MCU system では、Cisco OpenH264 library をインストールしろとのことです。この GPU とは、インテルの CPU に内蔵されたもののことです。他のビデオカードは利用できません。サポートがある場合とない場合のパフォーマンスの差が分からないのですが、後で、6th の core i5 でも手に入れて試してみます。今回は、CPU だけで処理します。video_agent フォルダーにある download_openh264.sh を実行します。同じフォルダーにダウンロードされたファイルを(名前を失念) video_agent/lib フォルダーに移します。ファイル名を libopenh264.so.0 に変更しますが、同名のファイルがすでにあるので、そちらを適当な名前に改名してください(たぶん使用しないファイル)。ドキュメントには他の方法が書かれていますね。ドキュメントに幾つかバージョンがあるような気がします。最初に見ていたものには、download_openh264.sh を使用するように書かれていた気がするのですが。
Compile and deploy ffmpeg with libfdk_aac
/access_agent フォルダーで、ffmpeg を libfdk_acc 付きで、コンパイルしろと言うことですが、ubuntu 16.04 では、上手く行ったのですが、xubuntu 16.04 では上手く行きませんでした。ドキュメントに
Note: This compiling script need install all dependencies
for ffmpeg with libfdk_aac. If that is not expected on deployment
machines, please run it on other proper machine.
と有って、どうもこの場合にあてはまったようです。ubuntu 16.04 ではたくさん作られたファイルが、xubuntu では 5,6個しか作成されませんでした。そこで、Synaptic マネージャーで、ffmpeg と libfdk_aac に関係ありそうなものをインストールしました。
他にもやり方があると思います。ともかく、これで下記のコマンドがきちんと動くようになりました。access_agent フォルダーに移動して、下記。
compile_ffmpeg_with_libfdkaac.sh
ffmpeg_libfdkaac_lib フォルダーが作成されて、その中に 27個のファイルが出来上がります。これをすべて、access_agent/lib フォルダーに移します(上書き)。
Use your own certificate
証明証関係は、とりあえず何もしませんでした。後で本物のサーバーで稼働させるときにやってみます。
Launch the MCU server as single node
最初に、初期化をします。と言っても何をしているのかは分からないのですが、初回は時間がかかりました。Release-v3.2.1 フォルダーにて、下記を実行します。2回め以降は –deps は要らないようです。sudo でなくとも良いのではないかと思います。
./bin/init-all.sh --deps
初回に出力されるメッセージは取りそこねました。下記は2回め以降に実行した場合のメッセージです。
Initializing...
Initializing mongodb...
MongoDB already running
Initializing nuve configuration...
superServiceId: 588xxxxxxxxxxxxxxxxxxxxa
superServiceKey: 3WztBxxxxxxxxxxxxxもっと長いxxxxxxxxxxxxxQE=
sampleServiceId: 58xxxxxxxxxxxxxxxx
sampleServiceKey: w57Mxxxxxxxxxxxxxもっと長いxxxxxxxxxxxxxMRA=
Hardware acceleration disbled
ここで、表示される ID と KEY は後で利用します。
続いて、起動です。Release-v3.2.1 フォルダーにて、下記を実行します。sudo でなくても良いようでした。
./bin/start-all.sh
出力は長いものですが、下記にあげます。
starting nuve, stdout -> /home/myself/Release-v3.2.1/logs/woogeen-nuve.stdout
2017-01-31 16:20:19.951 - INFO: RPC - Conected to rabbitMQ server
2017-01-31 16:20:19.955 - INFO: RPC - Exchange rpcExchange is open
2017-01-31 16:20:19.959 - INFO: RPC - ClientQueue amq.gen-T7S1DV5F6k7HisfMC4p2UQ is open
2017-01-31 16:20:19.961 - INFO: RPC - Queue nuveQueue is open
starting cluster-manager, stdout -> /home/myself/Release-v3.2.1/logs/woogeen-cluster-manager.stdout
2017-01-31 16:20:25.247 - INFO: Main - clusterManager up!
starting portal, stdout -> /home/myself/Release-v3.2.1/logs/woogeen-portal.stdout
2017-01-31 16:20:26.415 - INFO: AMQPER - Exchange rpcExchange is open
2017-01-31 16:20:26.418 - INFO: AMQPER - Exchange broadcastExchange is open
2017-01-31 16:20:26.421 - INFO: AMQPER - ClientQueue amq.gen-YpUWQTlyOQnWfw7Vz5pEIw is open
2017-01-31 16:20:26.476 - INFO: Main - portal join cluster ok, with rpcID: portal-87b62ae8-0506d862c77d
2017-01-31 16:20:26.477 - INFO: ClusterWorker - Join cluster woogeen-cluster OK.
2017-01-31 16:20:26.479 - INFO: AMQPER - Queue portal-87b62ae8-0506d862c77d is open
2017-01-31 16:20:26.480 - INFO: Main - bind amqp client ok.
starting session-agent, stdout -> /home/myself/Release-v3.2.1/logs/woogeen-session-agent.stdout
2017-01-31 16:20:27.354 - INFO: AMQPER - Exchange rpcExchange is open
2017-01-31 16:20:27.357 - INFO: AMQPER - Exchange broadcastExchange is open
2017-01-31 16:20:27.359 - INFO: AMQPER - ClientQueue amq.gen-89tcjqCukAnbU9w6bY46yw is open
2017-01-31 16:20:27.361 - INFO: ErizoAgent - Adding agent to cloudhandler, purpose: session
2017-01-31 16:20:27.376 - INFO: ErizoAgent - session agent join cluster ok.
2017-01-31 16:20:27.394 - INFO: ClusterWorker - Join cluster woogeen-cluster OK.
2017-01-31 16:20:27.400 - INFO: AMQPER - Queue session-9a2991a4-96e182bf9194 is open
2017-01-31 16:20:27.403 - INFO: ErizoAgent - rpcID: session-9a2991a4-96e182bf9194
2017-01-31 16:20:27.604 - INFO: ErizoAgent - message from worker 299063ed-c945-7523-1e69-e758802da0fb : READY
2017-01-31 16:20:27.608 - INFO: ErizoAgent - message from worker f11db4bf-2667-dbfc-78d8-395501c5b06c : READY
starting webrtc-agent, stdout -> /home/myself/Release-v3.2.1/logs/woogeen-webrtc-agent.stdout
2017-01-31 16:20:28.439 - INFO: AMQPER - Exchange rpcExchange is open
2017-01-31 16:20:28.442 - INFO: AMQPER - Exchange broadcastExchange is open
2017-01-31 16:20:28.451 - INFO: AMQPER - ClientQueue amq.gen-kYkICZIPS8X5ljwuuYFBXw is open
2017-01-31 16:20:28.453 - INFO: ErizoAgent - Adding agent to cloudhandler, purpose: webrtc
2017-01-31 16:20:28.477 - INFO: ErizoAgent - webrtc agent join cluster ok.
2017-01-31 16:20:28.510 - INFO: ClusterWorker - Join cluster woogeen-cluster OK.
2017-01-31 16:20:28.519 - INFO: AMQPER - Queue webrtc-5110475d-2e43466cd722 is open
2017-01-31 16:20:28.522 - INFO: ErizoAgent - rpcID: webrtc-5110475d-2e43466cd722
2017-01-31 16:20:29.069 - INFO: ErizoAgent - message from worker cffb3b09-0d16-b3b2-e615-cc75179244fc : READY
2017-01-31 16:20:29.072 - INFO: ErizoAgent - message from worker 92c4bb32-43dc-8408-fe1b-b5ecf950326c : READY
starting avstream-agent, stdout -> /home/myself/Release-v3.2.1/logs/woogeen-avstream-agent.stdout
2017-01-31 16:20:29.498 - INFO: AMQPER - Exchange rpcExchange is open
2017-01-31 16:20:29.502 - INFO: AMQPER - Exchange broadcastExchange is open
2017-01-31 16:20:29.504 - INFO: AMQPER - ClientQueue amq.gen-GT8sMta7k4-TFFbqiSSZTg is open
2017-01-31 16:20:29.506 - INFO: ErizoAgent - Adding agent to cloudhandler, purpose: avstream
2017-01-31 16:20:29.520 - INFO: ErizoAgent - avstream agent join cluster ok.
2017-01-31 16:20:29.538 - INFO: ClusterWorker - Join cluster woogeen-cluster OK.
2017-01-31 16:20:29.541 - INFO: AMQPER - Queue avstream-158a41b3-32d7b4759642 is open
2017-01-31 16:20:29.543 - INFO: ErizoAgent - rpcID: avstream-158a41b3-32d7b4759642
2017-01-31 16:20:29.862 - INFO: ErizoAgent - message from worker ce01f3c4-8ee4-0108-c8c0-c2c8992a81a2 : READY
2017-01-31 16:20:29.903 - INFO: ErizoAgent - message from worker 29bf4dbc-da44-769a-4e38-0cb1ef9326a7 : READY
starting sip-agent, stdout -> /home/myself/Release-v3.2.1/logs/woogeen-sip-agent.stdout
2017-01-31 16:20:30.626 - INFO: AMQPER - Exchange rpcExchange is open
2017-01-31 16:20:30.629 - INFO: AMQPER - Exchange broadcastExchange is open
2017-01-31 16:20:30.631 - INFO: AMQPER - ClientQueue amq.gen-T9WFZGAXuWTJSvyy7qBd7g is open
2017-01-31 16:20:30.633 - INFO: ErizoAgent - Adding agent to cloudhandler, purpose: sip
2017-01-31 16:20:30.646 - INFO: ErizoAgent - sip agent join cluster ok.
2017-01-31 16:20:30.670 - INFO: ClusterWorker - Join cluster woogeen-cluster OK.
2017-01-31 16:20:30.673 - INFO: AMQPER - Queue sip-4746e579-c39920df4fa2 is open
2017-01-31 16:20:30.675 - INFO: ErizoAgent - rpcID: sip-4746e579-c39920df4fa2
2017-01-31 16:20:31.042 - INFO: ErizoAgent - message from worker 8ca72faa-1dbe-c8c1-111c-3943f17f8e52 : READY
2017-01-31 16:20:31.044 - INFO: ErizoAgent - message from worker d5acff0f-ed3a-1117-e326-030775807dd5 : READY
starting recording-agent, stdout -> /home/myself/Release-v3.2.1/logs/woogeen-recording-agent.stdout
2017-01-31 16:20:31.697 - INFO: AMQPER - Exchange rpcExchange is open
2017-01-31 16:20:31.700 - INFO: AMQPER - Exchange broadcastExchange is open
2017-01-31 16:20:31.709 - INFO: AMQPER - ClientQueue amq.gen-lKler3UsotHZf8BnK7-E9Q is open
2017-01-31 16:20:31.713 - INFO: ErizoAgent - Adding agent to cloudhandler, purpose: recording
2017-01-31 16:20:31.720 - INFO: ErizoAgent - recording agent join cluster ok.
2017-01-31 16:20:31.734 - INFO: ClusterWorker - Join cluster woogeen-cluster OK.
2017-01-31 16:20:31.742 - INFO: AMQPER - Queue recording-46e7b46e-aec528497573 is open
2017-01-31 16:20:31.744 - INFO: ErizoAgent - rpcID: recording-46e7b46e-aec528497573
2017-01-31 16:20:32.065 - INFO: ErizoAgent - message from worker f47fe8e1-d9f1-cb9f-3447-1887826465b7 : READY
2017-01-31 16:20:32.089 - INFO: ErizoAgent - message from worker e281b569-e76e-b72c-fc93-eb8e5080d7ce : READY
starting audio-agent, stdout -> /home/myself/Release-v3.2.1/logs/woogeen-audio-agent.stdout
2017-01-31 16:20:32.810 - INFO: AMQPER - Exchange rpcExchange is open
2017-01-31 16:20:32.814 - INFO: AMQPER - Exchange broadcastExchange is open
2017-01-31 16:20:32.818 - INFO: AMQPER - ClientQueue amq.gen-WMJe-SZiPWsmgEzJSI7YpA is open
2017-01-31 16:20:32.821 - INFO: ErizoAgent - Adding agent to cloudhandler, purpose: audio
2017-01-31 16:20:32.834 - INFO: ErizoAgent - audio agent join cluster ok.
2017-01-31 16:20:32.850 - INFO: ClusterWorker - Join cluster woogeen-cluster OK.
2017-01-31 16:20:32.861 - INFO: AMQPER - Queue audio-31a4651c-27b049717f79 is open
2017-01-31 16:20:32.862 - INFO: ErizoAgent - rpcID: audio-31a4651c-27b049717f79
2017-01-31 16:20:33.173 - INFO: ErizoAgent - message from worker 731001b4-1300-2a78-14ca-367b109219b9 : READY
2017-01-31 16:20:33.175 - INFO: ErizoAgent - message from worker f032048d-c4ab-44ba-9a07-2bea04ecb17d : READY
starting video-agent, stdout -> /home/myself/Release-v3.2.1/logs/woogeen-video-agent.stdout
2017-01-31 16:20:33.932 - INFO: AMQPER - Exchange rpcExchange is open
2017-01-31 16:20:33.936 - INFO: AMQPER - Exchange broadcastExchange is open
2017-01-31 16:20:33.938 - INFO: AMQPER - ClientQueue amq.gen-2OyxIMI2En9EDjGforSEFw is open
2017-01-31 16:20:33.941 - INFO: ErizoAgent - Adding agent to cloudhandler, purpose: video
2017-01-31 16:20:33.955 - INFO: ErizoAgent - video agent join cluster ok.
2017-01-31 16:20:33.987 - INFO: ClusterWorker - Join cluster woogeen-cluster OK.
2017-01-31 16:20:33.994 - INFO: AMQPER - Queue video-a74d20d1-6dd5788d78cd is open
2017-01-31 16:20:33.998 - INFO: ErizoAgent - rpcID: video-a74d20d1-6dd5788d78cd
2017-01-31 16:20:34.337 - INFO: ErizoAgent - message from worker 63276b08-48b7-6614-6899-e3d3b370f8cd : READY
2017-01-31 16:20:34.338 - INFO: ErizoAgent - message from worker 17409ebc-a32d-9701-5552-3ec77afb8b1f : READY
starting sip-portal, stdout -> /home/myself/Release-v3.2.1/logs/woogeen-sip-portal.stdout
2017-01-31 16:20:35.234 - INFO: SipPortal - sip-portal up!
2017-01-31 16:20:35.236 - INFO: SipPortal - Start to get SIP rooms
starting app, stdout -> /home/myself/Release-v3.2.1/logs/woogeen-app.stdout
1 rooms in this service.
MyRoom Id: 588xxxxxxxx 秘密です xxxxxxxxxxxa
もし、変なエラーが有ったら教えてください。これを(起動を)ubuntu 16.04 で実行した時には、何かのライブラリーが見つからないとかいうメッセージが出て上手く起動できませんでした。ubuntu 14.04 では、この起動は上手く行きました(その代わり標準でインストールされる node.js のバージョンが古すぎて、そこで苦労しましたが)。
続いて、サーバーが動いているかどうかの確認です。下記にアクセスしろということです。IPは自分のものに変更します。
https://XXXXX:3004
適当な証明書なので、下記の画面のように警告が来ます。firefox の例です。
「エラー内容」をクリックします。
「例外を追加」をクリックします。
セキュリティー例外を承認すると、下記のような画面が表示されます。
これは、自分のカメラとの接続が上手くいっていない状態なのですが、ここで firebug を見てみると
3004 ポートだけでなく、8080 ポートへのアクセスも必要なことが分かります。そこで 3004 ポートでやったことと同じことを 8080 ポートで繰り返して、8080 ポートへのアクセスを承認します(むりやり https://xxx.xxx.xxx.xxx:8080/を開くだけです)。8080 ポートへのアクセスが許されたら、自分のカメラへのアクセス許可が求められるので、それを承認すると下記のように自分のカメラの映像が表示されます。
他のパソコンから同じサイト (https://xxx.xxx.xxx.xxx:3004/)にアクセスすると、トップの画像と同じものですが、下記のような表示となります。
6台のパソコンで接続しても、送受信とも 1 M bit/s ぐらいで安定しています。いったん接続を切って、再び繋いでも通信量が妙に大きくなったりしません。ただ、あまり知らない node.js で書かれていることが問題ですね。
Stop the MCU server
停止するときは下記のコマンドで
./bin/stop-all.sh
出力は下記です。
stopping nuve.
stopping cluster-manager.
stopping portal
stopping session-agent
stopping webrtc-agent
stopping avstream-agent
stopping sip-agent.
stopping recording-agent
stopping audio-agent
stopping video-agent.
stopping sip-portal
stopping app
Set up the MCU cluster
これに関しては、何もやっていません。
MCU Management Console Brief Guide
管理コンソールへのアクセスですが、http://XXXX:3000/console/ を開きます。
上記のように、Service Id と Service Key を要求されますが、これは 初期化の時(コマンド ./bin/init-all.sh を打った時)、表示された SampleServiceId と SampleServiceKey を入力します。
とりあえず、動かせたような気がしています。あとは本番環境へ移行するために、証明証の作成が残っています。
追記(1)
https でのアクセスではなく,http でのアクセスがないものかと探していたら,/extras/basic_example/ フォルダーにある README.md に記述がありました。ポート番号 3001 が証明証いらずの http アクセスでした。README.md を,下記にあげます。
How to run conference sample
============================
1. Run `npm install`.
2. Edit basicServer.js. Find `N.API.init`, replace service ID, service key and nuve URL with the correct values.
3. Copy your SSL server certificate to cert/certificate.pfx.
4. Run `initcert.js` to generate a keystore file which contains encrypted SSL server's passphase.
5. Run `node basicServer.js` to start conference sample. By default, it license on port 3001(insecure) and 3004(secure).
6. Open a browser and navigate to http://<hostname>:3001/ or https://<hostname>:3004/.
追記(2)
まだ完全ではないのですが、独自の証明証を利用する場合の目処が立ちました。自分で作成した pfx ファイル(参照:pfxタイプの証明証)の配置を試みました。と言っても、ドキュメントの通りにやっただけですが。
pfx 証明証を作成して、cert というフォルダーに配置します。下記は、extras/basic_example/ の内容ですが、他にも色々なところに cert フォルダーがあります。
cert フォルダーには下記のように、予め certificate.pfx というファイルが有って、元々はこれが証明証として利用されています。元のファイルの名前を変更して退避させ、新しい証明証を certificate.pfx として置きます。
ドキュメントによると、このあと下記のコマンド
node initsert.js
上記を、実行せよということですが、途中で pfx ファイルを作成する際のパスワードを聞いてきて、このパスワードをどこかに(.woogeen.keystore に?)格納しているようです。cert フォルダーは幾つかあるので、その全てに pfx ファイルを配置して、それぞれのフォルダーで上記のコマンドを実行しました。ドキュメントには nuve.toml ファイル等を編集せよとあるのですが、証明証の名前を変更しなかったので、この辺はそのままです。
引っかかったところとしては、createToken 関連でエラーが生じて動かなくなったことがありました。このときのfirebug のメッセージはサービスが利用できないというものでした。原因は、extras/basic_example/basicServer.js に、http://localhost:3000/ という記述があって、よくわからず自分のURLを記入してしまっていたのですが、これが間違いだったようです。README.md を読むと nuve の URL を記入せよとあります。それは localhost だと言うことでしょうか。extras/rtsp-client.js にも http://localhost:3000/ という記述があって、これもそのままで良いようです。
これでなんとか起動させることができて、上記は、firefox で証明証を表示させたものです。インテルのに代わって、自分で作成した証明証が読み込まれています。あとは、本物の証明証を利用するだけです。
追記(3)
本物の証明証を使用してみました。apache 用の pem 形式の証明証を pfx 形式に変更して、Conference Server で読み込ませてみました。手順は、上記の追記にあるとおりで変更ありません。ひとつだけ上手くいかない点があって、証明証にはサーバーの名前(www.oita-u.ac.jp など)が書かれているのですが、Conference Server の一部のプログラムがIPアドレスで(133.37.144.xxx のような数字で)記されたサイトへ接続しようとします。アドレス自体は対応する正しい数字でした。接続はポート 8080 関連でした。当然この接続には証明証が有効ではありません。OS の設定に問題があるかと思って、ホスト名を正しいものに修正をかけたりしたのですが、Conference Server の方は修正されません。最終的には、portal/portal.toml を編集したら、きちんと名前でアクセスするようになりました。下記に /portal/portal.toml の修正箇所をあげます。
[portal]
keystorePath = "./cert/certificate.pfx"
hostname = "" #default: ""
ip_address = "" #default: ""
port = 8080 #default: 8080
ssl = true #default: true
上記の hostname を証明証に記されたフルネイムにし、ip_adress を記入したら、すべての接続要求が名前で記されたサイトになりました。これでサンプルを https のサイトで動かすことができるようになりました。
続きの記事を下記に書いています。