[Kinesis Video Streams] Raspberry PiからGStreamerを使用してTCPストリーム配信してみました。

2020.02.12

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

1 はじめに

CX事業本部の平内(SIN)です。

Kinesis Video StreamsのプロデューサーがGStreamerのエレメントとして提供されている関係上、色々とGStreamerに触れる機会があるのですが、正直、難しいです。

エレメント間の流れや、エラーとなった(表示できなかった)場合の対応など、なかなか理解が進みません。また、OSによって、提供されているエレメントが違うのも、複雑に感じる要因になっているかも知れません。

今回は、「GStreamerに慣れる」という、個人的な課題から、ストリームの送受信を試してみました。

すいません、直接Kinesis Video Streamsに関係無いのですが、同サービスを利用するために、GStreamerは必須ということで、Kinesis Video Streamsのカテゴリとさせて下さい。

1 Raspberry Pi上での送受

最初に、Raspberry Piでローカルマシーン上でのストリームの送受について確認してみました。

送信側のGStreamerも、受信側のGStreamerもRaspberry Pi上で動作しています。

(1) テストパターン(ポート指定なし)

テストパターンを入力とした、サーバ側のGStreamerは以下のとおりです。

Server

$ gst-launch-1.0 -v videotestsrc !  gdppay ! tcpserversink

ポート番号を指定しない場合、4953となり、LISTEN状態になっていることを確認できます。

$ netstat -an | grep 4953
tcp6       0      0 ::1:4953                :::*                    LISTEN

これを受信する、クライアント側のGStreamerは、以下のとおりです。

Client

$ gst-launch-1.0 -v tcpclientsrc ! gdpdepay ! videoconvert ! ximagesink

ポート4953で2つのプロセスが相互にESTABLISHEDになっていることを確認できます。

$ netstat -an | grep 4953
tcp6       0       0 ::1:4953                :::*                    LISTEN     
tcp6       0 1806176 ::1:4953                ::1:47186               ESTABLISHED
tcp6  957443       0 ::1:47186               ::1:4953                ESTABLISHED

(2) テストパターン(ポート指定あり)

上記と殆ど同じですが、ポート番号を指定する場合は、tcpserversinkのパラメータで指定します。

Server

$ gst-launch-1.0 -v videotestsrc !  gdppay ! tcpserversink port=9000
$ netstat -an | grep 9000
tcp6       0      0 ::1:9000                :::*                    LISTEN

受信側は、tcpclientsrcのパラメータで指定します。

CLient

gst-launch-1.0 -v tcpclientsrc port=9000 ! gdpdepay ! videoconvert ! ximagesink

(3) Webカメラ

同じくローカルマシン上での送受ですが、USB接続したWebカメラを入力ソースにしてみます。Webカメラの解像度を抑えるため、capsfilterを通していますが、無しでも動作可能です。

Server

gst-launch-1.0 -v v4l2src ! video/x-raw,width=320,height=240,framerate=30/1 ! gdppay ! tcpserversink

Client

gst-launch-1.0 -v tcpclientsrc ! gdpdepay ! videoconvert ! ximagesink

2 Macでの受信

続いて、RaspberryPiで送信したストリームをMacで受けてみます。送信側のGStreamerは、Raspberry dPi上、受信側のGStreamerは、Mac上で動作しています。

(1) MacでのWebカメラ

送信側(RaspberryPi)のtcpserversinkで、バインドするアドレス(自身のアドレス10.0.0.10)を指定します。

Server(RaspberryPi)

gst-launch-1.0 -v v4l2src ! video/x-raw,width=320,height=240,framerate=30/1 ! gdppay ! tcpserversink host=10.0.0.10

受信側(Mac)のtcpclientsrcでは、サーバのアドレス(10.0.0.10)をパラメータで指定します。

CLient(Mac)

gst-launch-1.0 -v tcpclientsrc host=10.0.0.10 ! gdpdepay ! videoconvert ! autovideosink

クライアントを複数立ち上げることも可能です。(各接続は、ユニキャスト)

3 最後に

GStreamerでTCPストリームを構成する場合、gdppaygdpdepayを使用することが肝のようです。

ここまでの作業では、ストリーム上のデータは圧縮されていないのですが、H.264で圧縮しようとして途端に頓挫してしまいました。

RasPiからRasPiへ送るような場合は、同一カテゴリのエレメントでエンコード・デコードが出来たのですが、今回の用にRasPiからMacというように、OSが変わった途端に、途方に暮れている状況です。

精進します。

参考


How to make a Raspberry Pi an RTSP streamer and how to consume this?
GStreamer RTSP Server