概要
Janus gatewayというWebRTCメディアサーバーについての記事は多数ありますが、
用意されているAPIの使い方については公式以外ほとんどありません。
調べるのに苦労しましたので、ここにまとめておきたいと思います。
参考になるサイト
APIの種類
Janusで用意されているAPIには大きく分けると二つの種類があります。
- Admin API
Janusを管理、モニターするためのAPIです。
この記事にて使ってみます。
- プラグイン API
Janusにはビデオ通話やストリーミング、SIP関連などの多数のプラグインが用意されています。
そのプラグインを操作するためのAPIです。
次回記事にて使ってみるつもりです。
Websocketを介してAdmin APIを使ってみる
Janusのコンフィグを設定する
Admin APIを呼び出す際に使うパスワードを設定します。
[general]
admin_secret = password
Websocketを介して使えるように設定します。
今回はwsの設定していますが、暗号化が必要な場合はwssの設定および証明書の準備をしましょう。
また、ここで指定したポートはFW等でブロックされないようにしておきます。
[admin]
admin_ws = yes
admin_ws_port = 7188
Pythonでコードを書く
Pythonのバージョンは2.7です。
今回はJanusにアクセスしてきたユーザの情報をモニターしてみます。
まずは、アクセスしているセッションのリストを取得します。
import websocket
import json
import random
import string
# Janusのエンドポイント
janus_admin_url = 'ws://10.0.0.1:7188/janus'
# 管理用パスワード
janus_admin_secret = 'password'
# ランダム文字生成
def random_string(length, seq=string.digits):
sr = random.SystemRandom()
return ''.join([sr.choice(seq) for i in range(length)])
# 8文字のランダム文字
transaction = random_string(8)
# list_sessionsメソッド呼び出すJsonを作る
data = {"janus":'list_sessions', "admin_secret": janus_admin_secret, "transaction": transaction}
# Websocketのコネクションを作成
websock = websocket.create_connection(janus_admin_url,subprotocols=["janus-admin-protocol"])
# 送信
websock.send(json.dumps(data))
# 受信
rejson = websock.recv()
# 受信結果を表示
print rejson
{
"janus": "success",
"transaction": "73677159",
"sessions": [
311091039069809
]
}
次に、そのセッションがハンドルしているリストを取得します。
複数のプラグインが使われている場合などは、ハンドルが複数返されます。
sessions_list = json.loads(rejson).get('sessions',[])
# list_handlesメソッド呼び出すJsonを作る
data = {"janus":'list_handles', "admin_secret": janus_admin_secret, "transaction": transaction, "session_id": sessions_list[0]}
websock.send(json.dumps(data))
rejson = websock.recv()
print rejson
{
"janus": "success",
"transaction": "73677159",
"session_id": 311091039069809,
"handles": [
1721128026873430
]
}
最後に、そのハンドルの情報を取得します。
handles_list = json.loads(rejson).get('handles',[])
# handle_infoメソッド呼び出すJsonを作る
data = {"janus":'handle_info', "admin_secret": janus_admin_secret, "transaction": transaction, "session_id": sessions_list[0], "handle_id": handles_list[0]}
websock.send(json.dumps(data))
rejson = websock.recv()
print rejson
{
"janus": "success",
"transaction": "73677159",
"session_id": 311091039069809,
"handle_id": 1721128026873430,
"info": {
"session_id": 311091039069809,
"session_last_activity": 1367674698,
"session_transport": "janus.transport.http",
"handle_id": 1721128026873430,
"opaque_id": "videoroomtest-L4YiOtywt1nm",
"created": 464048923,
"send_thread_created": true,
"current_time": 1368713443,
"plugin": "janus.plugin.videoroom",
"plugin_specific": {
"type": "publisher",
"room": 1234,
"id": 4565592288551424,
"private_id": 3477273478,
"display": "You",
"media": {
"audio": true,
"audio_codec": "opus",
"video": true,
"video_codec": "h264",
"data": false
},
"bitrate": 128000,
"audio-level-dBov": 0,
"talking": false,
"destroyed": 0
},
・・・
(省略)
・・・
}
}
上記の情報を説明します。
infoのpluginが「janus.plugin.videoroom」となっていることから、
このユーザはvideoroomにアクセスしていることがわかります。
またpluginの詳細はplugin_specificにあり、
room番号が「1234」、名前が「You」ということがわかります。
その他にもコーデックやビットレート、SDP等の情報も取得することができます。
最後に
今回はAdmin APIの基本的な使い方を説明しました。
この他にもAdmin APIには多数のメソッドが用意されています。
公式サイトを確認してみてください。
次回はプラグインAPIについても記事を書きたいと思います。
余談
今回が自分のQiita初記事でした。
間違っている箇所等あれば、ぜひご指摘ください。