mattintosh note

どこかのエンジニアモドキの備忘録

Raspberry Pi で GStreamer を使って艦これをフルHDで楽しむ

GStreamer で画面の一部を切り取って拡大したものを他の領域に表示させる方法色々。

ここ最近、GStreamer を弄ってて、RTMP 配信はできるようになったけど、画面全体は必要ないよなぁ、と。調べてみたら ximagesrc にはクロッピングオプションがあるようなのでこれを使って Flash の部分だけを切り取ってみる。

Raspberry Pi 3 で動かしている艦これは VNC サーバ上で起動しているのでディスプレイ番号は :1 にしている。艦これの表示領域は 800x480 なのでこれをちょいちょい動かして最適な場所を startxstarty で指定する。endxendy はそれぞれの数値に 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 のプレイバックオーディオを録音することはできたのであとは用途か。

ximagesinkxvimagesink は他のマシンのディスプレイも使えるようなので ximagesrc も恐らく他のマシンのディスプレイに接続できるはず。ということはノート PC でゲームをプレイしつつ、エンコードとストリーミング配信は Raspberry Pi にやらせることもできそうだ。音声は PulseAudio で拾ってくればなんとかなるだろう。

うーん、Raspberry Pi をプロジェクタに接続して Wi-Fi でデータ送ってワイヤレスプロジェクタでも作るか…?


ネットを徘徊していたらゲームのミニマップをサブディスプレイに拡大表示している例があった。なるほど、そういう使い道もあるのか!