Node.jsとExpressを使ったRTSPストリーミング再生方法
本記事では、Node.jsとExpressを使用して、WebアプリケーションでRTSPストリーミングを再生する方法を紹介します。
RTSPストリーミングを再生するライブラリには、rtsp-relayを使います。
バージョン
- express - 4.18.1
- rtsp-relay - 1.6.1
インストール
RTSP再生のサンプル
サーバサイド
app.ws()
でクライアント側の接続先を指定し、その中で実際のRTSPのURLを指定します。
今回はクライアントから指定されたカメラ(IPアドレス指定)に接続するサンプルです。固定のカメラであればパラメータは不要です。
クライアント
まず、\node_modules\rtsp-relay\browser\index.jsをクライアントが見える位置にコピーします。 今回はファイル名も変更し、\public\js\rtsp-relay-index.jsとして保存しました。
loadPlayer()
メソッドでサーバ側のアドレスと描画先のcanvasエレメントを指定するとストリーミング再生が始まります。
rtsp-relayだけでは、一時停止などができないため、今回はjsmpegのplayerインスタンスを取得し、一時停止などに対応させます。それらの処理をまとめてRtspPlayクラス
としました。
画面表示中に再生を止めない場合は、playerインスタンスの保持などは不要です。
class RtspPlay { | |
_cameraIP; | |
_canvasID; | |
_player; | |
constructor(cameraIP, canvasID) { | |
this._cameraIP = cameraIP; | |
this._canvasID = canvasID; | |
} | |
stop() { | |
this._stop(); | |
} | |
pause() { | |
this._pause(); | |
} | |
play() { | |
const canvas = document.getElementById(this._canvasID); | |
return new Promise((resolve, reject) => { | |
if (!canvas) { | |
// destroy() した後. | |
reject('canvas is null'); | |
return; | |
} | |
if (this._player) { | |
if (this._player.paused) { | |
this._player.play(); | |
} | |
} else { | |
loadPlayer({ | |
url: `ws://${location.host}/api/stream/${this._cameraIP}`, | |
canvas: canvas, | |
disconnectThreshold: 10000, | |
onDisconnect: () => console.log('streaming disconnected') | |
}) | |
.then((player) => { | |
this._player = player; | |
}); | |
} | |
resolve(); | |
}); | |
} | |
pause() { | |
if (this._player) { | |
this._player.pause(); | |
} | |
} | |
stop() { | |
if (this._player) { | |
this._player.stop(); | |
} | |
} | |
destroy() { | |
if (this._player) { | |
// destroy() を使うと canvas も破棄される. | |
this._player.destroy(); | |
this._player = undefined; | |
} | |
} | |
} |
画面側のHTMLファイルです。
id="cameraCanvas"
がストリーミングを再生するcanvasエレメントです。
実行
次のアドレスにアクセスすると、カメラIPで指定したカメラのRTSPストリームを再生します。
http://<ホスト>:8080/player.html
非インターネット環境でエラー発生時
インターネット接続されておらず、キャッシュにjsmpeg.min.jsが残っていない場合、次のようなエラーが発生します。
解決方法
jsmpeg.min.jsをローカルで保持することで、このエラーを解消できます。
- jsmpegのサイトから、DOWNLOAD>jsmpeg.min.jsをたどり、ファイルをダウンロードする
- ダウンロードしたファイルをクライアントが見える位置に配置する
本手順ではpublic\js\jsmpeg.min.jsに保存 - ダウンロードしたファイルをスクリプトタグでrtsp-relay-index.jsの前に読み込む