[Kinesis Video Streams] GStreamerを使用したRTSPサーバを構築し、Macから動画を送信してみました。
1 はじめに
CX事業本部の平内(SIN)です。
Raspberry Pi でRTSPサーバを作成し、そのストリームをMacからKinesis Video Streamsに送ってみました。
RTSPからのストリームは、既にh.264でエンコードされているため、Macでは、kvssinkにパイプするだけなので、PCへの負荷が非常に軽くなります。
Raspberry Pi でRTSPサーバを作成する一番簡単な方法は、v412rtspserverを使用する方法ではないかと個人的には思っているのですが・・・
参考:【小ネタ】Raspberry Pi と USB接続のWebカメラ でRTSPサーバを作って動画を配信する
今回は、あえて、最近、ハマり続けているGStreamerでやってみました。
2 gst-rtsp-server
gst-rtsp-serverは、GStreamerで提供されている、RTSPサーバー構築用のライブラリです。
GStreamer/gst-rtsp-server
下記の手順で、コンパイル及び、インストールが完了します。
$ git clone git://anongit.freedesktop.org/gstreamer/gst-rtsp-server $ cd gst-rtsp-server $ git checkout 1.4 $ ./autogen.sh $ make $ sudo make install
$ ./autogen.sh ・・・略 Configuration Version : 1.4.5 Source code location : . Prefix : /usr/local Compiler : gcc CGroups example : no gst-rtsp-server configured. Type 'make' to build. Now type 'make' to compile gst-rtsp.
作業した環境(昨年9月の最新版(Raspbian GNU/Linux 10 (buster)2019-09-26-raspbian-buster-full.img)では、gtk-docが無いということでmakeがエラーとなりましたので、それだけ追加しました。
$ sudo apt-get install gtk-doc-tools
3 テストパターンで確認
gst-rtsp-serverでは、軽易にRTSPサーバの構築ができるように、example/.test-launchが提供されています。当初、テストパターンで確認してみます。
$ cd examples/ $ ./test-launch '( videotestsrc ! x264enc ! rtph264pay name=pay0 pt=96 )' stream ready at rtsp://127.0.0.1:8554/test
上記のコマンドで、8554番ポートがLISTENとなります。
$ netstat -an | grep 8554 tcp 0 0 0.0.0.0:8554 0.0.0.0:* LISTEN
受信は、Mac上のVLCで確認しました。
ファイル > ネットワークを開く から rtsp://{Raspberry Piのアドレス}:8554/test を開きます。
RSTPサーバーから送られてくるテストパターンが表示されることを確認できます。
ポート番号(8554)及びパス(/test)については、test-launch.cの中でコーディングされています。
https://github.com/GStreamer/gst-rtsp-server/blob/master/examples/test-launch.c
4 Webカメラで送信
当初、GStreamerのドキュメントに案内されていた、x264encを使用して、下記のコマンドで試してみたところ、一応、送信出来るのですが、少し時間が経過すると止まってしまいました。
$ ./test-launch '( v4l2src device=/dev/video0 ! video/x-raw,width=640,height=480,framerate=30/1 ! videoconvert ! x264enc ! rtph264pay name=pay0 pt=96 )'
h.264のエンコードに限界があるようなので、ハードウエアエンコードできるomxh264encに差し替えました。
$ ./test-launch '( v4l2src device=/dev/video0 ! video/x-raw,width=640,height=480,framerate=30/1 ! videoconvert ! omxh264enc ! video/x-h264,profile=baseline ! h264parse ! rtph264pay name=pay0 pt=96 )'
こちらは、安定して送信できているようです。
5 MacからKinesis Video Streamsへの送信
Macからの送信は、以下のとおりです。認証情報やリージョンは、環境変数で設定しています。
$ export AWS_DEFAULT_REGION=ap-northeast-1 $ export AWS_ACCESS_KEY_ID=xxxxxxxxx $ export AWS_SECRET_ACCESS_KEY=xxxxxxxxx
$ gst-launch-1.0 rtspsrc location=rtsp://10.0.0.10:8554/test short-header=TRUE ! rtph264depay ! video/x-h264, format=avc,alignment=au ! h264parse ! kvssink stream-name="rtspStream"
参考:[Kinesis Video Streams] Mac上で各種ソースからの動画のアップロード 〜 kvssynkを利用する場合のGStreamerの使用方法
6 GST_DEBUG
./test-launch を使用していると、エラーなどが全く表示されないため、問題があっても手も足も出ないのですが、下記のようにGST_DEBUGを設定することで、ログが出力されるようになります。
GST_DEBUG=3 ./test-launch '( v4l2src device=/dev/video0 ! ・・・・)'
GST_DEBUGには、1から9まで詳細度を指定できますが、9とかにすると、ログが多すぎるので、当初は3か4ぐらいが丁度いいのではと思っています。
シンタックスエラーなどは、簡単に分かります。
下記は、capsfilterの指定で、Webカメラが対応していないフレームレートを指定して、エラーとなっている様子です。
7 最後に
今回は、GStreamerによるRTSPサーバ構築をやってみました。
直接関係ないのですが・・・omxh264encのハードウエアエンコードの威力を、改めて認識しました。 動画送信のエンコードは、要件にもよりますが、ここでやるのが、一番コスパが良いような気もしてきました。
8 参考
How to make a Raspberry Pi an RTSP streamer and how to consume this?
GStreamer RTSP Server