Armadilloフォーラム

Gstreamerによるストリーム再生について

logicart

2014年2月14日 19時29分

AXIS製のIPカメラ(P1214-e)からH264形式のストリーミングデータを
AVミドルウェアコーデックを利用して動作再生したいと思っております。

AXIS製のカメラは、RTSPまたはRTPをサポートしていますが
Armadillo840+Gstreamerでストリーミング再生を実現することは
可能でしょうか。

また、その際に参考になるコマンド例の資料などはございますでしょうか。
よろしくお願いいたします。

コメント

at_yashi

2014年2月19日 14時23分

GStreamer の rtspsrc[1] を使うのが簡単だと思います。最新の a840用イメー
ジであれば、デフォルトでrtsp が入っています。a840のマニュアルに記載され
ている pipe line の filesrc などを rtspsrc にすることで、表示できません
か?

[1] http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-go…

logicart

2014年2月19日 21時24分

ご返答ありがとうございます。
吉村と申します。

A840のユーザーマニュアルを参考にパイプラインを入力すると
以下のログが表示されます。

A840のファイアウォールが原因かと思い、
RTSPポート(554)を許可しましたが変化はありませんでした。

当方、Gstreamerについての知識に乏しいため調べておりますが
検討がつきません。
こちらから何か分かりますでしょうか。

なお、Linuxカーネル、ユーザランド、ファームウェアは最新のものに
アップデートしております。
よろしくお願いいたします。

gst-launch-1.0 -v rtspsrc location=rtsp://192.168.0.90/axis-media/media.amp ! qtdemux ! queue ! acmh264dec ! acmfbdevsink device=/dev/fb0
 
Setting pipeline to PAUSED ...
Pipeline is live and does not need PREROLL ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
/GstPipeline:pipeline0/GstRTSPSrc:rtspsrc0/GstRtpBin:rtpbin0: latency = 2000
/GstPipeline:pipeline0/GstRTSPSrc:rtspsrc0/GstRtpBin:rtpbin0: drop-on-latency = false
/GstPipeline:pipeline0/GstRTSPSrc:rtspsrc0/GstRtpBin:rtpbin0: buffer-mode = Slave receiver to sender clock
/GstPipeline:pipeline0/GstRTSPSrc:rtspsrc0/GstUDPSrc:udpsrc1: timeout = 5000000
/GstPipeline:pipeline0/GstRTSPSrc:rtspsrc0/GstUDPSrc:udpsrc1: timeout = 0
/GstPipeline:pipeline0/GstRTSPSrc:rtspsrc0/GstRtpBin:rtpbin0.GstGhostPad:recv_rtp_src_0_2050299576_96: caps = application/x-rtp, media=(string)video, payload=(int)96, clock-rate=(int)90000, encoding-name=(string)H264, packetization-mode=(string)1, profile-level-id=(string)420029, sprop-parameter-sets=(string)"Z0IAKeKQGQJvy4C3AQEBpB4kRUA\=\,aM48gA\=\=", a-framerate=(string)25.0, a-transform=(string)"1\,0\,0\;0\,1\,0\;0\,0\,1", clock-base=(uint)105111969, seqnum-base=(uint)6911, npt-start=(guint64)0, play-speed=(double)1, play-scale=(double)1
/GstPipeline:pipeline0/GstRTSPSrc:rtspsrc0.GstGhostPad:recv_rtp_src_0_2050299576_96: caps = application/x-rtp, media=(string)video, payload=(int)96, clock-rate=(int)90000, encoding-name=(string)H264, packetization-mode=(string)1, profile-level-id=(string)420029, sprop-parameter-sets=(string)"Z0IAKeKQGQJvy4C3AQEBpB4kRUA\=\,aM48gA\=\=", a-framerate=(string)25.0, a-transform=(string)"1\,0\,0\;0\,1\,0\;0\,0\,1", clock-base=(uint)105111969, seqnum-base=(uint)6911, npt-start=(guint64)0, play-speed=(double)1, play-scale=(double)1
/GstPipeline:pipeline0/GstRTSPSrc:rtspsrc0.GstGhostPad:recv_rtp_src_0_2050299576_96.GstProxyPad:proxypad4: caps = application/x-rtp, media=(string)video, payload=(int)96, clock-rate=(int)90000, encoding-name=(string)H264, packetization-mode=(string)1, profile-level-id=(string)420029, sprop-parameter-sets=(string)"Z0IAKeKQGQJvy4C3AQEBpB4kRUA\=\,aM48gA\=\=", a-framerate=(string)25.0, a-transform=(string)"1\,0\,0\;0\,1\,0\;0\,0\,1", clock-base=(uint)105111969, seqnum-base=(uint)6911, npt-start=(guint64)0, play-speed=(double)1, play-scale=(double)1
/GstPipeline:pipeline0/GstRTSPSrc:rtspsrc0/GstRtpBin:rtpbin0.GstGhostPad:recv_rtp_src_0_2050299576_96.GstProxyPad:proxypad3: caps = application/x-rtp, media=(string)video, payload=(int)96, clock-rate=(int)90000, encoding-name=(string)H264, packetization-mode=(string)1, profile-level-id=(string)420029, sprop-parameter-sets=(string)"Z0IAKeKQGQJvy4C3AQEBpB4kRUA\=\,aM48gA\=\=", a-framerate=(string)25.0, a-transform=(string)"1\,0\,0\;0\,1\,0\;0\,0\,1", clock-base=(uint)105111969, seqnum-base=(uint)6911, npt-start=(guint64)0, play-speed=(double)1, play-scale=(double)1
ERROR: from element /GstPipeline:pipeline0/GstRTSPSrc:rtspsrc0/GstUDPSrc:udpsrc1: Internal data flow error.
Additional debug info:
gstbasesrc.c(2812): gst_base_src_loop (): /GstPipeline:pipeline0/GstRTSPSrc:rtspsrc0/GstUDPSrc:udpsrc1:
streaming task paused, reason not-linked (-1)
Execution ended after 233283917 ns.
Setting pipeline to PAUSED ...
Setting pipeline to READY ...
Setting pipeline to NULL ...
Freeing pipeline ...

at_yashi

2014年2月20日 17時19分

情報ありがとうございます。
こちらでも再現させることができました。

少し調べてみたいと思います。

logicart

2014年2月21日 21時55分

吉村です。

ご返答ありがとうございます。
よろしくお願いいたします。

当方では、udpsrcを使用してRTPプロトコルでの再生も試みてみました。
結果は、以下のようにエラーは発生しませんでしたが画像は表示さませんでした。

 gst-launch-1.0 -v udpsrc port=1024 multicast-iface="eth0" multicast-group="239.194.197.201" caps="application/x-rtp" ! rtph264depay !h264parse ! acmh264dec  ! acmfbdevsink device=/dev/fb0                  
Setting pipeline to PAUSED ...                                                  
Pipeline is live and does not need PREROLL ...                                  
/GstPipeline:pipeline0/GstUDPSrc:udpsrc0.GstPad:src: caps = application/x-rtp, m
edia=(string)video, payload=(int)96, clock-rate=(int)90000, encoding-name=(strin
g)H264                                                                          
/GstPipeline:pipeline0/GstRtpH264Depay:rtph264depay0.GstPad:sink: caps = applica
tion/x-rtp, media=(string)video, payload=(int)96, clock-rate=(int)90000, encodin
g-name=(string)H264                                                             
Setting pipeline to PLAYING ...                                                 
New clock: GstSystemClock

qtdemuxをパイプラインに使用すると

WARNING: erroneous pipeline: could not link udpsrc0 to qtdemux0 

と表示され終了します。

なにか手がかりとなる情報がございましたら
ご教示のほど、よろしくお願いいたします。

logicart

2014年3月18日 13時49分

本件について、当方では上手く再生できていません。
何か、調査の進展はございますでしょうか。

Armadillo840とAVコーデックミドルウェアを使用して
ストリーミング再生を行うことは出来ないという認識でよろしいでしょうか。

また、何か別の解決案はございますでしょうか。
例えば、OpenCVライブラリで画像処理を行うことでモーションJPEGのフレームレート向上は
期待できるでしょうか。

お手数をおかけしますが、よろしくお願いいたします。

at_yashi

2014年3月18日 16時53分

とりあえずパイプラインが繋って再生されるところまでは確認できました。し
かし、かなりの数のフレームを落す現象が発生していて、使える状態になって
いません。フレームを落す理由を調査中です。

> また、何か別の解決案はございますでしょうか。
> 例えば、OpenCVライブラリで画像処理を行うことでモーションJPEGのフレー
> ムレート向上は期待できるでしょうか。

どういう意味か分りませんでした。もう少し教えて頂けますか?

logicart

2014年3月18日 18時17分

早速のご返答ありがとうございます。
また、調査のご報告ありがとうございます。

モーションJPEGについての経緯が抜けておりました、申し訳ございません。
GStreamerによるH264のストリーミング再生がうまくいかないため
平行してQtアプリケーションによるモーションJPEG再生を試みております。

Axis製カメラからのモーションJPEG画像をHTTPで受信して表示する
Qtアプリケーションを作成したところ
1280x720画像を1920x1080にQImage::scaled()でリサイズすると5fps
リサイズなしで10fpsほどしかでないため、fps向上の手段を模索しております。

QImage::scaled()の処理に時間(60~80msec)がかかるため、
OpenCVライブラリを使用することで処理速度の向上が見込めるか
ご意見を伺いたいという意図でした。

参考までに、のフレームが落ちるという現状でどの程度のfpsで表示できるか
教えていただくことは可能でしょうか。
安定して10~15fpsで表示可能であればGStreamerの使用を検討したいと思います。

よろしくお願いいたします。

at_makoto.harada

2014年4月11日 16時55分

原田です。

AXIS社製のIPカメラ(P1214-e)がようやく入手できましたので実際に動作させてみました。
動作確認を行った際の、AXISカメラの設定、Armadillo-840のgstreamerのパイプラインは以下の通りです。

■AXISカメラ
- 解像度、フレームレート 1280x720(720p),15fps
- 圧縮形式 h.264
- IP address: 172.16.42.6
- アカウント/パスワード root/root

■Armadillo-840
- 720p h264デコード
- 1280x720(720p)->1920x1080へHWリサイズ
- FullHD(1920x1080)ディスプレイにHDMI経由で表示

gst-launch-1.0 -v rtspsrc 'location=rtsp://root:root@172.16.42.6:554/axis-media/media.amp?videocodec=h264' latency=200 '!' \
rtph264depay '!' video/x-h264,framerate=15/1 '!' h264parse config-interval=1 '!' video/x-h264,stream-format=avc,alignment=au '!'\
acmh264dec stride=1080 '!' video/x-raw, width=1920, height=1080 '!' acmfbdevsink max-lateness=2000000000 device=/dev/fb0

※補足事項
1. 標準イメージでは、LCDには/dev/fb1が、HDMIには/dev/fb0がアサインされるようになっております。
2. width, heightの値を変更することで、ディスプレイに描画されるカメラ映像のサイズが調整できます。
  特に指定しない場合は、リサイズを実施せず、デコード結果をそのまま描画します。
3. カメラのフレームレートを変更される際は、カメラの設定とあわせて、上記framerateの値を適宜変更する必要があります。
4. 弊社の試験環境では、フレームレートが15fpsを超えてくるあたりから、若干のフレーム落ちが観測されました。
  ローカルファイルからの再生は、FullHD 30fpsで問題なく再生できておりますので、SWの問題かと考えております。
詳細が分かり次第報告させて頂きます。

※ディスプレイの表示方法、ビデオの拡大/縮小方法に関しましては、製品マニュアルの以下のページも参考にしてみてください。
http://manual.atmark-techno.com/armadillo-840/armadillo-840_product_man…

logicart

2014年5月1日 15時59分

吉村です。

ご対応ありがとうございました。

上記コマンド例のstride=1080 は、stride=1920かと思いますが
当方の環境にて、動作の確認を行い正常に動作いたしました。

Qtからのgstreamerの制御など試したいこともありますので
今後ともよろしくお願いいたします。

logicart

2014年7月7日 11時29分

いつもお世話になっております
吉村と申します。

Armadillo840にてgst-launchを使用してAxis製のIPカメラのストリーミング再生で
ご教示していただいたパイプラインで再生するとGstreamerが停止してしまうという
現象が発生しております。

コーデックの不具合があるとのことで関連があるのかご教示いただきたく思ております。

停止してしまったgst-launchを終了させて再度起動すると、正常にデコードされます。
また、発生頻度は都度異なります。
そのため、「GStreamerのデコード停止について」のスレッドにある

https://armadillo.atmark-techno.com/forum/armadillo/761
> - 当社で確認した条件
> -- gst-launchを使用して再生
> -- デコード停止からの復帰には一旦sysfsからコーデックのモードを
> noneまたはencoderに変更するまでデコード不能

上記の条件に合っていないため関連が不明です。

正常にデコードが行われた場合のgst-launchの標準出力と、停止してしまった場合の
標準出力を添付ファイルにて送付いたします。
ログをみると、デコードに処理が渡るところで停止してしまっているように見えます。

よろしくお願いいたします。

ファイル ファイルの説明
正常時ログ.txt
無応答ログ.txt

logicart

2014年8月12日 13時09分

いつもお世話になっております
ロジックアートの吉村です。

Armadillo840にてgst-launchを使用してAxis製のIPカメラのストリーミング再生した際の
映像遅延について質問があります。

1280x720の映像を15fpsで再生すると、かなりの遅延(1秒ほど)が発生します。
これを解消しようと試みております。
latency等のパラメータの変更ではこれといった遅延の向上は見られませんでした。

Gstreamerのソフト上の問題であれば、ソースコードの修正を試みたいと思います。
CPUの能力、またはミドルウェアの問題であれば、別のアプローチを考えております。
上記の構成で、これ以上の遅延の解消は難しいでしょうか。

ご意見、アドバイスいただければと思います。
よろしくお願いいたします。

at_yashi

2014年8月22日 18時26分

まずはどこがボトルネックになっているかしらべたいので、ログをとってみませんか?
GStreamer でデバッグログを出す方法は、ドキュメント内[1]にあります。Level 4か5で良いと思います。
差し支えなければ、ログを貼ってもらえると嬉しいです。

GST_DEBUG=5 gst-launch-1.0 .....

GStreamer Log Viewer[2] というGUI な解析ツールがあるので、取得したログをグラフィカルに
表示させ、確認することができます。x86上で動かしたものですが、「こんな感じ」という
イメージのためにスクリーンショットを貼っておきます。

[1]: http://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/se…
[2]: http://cgit.freedesktop.org/~cymacs/gst-debug-viewer/

ファイル ファイルの説明
screenshot.png

logicart

2014年8月29日 18時36分

いつもお世話になっております
吉村です。

ご返答ありがとうございます。
取り急ぎログを添付いたします。
ツールも確認してみます。

Axisのカメラが用意できなかったため、PanasonicのDG-SP102にてログを収集いたしました。
イメージサイズ=640×480、fps=15で1024x768のディスプレイに表示しています。
パイプラインは以下の通りです。

GST_DEBUG=5 GST_DEBUG_FILE=/tmp/gstlog.txt gst-launch-1.0 -v rtspsrc 'location=rtsp://192.168.0.10:554/MediaInput/h264' latency=200 '!' rtph264depay '!' video/x-h264,framerate=15/1 '!' h264parse config-interval=1 '!' video/x-h264,stream-format=avc,alignment=au '!' acmh264dec stride=1024 '!' acmfbdevsink max-lateness=2000000000 device=/dev/fb0

また、遅延の様子を収めたビデオファイルも併せて添付いたします。
よろしくお願いいたします。

ファイル ファイルの説明
gstlog.zip
IMG_5725.zip