simotin13's message

simotin13といいます。記事の内容でご質問やご意見がありましたらお気軽にコメントしてください\^o^/

gstreamerでRTSPのストリーミングを音声付で録画する

ここ最近 gstreamer をよく使っているのですが、gstreamer は日本語の情報が少ないので使い方などについてメモ書きしておきたいと思います。

gstreamerとは何か

一言で言えば動画や音声を扱う便利なオープンソースのライブラリ+ツール一式でしょうか。
gstreamerではカメラの映像を配信することや配信されている映像をファイルに録画したりと色々な機能が提供されています。
動画のみや音声のみ、あるいは特定プロトコルやコーディックのみをサポートしたオープンソースのマルチメディア系のライブラリはありますが、gstreamerはサポートしているコーディックや機能が幅広く、マルチメディア系ライブラリの一強と言っても過言ではないかと思います。

ちなみに、公式のドキュメントは整備されていますが、やりたいことに対して具体的に何をする必要があるのか・どういったパイプラインを記述するのかなかなか直ぐには分かりません。
gstreamer.freedesktop.org


インストール

Ubuntuであればaptでインストールすることで利用できるようになります。
gstreamerはプラグイン形式をとっているので必要なプラグインを後からインストールして利用することができます。
今回動画を記録するにあたり以下のツール・プラグインをインストールして確認してみました。

sudo apt install gstreamer1.0-tools gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-libav

利用するカメラについて

動画を撮影するにはUSBのWebカメラやネットワークカメラが必要になります。
Webカメラの場合logicoolのC270などが安価に入手でき、Linux環境からUVCカメラとして認識されます。


今回はRTSPでのストリーミングの動画を扱いたかったので比較的安価で高機能なTP-LinkのネットワークカメラC210を利用してみました。(購入したのはC210/A)
C210は動体検知やスマホアプリを使った外からの映像の確認など便利な機能は一通り搭載されていて価格も4000円~5000円程度で販売されています。


映像はRTSPプロトコルでストリーミングされます。
gstreamerでは当然RTSPプロトコルもサポートしているので、gstreamerを使って映像を録画することができます。

C210の初期設定

C210は開封後、初期設定を行う必要があります。詳細は取り扱い説明書に従って設定して頂ければと思いますが簡単に流れに触れておきたいと思います。

スマホアプリで TP-Link Tapo というアプリをインストールし、アプリからWiFiの接続設定などを行います。
RTSPでストリーミングを行うためにアカウントの設定をしておく必要があります。

カメラの設定から"高度な設定"→"デバイスアカウント"と進みアカウントのユーザ名とパスワードを設定します。
ここで設定したユーザ名とパスワードを使ってRTSPプロトコルで接続しておくことになりますのでユーザ名とパスワードは控えておく必要があります。

C210デバイスアカウントの設定
C210デバイスアカウントの設定

gstreamerを使って録画してみる

映像のみの動画を録画する

gstreamerではエレメントと呼ばれる処理の塊を表す要素を複数つなげたパイプラインによって実現したい処理を表現します。
gstreamerのパイプラインは !(ビックリマーク)を区切り文字としてエレメントをつなげる書き方をします。
エレメントはデータの送信元となるsrcとデータの受信側となるsinkの概念があります。
パイプラインについては言葉で説明するよりも、実際のパイプラインをみた方が理解が深まると思うので、実際にC210のRTSPのストリーミング映像をmp4ファイルに録画するパイプラインを見てみましょう。

# RTSPのストリーミング映像を録画する
gst-launch-1.0 -e rtspsrc location="rtsp://user:password@192.168.1.123:554/stream1" ! rtph264depay ! video/x-h264,stream-format=byte-stream,format=avc,alignment=au ! h264parse ! qtmux ! filesink location=hoge.mp4

gst-launch-1.0はgstreamerのパイプラインを指定して実行するコマンドラインツールです。
rtspsrc で入力元となるソースを指定します。
rtspのURLですが、rtsp://<ユーザ名>:<パスワード>@IPアドレス:ポート番号/ストリーミングのパス の形になります。
ユーザ名・パスワードはC210設定したデバイスアカウントになります。カメラのIPアドレスもTapoアプリの画面から確認できます。ストリーミングURLですが、C210では/stream1になっているようです。

rtph264depay以降ですが、h264の映像ストリーミングを取得しパースするための記述が続きます。
また、最後にある filesink location=hoge.mp4 は出力するファイルパスを指定しています。

重要な注意点として、冒頭についている -e のオプションですがこちらは録画終了時のファイナライズを行うためのオプションになりますので必ずつけてください。

上記コマンドを実行するとgst-launchが起動し、録画が始まります。Ctrl-Cでgst-launchを停止し、hoge.mp4を動画再生ソフトで開くと映像が確認できると思います。

音声ありの動画を録画する

上記の例では、映像を.mp4ファイルに記録してみましたが、音声をつけて映像を保存することもできます。
音声付きの録画のパイプラインは少し長くなりますが、以下のパイプラインを実行することで録画できます。

# RTSPのストリーミングを音声付きで録画する
gst-launch-1.0 -e rtspsrc location="rtsp://user:password@192.168.1.123:554/stream1" name=src ! rtph264depay ! video/x-h264,stream-format=byte-stream,format=avc,alignment=au ! h264parse ! mp4mux name=mux ! filesink location=hoge.mp4 src. ! rtppcmadepay ! alawdec ! audioconvert ! audio/x-raw, rate=8000, channels=1 ! avenc_aac ! mux.

先ほどの映像を記録するパイプラインに加えて、音声の取得に必要な記述が増えています。
C210では音声はPCMA(G.711 A-law)で配信されているので、これを取り出して、AACのフォーマットでファイルに保存しています。

C210ではPCMAでしたが、カメラが配信する音声データのフォーマットには様々なコーディックが存在し、サンプリング周波数も異なります。
このため、音声を保存するためには、カメラ側音声フォーマットに合わせたパイプラインの指定が必要になってきます。

まとめ

gstreamerでRTSPのストリーミングを録画する方法について触れてみました。
gst-launchを使えば気軽にやりたいことを試せますが、gstreamerではライブラリとしての機能も提供されているので、次回はgstreamerのライブラリを使ったアプリケーションの開発方法についても書いてみたいと思います。