*

GStreamer Tips #4 / Videomixer

   

GStreamer Tips : GStreamerに関わる忘備録
第四回目の今回は、映像混合(videomixer)表示について動作確認してみます。

前回、静止画像のオーバーレイ表示についてみていきました。
今回使用するelement を使用すれば、前回のようなオーバーレイも可能ですし、重ね合わせず表示することも可能になります。

使用実機(PC) : x86_64 Ubuntu 16.04.3 LTS
GStreamer Version : 1.12.3(2017/10時点のstable)

【Videomixer】
映像を混合させるといっても、色をまぜ合わせるわけではありません。 1ウィンドウに複数の映像を表示させることを意味します。
通常GStreamerでは Launch Line に入力ソースとなるelement(たとえば、filesrc element)を複数指定した場合、それぞれに対して出力エレメント(sink element)を指定することになりますが、この場合ウィンドウがそれぞれで表示されることになります。

export F1=/xxxx/lena512.png
export F2=/xxxx/AlphaPenguin.png  (ペンギン君 512×512 アルファ付き)
export F3=/xxxx/Penguin.png

gst-launch-1.0 -e \
videotestsrc ! video/x-raw,width=512,height=512 ! videoconvert ! ximagesink \
uridecodebin uri=file://$F1 ! imagefreeze ! videoconvert ! ximagesink \
uridecodebin uri=file://$F2 ! imagefreeze ! videoconvert ! ximagesink \
uridecodebin uri=file://$F3 ! imagefreeze ! videoconvert ! ximagesink

とすると

となり、4つのウィンドウが表示されます。

videomixer element は、それらを1ウィンドウにまとめてくれるelementとかんがえてよいでしょう。
では、さっそくやってみましょう。

export F1=/xxxx/lena512.png
export F2=/xxxx/AlphaPenguin.png
export F3=/xxxx/Penguin.png

gst-launch-1.0 -e \
videomixer background=1 name=mix \
sink_0::xpos=0     sink_0::ypos=0     sink_0::alpha=1 sink_0::zorder=0 \
sink_1::xpos=512 sink_1::ypos=0     sink_1::alpha=1 sink_1::zorder=1 \
sink_2::xpos=0     sink_2::ypos=512 sink_2::alpha=1 sink_2::zorder=2 \
sink_3::xpos=512 sink_3::ypos=512 sink_3::alpha=1 sink_3::zorder=3 \
! videoconvert ! ximagesink \
videotestsrc ! video/x-raw,width=512,height=512 ! mix.sink_0 \
uridecodebin uri=file://$F1 ! imagefreeze ! mix.sink_1 \
uridecodebin uri=file://$F2 ! imagefreeze ! mix.sink_2 \
uridecodebin uri=file://$F3 ! imagefreeze ! mix.sink_3

とすると

となり、1ウィンドウで4画像を表示することができることが確認できたと思います。
ところで、Videomixer element には、gst-inspect-1.0では見つけられないプロパティがあります。
Launch Line の ”sink_0::xpos=0 sink_0::ypos=0 sink_0::alpha=1 sink_0::zorder=0” 部分です。
xpos/ypos/alphaは、比較的容易にイメージできると思います。また ”sink_N” の数値Nは映像画像出力の番号です。
”sink_0::xpos=0” とは 0番目の画像(ここではvideotestsrcの)出力は、x軸位置を0 に指定していることになります。
zorderは、OpenGLの経験のあるかたはイメージできるとおもいますが、手前/奥を表現するz軸を表します。
この値が大きいほど手前に配置されます。(ただしOpenGLの様に手前のものは大きく、遠くのものは小さくとはなりません。)

試しに 左から右に半分重ねながら videotestsrc、アルファなしペンギン、lenaさん、アルファ付きペンギン としそのそれぞれのzorderを 0、1、2、3 とすると

export F1=/xxxx/lena512.png
export F2=/xxxx/AlphaPenguin.png
export F3=/xxxx/Penguin.png

gst-launch-1.0 -e \
videomixer background=1 name=mix \
sink_0::xpos=0     sink_0::ypos=0 sink_0::alpha=1 sink_0::zorder=0 \
sink_1::xpos=256 sink_1::ypos=0 sink_1::alpha=1 sink_1::zorder=1 \
sink_2::xpos=512 sink_2::ypos=0 sink_2::alpha=1 sink_2::zorder=2 \
sink_3::xpos=768 sink_3::ypos=0 sink_3::alpha=1 sink_3::zorder=3 \
! videoconvert ! ximagesink \
videotestsrc ! video/x-raw,width=512,height=512 ! mix.sink_0 \
uridecodebin uri=file://$F3 ! imagefreeze ! mix.sink_1 \
uridecodebin uri=file://$F1 ! imagefreeze ! mix.sink_2 \
uridecodebin uri=file://$F2 ! imagefreeze ! mix.sink_3

となり、重なり合いながら表示されていることがわかると思います。
ちなみに、zorderの値が同じ場合は、出力番号が大きい方が手前になります。
これらのプロパティを変化させることで、視覚効果を高めることができそうです。

今回はここまで。

 - 未分類