[Kinesis Video Streams] Raspberry PiからGStreamerを使用してTCPストリーム配信してみました。
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ストリームを構成する場合、gdppayとgdpdepayを使用することが肝のようです。
ここまでの作業では、ストリーム上のデータは圧縮されていないのですが、H.264で圧縮しようとして途端に頓挫してしまいました。
RasPiからRasPiへ送るような場合は、同一カテゴリのエレメントでエンコード・デコードが出来たのですが、今回の用にRasPiからMacというように、OSが変わった途端に、途方に暮れている状況です。
精進します。
参考
How to make a Raspberry Pi an RTSP streamer and how to consume this?
GStreamer RTSP Server