[Kinesis Video Streams] GStreamerを使用したRTSPサーバを構築し、Macから動画を送信してみました。

2020.02.13

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

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