Raspberry Pi 4+VNCでカメラのプレビューがめっさ遅い!ので対処してみた
前回、カメラモジュールをRaspberry Pi 4に取り付けて、デバイスを認識させてプレビューまでしてみました:
起動してカメラの映像がラズパイのデスクトップに出て「わ~い」と喜んだのですが、次にVNCでWindowsからリモートアクセスで画面を見たら、静止画かよって思うくらい画面の更新が滅茶苦茶遅いんです。0.5FPSくらいww。壊れたのかなと慌ててラズパイにHDMIケーブルをつなぎ直接モニターで見たら、あれ?ちゃんと普通にプレビューしてる…。
つまりVNC経由で見た時にのみ使い物にならないくらい描画更新が遅い事がわかりました。カメラの更新が遅いんじゃなくて、VNCに転送される頻度が遅いという事…。何でだ…?しかもこれ、カメラの映像だけでなくブラウザのChromiumも死ぬ程遅い。VNC経由だとYouTubeもまともに見られません。
今回は、VNCを使っていて同様の症状が出た方の一助になればと思い、対策方法の一つを紹介致します。
原因の一つはHDMIにあるみたい
調査すると色々原因と思われる物があるようですが、HDMI周りが怪しいという話が多い印象でした。確かにHDMIをラズパイに接続してモニターで直接見れば正常なのに、VNC経由だとNG。怪しい…
boot/config.txtでHDMI関連の設定を変更
最終的に改善出来た方法です。ラズパイのデバイス設定ファイルであるboot/config.txtにHDMI関連の設定を追加・変更するとVNC経由でも更新頻度が落ちず、ChromiumでYouTube動画もスムーズに閲覧できるようになりました。
まずboot/config.txtを管理者権限でテキストエディタで開きます。config.txtは管理者じゃないと編集と保存できないためです。エディタは何でも良いのですが、ラズパイに付属のGeanyを使うと楽です。Geanyを管理者権限で開くにはターミナルを経由します:
sudo geany
上のコマンドを叩けばOK。起動したGeanyからboot/config.txtを開けば編集と保存が出来ます。
hdmi_force_hotplugを有効にしてHDMIのホットプラグに対応
config.txtをあまり触っていない方であれば、20行目辺りに以下の記述があるはずです:
![](https://assets.st-note.com/img/1680301183203-1FGK8FdeGb.png?width=1200)
OSの初期値では上の「hdmi_force_hotplug=1」の前に「#」が入っていると思います。この文頭の#はコメント文、つまりフラグを設定していない状態を意味します。まずこの「hdmi_force_hotplug=1」の文頭にある#を削除して、このフラグを有効化します。
hdmi_force_hotplugというのは、HDMIケーブルを挿した時にモニターが即反応する、いわゆる「ホットプラグ」の機能の事です。これを=1で有効にすると、ラズパイがHDMIのモニターを検出できなくてもHDMI出力し続けるようになるため、起動後でもHDMIケーブルをラズパイに挿してモニター表示できるようになります。
ただし、この設定をするとリフレッシュレート等も設定しないと画面が乱れたり表示が正しく行われなくなる事があるようです。そのためそれらの設定もconfig.txtに記載します。
hdmi_groupを有効化して変更
同じconfig.txtの24行目辺りにhdmi-groupというのがあると思います:
![](https://assets.st-note.com/img/1680301879734-DGywh80ujf.png?width=1200)
こちらもデフォルトでコメントアウトされていますが、これを有効にして、値を2に変更します。
hdmi_groupというのはHDMI接続されたモニターの種類を指定するフラグです。0だと自動検出ですが、今回の僕のケースでは「接続しているHDMIモニターがPC用のモニター(DMT: Display Monitor Timing)」である事が確定しているため、DMTを表す2を指定しました。大抵皆さんもPCモニターですよね。ちなみに1だとCEA(Consumer Electronics Association)というTV用のHDMIモニターになるそうです。
今回はVNC経由でPCモニターで見るという事なので2を指定しました。
hdmi_modeを有効化して変更
同じく25行目辺りにあるhdmi_modeも有効化します。上の設定例では85に設定してあります。
hdmi_modeはラズパイのHDMIの画面サイズとリフレッシュレートの組み合わせを指定するフラグです。設定できる数値は先のhdmi_groupの設定を1(CEA)にしたか2(DMT)にしたかで変わりますので注意して下さい。各数字に対する画面サイズとリフレッシュレートの対応表はRaspberry Piのリファレンスの「The config.txt file」にあります:
この中のhdmi_modeの項を検索で探して下さい。そこにずらーーっと並んでいるのが対応表です。目がくらんで選択に悩むかもしれませんが、まずVNCの画面に表示したいサイズを決めて、次にそこそこなリフレッシュレートで絞ればOKです。
僕の設定値は85です。groupは2(DMT)なので、その欄を見ると、
![](https://assets.st-note.com/img/1680303461237-nTPHwkVHT5.png?width=1200)
1280×720でリフレッシュレートが60Hzです。別に理由があるわけではありません。まぁ、この辺りじゃね?っていうくらいの感覚です。絶対85じゃないといけないわけでもないので、お使いのモニターに合わせて数値を決めて下さい。
以上の3項目を有効化して保存したら、ラズパイを再起動しましょう。これで設定が反映されるはずです。
カメラの表示更新が改善
上記の設定で再起動後にVNCでラズパイに接続し、Windows越しにデスクトップ画面を表示させます。そして、カメラをテスト起動してみましょう:
libcamera-hello -t 20000
20秒間カメラを起動します。おそらく、先のconfig.txtの結果が反映されて、カメラの表示更新がある程度改善したのではないでしょうか?僕の場合はカメラの更新頻度と同程度のFPSになりました。最初が0.5FPSくらいだったのですから雲泥の差です。
またChromiumの動画表示なども正常になりました。まともに表示更新すらされなかったYouTubeもちゃんと見られましたw。
最後に
と言う事で、VNC経由での激重描画をHDMIの設定により改善してみました。何故これで改善するか、その理由は正直定かではありません(-_-;。巷にある色々な情報を調査して、色々試した結果でしかない事をご了承頂ければと思います。
ではまた(^-^)/