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=233 y=24 w=$((x + 800 -1)) h=$((y + 480 -1)) gst-launch-1.0 -e \ ximagesrc display-name=:1 show-pointer=false startx=${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 でデータ送ってワイヤレスプロジェクタでも作るか…?
ネットを徘徊していたらゲームのミニマップをサブディスプレイに拡大表示している例があった。なるほど、そういう使い道もあるのか!