Armadilloフォーラム

Armadillo-840でH264動画のGStreamerによるポーズ・フェードアウトについて

tfusion

2014年3月24日 14時32分

お世話になります。

Armadillo-840でH264動画のGStreamerによるポーズ・フェードアウトについて御教授頂けたら幸いです。

(1) H264の動画を再生するGStreamerのAPIを使用したプログラムを作成したのですが、
動画を再生中、
gst_element_set_state(pipeline, GST_STATE_PAUSED);を呼び出してポーズ状態にしたところ、
画面の表示が消えてしまいます。
画面に表示させたままポーズ状態にする方法はないでしょうか?

その後でgst_element_set_state(pipeline, GST_STATE_PLAYING);を呼び出すと再度表示されて再生を再開するので、
GStreamerの再生状態→ポーズ状態→再生状態の状態遷移はできているようです。

なお、パイプラインのacmh264dec ! acmfbdevsinkの部分をavdec_h264 ! videoconvert ! ximagesinkに変更した同じプログラムをATDE5上で実行した場合は表示を保ったままポーズできました。

(2) 動画再生を、画面を暗くフェードアウトしながら停止する方法はないでしょうか?

以下の方法を試してみましたがうまくいきませんでした。

・alphaプラグインを使用すればできるかもしれないと思いacmh264dec ! acmfbdevsinkの間にalphaを入れてみましたがパイプラインが成立しませんでした。

[root@armadillo840-0 (pts/0) ~]# gst-launch-1.0 -v filesrc location=/root/big-buck-bunny-30sec-800x480.mp4 ! qtdemux name=demux0 demux0.audio_0 ! queue ! acmaacdec ! audioresample ! audio/x-raw,rate=48000,channels=2 ! alsasink device=hw:0 demux0.video_0 ! queue ! acmh264dec ! alpha ! acmfbdevsink device=/dev/fb0
WARNING: erroneous pipeline: could not link alpha0 to acmfbdevsink0

・QtのQGraphicsOpacityEffectとQPropertyAnimationを使用して真っ黒な画像をフェードインで表示させて画面を上書きしようと考えましたが、GStreamerの再生中にQtの描画を上書きすることができませんでした。

  QPixmap pixmap(m_screenWidth, m_screenHeight);
  pixmap.fill(Qt::black);
  m_screen.setPixmap(pixmap);
  m_screen.setGraphicsEffect(&m_effect);
  m_animation.setTargetObject(&m_effect);
  m_animation.setPropertyName("opacity");
  m_animation.setDuration(1000);
  m_animation.setStartValue(0);
  m_animation.setEndValue(1);
  m_animation.start(QAbstractAnimation::KeepWhenStopped);
コメント

tfusion

2014年3月28日 11時53分

お世話になります。

自己解決しました。

gst-plugins-at-acm_1.0.0.tar.gzに入っていたacmfbdevsinkのソースgstacmfbdevsink.cを見ると
ポーズと停止の際にdo_blank_screen関数でフレームバッファをmemsetでクリアしている箇所があったので、
クリアしないようにしました。
(1)はそれだけで解決しました。
(2)は再生停止後にフレームバッファを直接読み出しQImageに変換して、QGraphicsOpacityEffectとQPropertyAnimationを使って実現することができました。