背景
WebRTCの中継サーバーjanusのapiを利用してwebとreact-nativeでstream動画を受信する方法を以前把握しました。上記の記事でstream動画を受信できたものの1分足らずで通信が途切れてしまう症状に悩まされていましたが、janus.jsのコードを調べたところkeepAliveリクエストを送ってsessionの維持が必要と分かりました。
備忘録を兼ねてコードと関連情報を記事に残します。
使ったもの
janusのapiを使うjavascript(やtypescript)のプロジェクト下記の記事のコードに今回の内容を適用しました。
janusのstream動画をapiとRTCPeerConnectionで受信
react-nativeでjanusのstream動画を受信する
sessionIdとtransactionを付けてkeepAliveを送信
setIntervalで一定時間ごとにkeepAliveを呼べば、sessionが維持されます。
janusの標準のsessionのtimeout時間は60秒なので、下記のコードは40秒ごとにkeepAliveを送っています。
const intervalKeepalive = setInterval(() => { const dataToSend = JSON.stringify({ janus: "keepAlive", transaction: transactionId, session_id: sessionId, }) socket.send(dataToSend) }, 40000)
janusの説明書としてはrest apiの説明のWebSocketに関する項目の最後の方に記されています。
RESTful, WebSockets, RabbitMQ, MQTT, Nanomsg and UnixSockets API
websocket接続したらそれの切断まではsessionを維持して欲しいところですが、説明書きによると内部でhttpのrequestと同じ処理を利用しているためkeepAliveの送信がwebsocketの場合も必要らしいです。
janus.jsではkeepAlive関数が定義され、それがtimeoutで一定時間後に呼び出される処理になっていました。
おわり
websocketでjanusから情報取得する場合もkeepAliveの定期的送信でsessionの維持が必要と分かりました。stream動画の受信が1分で終わってしまう不具合の原因が分かって良かったです。
参考
janus.jsのkeepAliveに関する記述箇所です。keepAlive関数の定義
keepAliveのtimeout設定
janusのRESTやWebSocketに関する説明書です。
RESTful, WebSockets, RabbitMQ, MQTT, Nanomsg and UnixSockets API
0 件のコメント :
コメントを投稿