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を使って実現することができました。