Armadilloフォーラム

gstreamerでマルチキャストストリームが再生できない

yseki

2015年12月7日 21時18分

パナソニック製カメラのH.264を受信し、LCD表示させようとしていますが、表示できません。
RTSPでは表示できているのですが、マルチキャストでの表示が出来ません。
fakesinkでダンプ出来ていますので、マルチキャストの受信は出来ています。

なにか、解決策がありますでしょうか。

RTSPでの実行コマンド

[root@armadillo840-0 (pts/0) ~]# GST_DEBUG=2 gst-launch-1.0 -v rtspsrc "location=rtsp://192.168.10.10:554/MediaInput/h264" ! rtph264depay ! video/x-h264,framerate=10/1,width=640,height=360 ! h264parse ! acmh264dec stride=800 ! acmfbdevsink device=/dev/fb1

fakesinkでのマルチキャストダンプ

[root@armadillo840-0 (pts/0) ~]# GST_DEBUG=2 gst-launch-1.0 -v udpsrc uri=udp://239.192.0.20:37004 multicast-iface=eth0 auto-multicast=true ! fakesink dump=true
Setting pipeline to PAUSED ...
Pipeline is live and does not need PREROLL ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
00000000 (0xd76d8): 80 62 88 65 7e f6 9e 48 0d f6 3b 64 09 30        .b.e~..H..;d.0  
00000000 (0xd77a8): 80 62 88 66 7e f6 9e 48 0d f6 3b 64 68 ce 38 30  .b.f~..H..;dh.80
00000000 (0x216c8): 80 62 88 67 7e f6 9e 48 0d f6 3b 64 06 01 11 00  .b.g~..H..;d....
00000010 (0x216d8): 00 03 00 14 00 00 03 00 00 09 06 1b 34 20 00 05  ............4 ..
00000020 (0x216e8): c8 c0 80                                         ...             
00000000 (0xe0450): 90 62 88 68 7e f6 9e 48 0d f6 3b 64 00 00 00 05  .b.h~..H..;d....
00000010 (0xe0460): 00 11 00 0c 56 64 32 22 00 00 00 00 00 12 00 08  ....Vd2"........

マルチキャストのLCD表示

[root@armadillo840-0 (pts/0) ~]# GST_DEBUG=2 gst-launch-1.0 -v udpsrc uri=udp://239.192.0.20:37004 multicast-iface=eth0 auto-multicast=true ! video/x-h264,framerate=10/1,width=640,height=360,stream-format=byte-stream,alignment=au ! h264parse ! acmh264dec stride=800 ! acmfbdevsink device=/dev/fb1
Setting pipeline to PAUSED ...
Pipeline is live and does not need PREROLL ...
Setting pipeline to PLAYING ...
0:00:00.259799668  4347    0xceca0 WARN                     bin gstbin.c:2474:gst_bin_do_latency_func:<pipeline0> failed to query latency
New clock: GstSystemClock
/GstPipeline:pipeline0/GstCapsFilter:capsfilter0.GstPad:src: caps = video/x-h264, framerate=(fraction)10/1, width=(int)640, height=(int)360, stream-format=(string)byte-stream, alignment=(string)au
/GstPipeline:pipeline0/GstH264Parse:h264parse0.GstPad:sink: caps = video/x-h264, framerate=(fraction)10/1, width=(int)640, height=(int)360, stream-format=(string)byte-stream, alignment=(string)au
コメント

at_shota.tamura

2015年12月7日 21時56分

yseki 様

田村です。

> なにか、解決策がありますでしょうか。

サーバー(カメラ)側のパイプラインを知らない + 同じ環境が手元にないので、
「解決策」とまでとはいきませんが、コメントさせていただきます。

udpsrc で受信までは切り分けられているようですが、h264parse 後に fakesink dump=true を置いたらどんな動きをするでしょう?

完全に「勘」ですが、なにも dump されないのではないでしょうか?
もし、そうであれば、H.264 の解析に失敗しているので、パイプラインの上流に問題がありそうです。

また、udpsrc を使われているようですが、udpsrc は rtspsrc ほど賢くないので、より賢い Element を使うのがいいかもしれません。
rtspsrc は GstBuffer を application/x-rtp 形式で下流にデータを渡しますが、対して、udpsrc は ANY となっています。(udpsrc のほうが生データを扱うイメージ)
gst-inspect で見たところ、rtspsrc もマルチキャストに対応していそうなので、試されてみてはいかがでしょうか?

田村様

ありがとうございます。
下記で表示することが出来ました。

[root@armadillo840-0 (pts/0) ~]# gst-launch-1.0 -v udpsrc uri=udp://239.192.0.20:37004 multicast-iface=eth0 ! application/x-rtp,payload=96 ! rtph264depay ! video/x-h264,framerate=30/1 ! h264parse ! acmh264dec stride=800 ! video/x-raw ! acmfbdevsink sync=false device=/dev/fb1

rtspsrcも試してみたのですが、マルチキャストアドレスを指定する方法が分かりませんでした。

[root@armadillo840-0 (pts/0) ~]# gst-launch-1.0 rtspsrc location=rtsp://239.192.0.20:37004 multicast-iface=eth0 ! fakesink
Setting pipeline to PAUSED ...
Pipeline is live and does not need PREROLL ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
ERROR: from element /GstPipeline:pipeline0/GstRTSPSrc:rtspsrc0: Could not open resource for reading and writing.

locationを、他にudp://やrtp://でも試してみましたが、エラーとなりました。
rtspsrcでマルチキャストを直接受信するにはどうすればよいのでしょうか。

また、デコードしているフレームレートを調べる方法、SH-4AやVCP1の負荷率などを調べる方法がありましたらご教示ください。

yseki 様

田村です。

> rtspsrcでマルチキャストを直接受信するにはどうすればよいのでしょうか。

似た環境で確認するためには、配信側のパイプラインが必要です。もし、可能であればお教え頂けませんか?

また、udpsrc で表示できているのならば、「マルチキャストストリームを再生する」は達成できているように思います。
このほかに困っているところがありますか?

もし、再生すること以外に困っているのあれば、検索性向上のため新たにトピックを作成していただけると幸いです。

> また、デコードしているフレームレートを調べる方法、

フレームレートを調べる方法はいくつかあります。

■ 方法1
リアルタイムに(受信中に)知りたいのであれば C で GStreamer アプリを書く必要があります。
identity [*1] という Element を使い、これの handoff callback に測定する処理を書けば可能です。

過去のスレッド[*2]に identity を使ったサンプルコードをあげていますので、これが参考になるかと思います。

■方法2
リアルタイムに知る必要がないのであれば、受信したストリームを filesink で保存しそれをPC上で確認します。
ATDE5を使って確認するのであれば、以下のパイプラインで確認できます。

gst-launch-1.0 filesrc location=video.mp4 ! decodebin ! videoconvert ! fpsdisplaysink video-sink=ximagesink

> SH-4AやVCP1の負荷率などを調べる方法がありましたらご教示ください。

Armadilloから負荷率などを調べる方法はありません。

また、技術的には可能だと思いますが、SH-4HやVCP1について弊社からご提供できる情報はありません。
お手数ですが、ルネサスまたはルネサスパートナーへお問い合わせください。

ルネサスのパートナー一覧 [*3]

[*1]: http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-plug…
[*2]: https://users.atmark-techno.com/comment/1916#comment-1916
[*3]: http://japan.renesas.com/partner/listing/index.jsp