ファニーボーン

プログラムなどについて書いていこうと思います。

メディアサーバーKurento+Node.jsを動かしてみる

概要

オープンソースのWebRTCメディアサーバー・KurentoをGCE上に構築し、チュートリアルを試してみました。 構築手順等を書いていきます。

動機

昨年末、社内のキャンペーンで使用する 生放送配信システムを自前で作ろうという話になりました。 当初、WebRTCを用いた1対多数の配信システムを手元のMBPで完結させて配信していた。 しかし、接続数が20を超えてくると配信しているMBPにかなりの負荷がかかった。 配信に駆り出された使用されていない老MBPはお死にになられました。 ということで、メディアサーバーを立てて、MCUを実現したいなと思ったのでとりあえず、勉強がてらKurentoを触ってみました。

Kurentoとは

KurentoオープンソースのWebRTCメディアサーバーです。多人数でのテレビ会議や、生放送の配信などに使え、録画の機能もあるようです。JavaJavaScriptをクライアントとして使用できます。内部はCで書かれているようです。 今回は、Node.jsでチュートリアルを動かしてみました。

KurentoとWebRTCに関して、こちらの資料が勉強になりました。

www.slideshare.net

環境

GCE環境

マシンタイプ:n1-standard-1(vCPU x 1、メモリ 3.75 GB) → メディアサーバーと使用するにはスペック的にかなりショボいかと。。。

OS: Ubuntu 14.04 LTS (64 bits) → Kurento Media Serverを動かす必須環境のようです。

Kurento Media Server のインストール

 echo "deb http://ubuntu.kurento.org trusty kms6" | sudo tee /etc/apt/sources.list.d/kurento.list
wget -O - http://ubuntu.kurento.org/kurento.gpg.key | sudo apt-key add -
sudo apt-get update
sudo apt-get install kurento-media-server-6.0

kurento-media-serverが起動しています。

STUNサーバーの設定

STUNとは、異なるNAT環境下どうしでもWebRTCを実現する仕組みです。STUNサーバーはNATの外側から見える端末の情報(グローバルIPUDPのポート)を教えてくれます。取得した自らの情報をシグナリングサーバーを用いて、端末間で交換します。今回、シグナリングサーバーは、後ほど出てくるNode.jsのサーバに含まれています。

STUNサーバに関しては、チュートリアルのページに利用可能なサーバーのIPとポートが掲載されていたので 、(http://www.kurento.org/docs/6.1.0/installation_guide.html)そちらを使用させていただきました。 下記ファイルを修正。 /etc/kurento/modules/kurento/WebRtcEndpoint.conf.ini

stunServerAddress=54.172.47.69
stunServerPort=3478

TURNサーバーに関しては、設定していません。

Tutorial: Hello Worldを動かす

チュートリアルそのまま http://www.kurento.org/docs/6.1.0/tutorials/node/tutorial-1-helloworld.html

Node.jsとBowerのインストール

curl -sL https://deb.nodesource.com/setup | sudo bash -
sudo apt-get install -y nodejs
sudo npm install -g bower

チュートリアルのソースを落としてくる

git clone https://github.com/Kurento/kurento-tutorial-node.git
cd kurento-tutorial-node/kurento-hello-world
npm install
npm start

この際、server.jsでは下記のようになっているため、 GCEのインスタンスのポートを開けておく必要があります。 今回は、そのまま8443と8888を解放しました。

var argv = minimist(process.argv.slice(2), {
    default: {
        as_uri: 'https://localhost:8443/',  // アプリケーション用
        ws_uri: 'ws://localhost:8888/kurento' // シグナリング用
    }
});
https://<インスタンスのIP>:8443/

上記にアクセスし、startをクリックすると、ウェブカメラからの映像とKurento Media Serverと通して配信された映像が映し出されるかと思います。startを押しても映像が映らない場合は、一度stopしてもう一度試すと、映し出されました。

感想

その他のチュートリアルも触ってみたのですが、1対1、1対多数、多数対多数など、拡張性が容易そうです。 また、画像処理を含むチュートリアルを動かしてみると、配信の時間のズレがかなりあったので、サーバーのスペックがある程度必要そうです。