GStreamer で画面の一部を切り取って拡大したものを他の領域に表示させる方法色々。
Raspberry Piでgst-launchのfbdevsink使ってフルHDで艦これやってみたけどなかなかいいぞ…!#RaspberryPi#GStreamer#艦隊これくしょん#艦これpic.twitter.com/f98bjkj9nG
— mattintosh4 (@mattintosh4) 2016年10月1日
ここ最近、GStreamer を弄ってて、RTMP配信はできるようになったけど、画面全体は必要ないよなぁ、と。調べてみたら ximagesrc
にはクロッピングオプションがあるようなのでこれを使って Flashの部分だけを切り取ってみる。
Raspberry Pi 3 で動かしている艦これは VNCサーバ上で起動しているのでディスプレイ番号は :1
にしている。艦これの表示領域は 800x480 なのでこれをちょいちょい動かして最適な場所を startx
、starty
で指定する。endx
と endy
はそれぞれの数値に Flashの表示領域分を足したものを指定する。
Raspberry Piではフレームバッファデバイスが使えるので fbdevsink
を使えば X が起動していなくても画面に表示させることができる。sync=true
だと遅くなるのでここは sync=false
にしておく。多少のコマ落ちは仕方ない。
x=233y=24w=$((x + 800-1))h=$((y + 480-1)) gst-launch-1.0 -e\ ximagesrc display-name=:1 show-pointer=falsestartx=${x}starty=${y}endx=${w}endy=${h}\ ! videoconvert ! videoscale ! video/x-raw, framerate=25/1, width=1920, height=1080, pixel-aspect-ratio=1/1, method=lanczos \ ! fbdevsink sync=false
そうするとこうなる。記事先頭の写真のような状態になる。
さすがに直接文字を表示しているわけではないので Android版ほど綺麗ではないけど、23 inch くらいのディスプレイなら少し離れればそれほど気にならない。
画像は pngenc
で取得したもの。
で、操作はどうしてるかっていうと普通の PC から VNCで弄ってるんだな…。ブラウザの拡大機能使えばいいやん…ってなるんだけど。
とりあえず Raspberry Pi単体でクロップと H.264への変換、ALSAのプレイバックオーディオを録音することはできたのであとは用途か。
ximagesink
や xvimagesink
は他のマシンのディスプレイも使えるようなので ximagesrc
も恐らく他のマシンのディスプレイに接続できるはず。ということはノート PC でゲームをプレイしつつ、エンコードとストリーミング配信は Raspberry Piにやらせることもできそうだ。音声は PulseAudio で拾ってくればなんとかなるだろう。
うーん、Raspberry Piをプロジェクタに接続して Wi-Fiでデータ送ってワイヤレスプロジェクタでも作るか…?
ネットを徘徊していたらゲームのミニマップをサブディスプレイに拡大表示している例があった。なるほど、そういう使い道もあるのか!