sg.motono
2018年3月27日 11時28分
いつもお世話になっております。本野と申します。
Armadillo-840にネットワークカメラを接続し、Gstreamerを用いて映像(H.264)の録画・再生動作の確認を行っています。
解像度最大1920x1080、フレームレート最大30fpsの録画再生を実現したいのですが
解像度を1920x1080に設定した場合、フレームレートを20fps以下に設定しないと
録画生成したファイルの再生ができません。
(これより大きいフレームレート設定の場合、デコードエラーが発生する)
テスト環境
HW: Armadillo-840
FW: squashfs-a800-firmware-v3.02.img
フレームワーク:
gstreamer-1.6.2
gst-plugins-base-1.6.2
gst-plugins-good-1.6.2
gst-plugins-bad-1.6.2
gst-plugins-at-acm_1.0.2
結果
以下のようなコマンド実行で録画ファイルの再生に失敗します。
#準備(映像領域を表示しておく)
echo 0 > /sys/class/graphics/fb1/blank
#録画
gst-launch-1.0 -e rtspsrc 'location=rtsp://ID:PASSWORD@IPアドレス:ポート番号/onvif/profile2/media.smp' latency=2000 ! rtph264depay ! video/x-h264, framerate=30/1 ! h264parse config-interval=1 ! splitmuxsink max-size-time=120000000000 location=test%05d.mp4 muxer=mp4mux
#再生
gst-launch-1.0 filesrc 'location=test00000.mp4' ! qtdemux ! acmh264dec stride=1024 ! videoscale add-borders=TRUE ! video/x-raw, width=1024, height=576, framerate=30/1 ! acmfbdevsink device=/dev/fb1
#エラーメッセージ
ERROR: from element /GstPipeline:pipeline0/GstAcmH264Dec:acmh264dec0: ストリームをデコードできません 追加のデバッグ情報: gstacmh264dec.c(1470): gst_acm_h264_dec_handle_frame (): /GstPipeline:pipeline0/GstAcmH264Dec:acmh264dec0: could not dequeue buffer. 5 (入力/出力エラーです) ERROR: pipeline doesn't want to preroll.
この件に関しまして、問題原因の切り分け、もしくは対処法についてご教授頂けないでしょうか。
何卒よろしくお願い申し上げます。
コメント
sg.motono
> acmh264decはスケーリングする機能を持っています。caps( video/x-raw,....という節)
> が設定されていれば、出力はそれにあわせて拡縮されるためvideoscaleは必要ありません。
>
> また、acmfbdevsinkは、acmh264dec用にdma転送可能なバッファを提供する
> ので間にvideoscaleを入れるとフレームがmemcpyされてCPUが無駄に動作するので、
> そういった意味でもvideoscaleは入れない方が良いです。
>
> ただ、videoscaleを入れてもエラーはしないとは思うのですが、
> この使い方は、想定していなかったのでvideoscaleを外して発生の有無を
> 確認してみてください。
videoscaleについてですが、映像を全画面に表示させるのではなく、
画面内の一部領域に描画を行いたいため意図的に使用しております。
videoscaleを外すと以下のようなエラーメッセージが表示されます。
#再生
gst-launch-1.0 filesrc 'location=test00000.mp4' ! qtdemux ! acmh264dec stride=1024 ! video/x-raw, width=1024, height=576 ! acmfbdevsink device=/dev/fb1
#エラーメッセージ
ERROR: from element /GstPipeline:pipeline0/GstQTDemux:qtdemux0: GStreamer 上で一般的なストリームエラーが起きました 追加のデバッグ情報: qtdemux.c(5319): gst_qtdemux_loop (): /GstPipeline:pipeline0/GstQTDemux:qtdemux0: streaming stopped, reason not-linked ERROR: pipeline doesn't want to preroll. Setting pipeline to NULL ... Freeing pipeline ...
at_kojiro.yamada
> videoscaleについてですが、映像を全画面に表示させるのではなく、
> 画面内の一部領域に描画を行いたいため意図的に使用しております。
>
> videoscaleを外すと以下のようなエラーメッセージが表示されます。
> #再生
>
> gst-launch-1.0 filesrc 'location=test00000.mp4' ! > qtdemux ! acmh264dec stride=1024 ! video/x-raw, width=1024, height=576 ! > acmfbdevsink device=/dev/fb1 >
Armadillo-840の標準イメージでは、
ほぼ同じパイプラインで動画のスケーリングおよび再生できており、
エラーメッセージは表示されませんでした。
逆に、 videoscale を acmh264dec と acmfbdevsink の間に入れると
エラーとなり再生できません。(後述)
■acmh264decエレメントでスケーリング
ハードウェアは、Armadillo-840 液晶モデル開発セット
ソフトウェアは
Linuxカーネル: http://download.atmark-techno.com/armadillo-840/image/linux-a840-v1.21…
ユーザーランド: http://download.atmark-techno.com/armadillo-840/image/romfs-a840-v1.14…
gstreamer:
gstreamer-1.0.8
gst-plugins-base-1.0.8
gst-plugins-good-1.0.8
gst-plugins-bad-1.0.8
gst-plugins-at-acm_1.0.2
動画: http://download.atmark-techno.com/sample/bbb/big-buck-bunny-30sec-fullh…
です。
コマンドは以下のとおりです。
[A840]# gst-launch-1.0 filesrc \ location=/mnt/big-buck-bunny-30sec-fullhd.mp4 ! \ qtdemux ! acmh264dec stride=800 ! \ video/x-raw, width=800, height=480 ! \ acmfbdevsink device=/dev/fb1
※動画ファイルをSDカードに入れて/mntにマウントしています。
※LCDに表示したので、stride, width, heightはLCDの解像度に合わせています。
■videoscaleのエレメントでスケーリング
環境は「acmh264decエレメントでスケーリング」と同じです。
コマンドとエラーメッセージは以下のとおりです。
[A840]# gst-launch-1.0 filesrc \ location=/mnt/big-buck-bunny-30sec-fullhd.mp4 ! \ qtdemux ! acmh264dec ! \ videoscale add-borders=TRUE ! \ video/x-raw, width=800, height=480 ! \ acmfbdevsink device=/dev/fb1 Setting pipeline to PAUSED ... Pipeline is PREROLLING ... ERROR: from element /GstPipeline:pipeline0/GstAcmH264Dec:acmh264dec0: Could not decode stream. Additional debug info: gstacmh264dec.c(2345): gst_acm_h264_dec_handle_out_frame (): /GstPipeline:pipeli ne0/GstAcmH264Dec:acmh264dec0: failed gst_video_decoder_finish_frame() ERROR: pipeline doesn't want to preroll. Setting pipeline to NULL ... Freeing pipeline ...
sg.motono
> ■acmh264decエレメントでスケーリング
>
> ハードウェアは、Armadillo-840 液晶モデル開発セット
(中略)
> 動画: http://download.atmark-techno.com/sample/bbb/big-buck-bunny-30sec-fullh…
リンク先の動画についてはこちらの環境でも再生できました。
#big-buck-bunny-30sec-fullhd.mp4の再生 ⇒ 再生可能
gst-launch-1.0 filesrc 'location=big-buck-bunny-30sec-fullhd.mp4' ! qtdemux ! acmh264dec stride=1024 ! videoscale add-borders=TRUE ! video/x-raw, width=1024, height=576 ! acmfbdevsink device=/dev/fb1
しかし、ネットワークカメラからgstremerで録画作成した映像では
引き続きエラーが発生します。
#サンプル動画(test00000.mp4)の再生 ⇒ 再生不可能(エラーメッセージが表示されます)
gst-launch-1.0 filesrc 'location=test00000.mp4' ! qtdemux ! acmh264dec stride=1024 ! videoscale add-borders=TRUE ! video/x-raw, width=1024, height=576 ! acmfbdevsink device=/dev/fb1
エラーメッセージが発生するサンプル動画を下記リンク先にアップロードしましたのでご確認頂けないでしょうか。
https://1drv.ms/u/s!AhQRPZxyOdT6gSgk1aoT_NBCLEQ9
よろしくお願い致します。
at_kojiro.yamada
> https://1drv.ms/u/s!AhQRPZxyOdT6gSgk1aoT_NBCLEQ9
上記動画は、Armadillo-840製品マニュアルに記載されている
AVコーデックミドルウェア H.264/AVCデコーダー仕様[1]
を満たしていないようです。
AVコーデックミドルウェア H.264/AVCデコーダー仕様をご確認いただき、
エンコード設定を変更していただくようお願いいたします。
[1] Armadillo-840製品マニュアル(現状の最新バージョン)
https://manual.atmark-techno.com/armadillo-840/armadillo-840_product_ma…
以下は推測ですが、
1080p 30fps の動画は、Maximum bit rateが40Mbpsを超えていたた
めに、再生できなかったのではないかと思います。
また、Format profileもHigh@L5.1となっており、仕様を満たしていませんの
で正常には動作しないと思います。
sg.motono
at_kojiro.yamada
at_kojiro.yamada
> Armadillo-840にネットワークカメラを接続し、Gstreamerを用いて映像(H.264)の録画・再生動作の確認を行っています。
> 解像度最大1920x1080、フレームレート最大30fpsの録画再生を実現したいのですが
> 解像度を1920x1080に設定した場合、フレームレートを20fps以下に設定しないと
> 録画生成したファイルの再生ができません。
> (これより大きいフレームレート設定の場合、デコードエラーが発生する)
念のため確認なのですが、デコードしようとしている映像はインターレースの1080 30fpsである可能性はないでしょうか?
Armadillo-840 製品マニュアル(下記URL)に記載されているとおり、AVコーデックミドルウェアは
「インタレースシーケンスの場合、30fpsの場合画像サイズ1440x1080まで、画像サイズ1920x1080であれば20fpsまで」となっております。
https://manual.atmark-techno.com/armadillo-840/armadillo-840_product_ma…
sg.motono
at_ohsawa
2018年3月30日 14時20分
> #再生
>
acmh264decはスケーリングする機能を持っています。caps( video/x-raw,....という節)
が設定されていれば、出力はそれにあわせて拡縮されるためvideoscaleは必要ありません。
また、acmfbdevsinkは、acmh264dec用にdma転送可能なバッファを提供する
ので間にvideoscaleを入れるとフレームがmemcpyされてCPUが無駄に動作するので、
そういった意味でもvideoscaleは入れない方が良いです。
ただ、videoscaleを入れてもエラーはしないとは思うのですが、
この使い方は、想定していなかったのでvideoscaleを外して発生の有無を
確認してみてください。
> #エラーメッセージ
>
>
> この件に関しまして、問題原因の切り分け、もしくは対処法についてご教授頂けないでしょうか。
> 何卒よろしくお願い申し上げます。
>
>
>
>