Armadilloフォーラム

gstreamerを使って画面をキャプチャしたい

nishioka

2023年3月15日 11時53分

gstreamerを使って画面をキャプチャしたいのですが、撮った画像が乱れて保存さてしまいます。

実行手順&結果:
・コンテナにgstreamerをダウンロード

apt install -y gstreamer1.0-imx gstreamer1.0-plugins-bad gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-imx gstreamer1.0-x libgstreamer-gl1.0-0 libgstreamer-imx libgstreamer-plugins-bad1.0-0 libgstreamer-plugins-base1.0-0 libgstreamer1.0-0 gstreamer1.0-tools gstreamer1.0-imx-tools

・ 作成したコンテナをもとにソフトの開発を行い、Armadilloで起動。
・ Armadilloで以下コードを実行

gst-launch-1.0 -e multifilesrc location=/dev/fb0 num-buffers=1 ! "video/x-raw,width=800,height=600,format=BGRx,framerate=1/1" ! videoconvert ! jpegenc ! filesink location=/mnt/USBDevice/capture.jpg

・ 添付画像のように、撮った画像が乱れて保存されてる。
・width=1920,height=1080 のサイズで指定したときは問題なく保存されていました。

別で解像度の設定が必要なのでしょうか。
以上、よろしくお願いいたします。

ファイル ファイルの説明
800x600.jpg
コメント

キャプチャする対象の画面はwestonを起動してGUI表示しているものでしょうか。
GPU支援を使って描画している場合fbには書き込んでいないので、どのように
起動したアプリケーションをキャプチャしようとしているか教えてもらえますか?

ありがとうございます。

> キャプチャする対象の画面はwestonを起動してGUI表示しているものでしょうか。
> GPU支援を使って描画している場合fbには書き込んでいないので、どのように
> 起動したアプリケーションをキャプチャしようとしているか教えてもらえますか?

QT_QPA_PLATFORM=linuxfb

を使ってフレームバッファに直接描画しているものをキャプチャしようとしています。

的外れの質問かもしれませんが、以前に"EDIDの固定方法"を教えていただき無事ディスプレイに800x600の解像度で表示させることができたのですが、

/sys/class/graphics/fb0/virtual_size
1024,768

と表示されており、この"virtual_size"が関係しているのでしょうか。

的外れでしたら申し訳ありません。以上、よろしくお願いいたします。

EDID固定方法
https://armadillo.atmark-techno.com/forum/armadillo/14580

申し訳ありません。
>width=1920,height=1080 のサイズで指定したときは問題なく保存されていました。

と書きましたが、width=1024,height=768の間違いです。

以上、よろしくお願いいたします。

> 的外れの質問かもしれませんが、以前に"EDIDの固定方法"を教えていただき無事ディスプレイに800x600の解像度で表示させることができたのですが、
>

> /sys/class/graphics/fb0/virtual_size
> 1024,768
> 

> と表示されており、この"virtual_size"が関係しているのでしょうか。

いえ、正しい推測です。
1024x768という情報を踏まえて、添付されている画像のピクセルを、
横幅1024で配置しなおして見ると右側が224pixが黒で塗りつぶされた
(元の画像の背景が黒なので背景が続いて見えますが)ブランクのある
グラフ表示のようなグリッドを備えたUIが見えます。

なのでブロックデバイスの/dev/fb0としては横幅1024でアクセスする
ように設定されています。

Westonであればすぐわかるのですが、fbは通常サポートしていないので、
方法を考えてみます。

溝渕です。

Armadillo-IoT G4のグラフィックスはDRM実装になっています。

標準で2つ(HDMI/LVDS)あるグラフィックスは、DRMのcardが同じである為、フレームバッファアクセスをする場合のデバイスファイル(/dev/fb0)も共通になります。

virtual_sizeが、1024x768に見えるのは、LVDSの画面サイズが1024x768である為です。

以上より、フレームバッファ経由ではなく、DRMを適切に扱う事のできるウィンドウマネージャ経由でアクセスする事が好ましいです。

例えば、weston(Wayland のコンポジタ)を利用する場合は、次のように解像度を指定してHDMIにのみ描画することが可能です。

https://manual.atmark-techno.com/armadillo-iot-g4/armadillo-iotg-g4_pro…

どうしてもframebufferからアクセスしたい場合は、"arch/arm64/boot/dts/freescale/armadillo_iotg_g4.dts"からlvds(ldb含む)のノードを削除すると、恐らく意図した動作となると思います。

at_ohsawa 様
溝渕 様

> どうしてもframebufferからアクセスしたい場合は、"arch/arm64/boot/dts/freescale/armadillo_iotg_g4.dts"からlvds(ldb含む)のノードを削除すると、恐らく意図した動作となると思います。

上記を試したところ、意図した動作になりました。ありがとうございます。

> Armadillo-IoT G4のグラフィックスはDRM実装になっています。
>
> 標準で2つ(HDMI/LVDS)あるグラフィックスは、DRMのcardが同じである為、フレームバッファアクセスをする場合のデバイスファイル(/dev/fb0)も共通になります。
>
> virtual_sizeが、1024x768に見えるのは、LVDSの画面サイズが1024x768である為です。
>
> 以上より、フレームバッファ経由ではなく、DRMを適切に扱う事のできるウィンドウマネージャ経由でアクセスする事が好ましいです。
>
> 例えば、weston(Wayland のコンポジタ)を利用する場合は、次のように解像度を指定してHDMIにのみ描画することが可能です。
> https://manual.atmark-techno.com/armadillo-iot-g4/armadillo-iotg-g4_pro…

勉強になります。時間があるときにでも試してみたいと思います。