Ubuntu 24.04.3 LTSのアプリセンターからインストールしたProcessing 4.xx.xxでWebカメラから画像を取り込もうとすると以下のようなエラーが出て正常に動作しない。一方で、以前のProcessing 3では問題なく動作している。やっと何が原因で、どうすればうまく動くのかがわかったのでメモしておく。
Processing 4のエラーメッセージは以下の通り。
(process:26237): libsoup-ERROR **: 15:24:36.396: libsoup3 symbols detected. Using libsoup2 and libsoup3 in the same process is not supported.
Could not run the sketch (Target VM failed to initialize).
For more information, read Help → Troubleshooting.
ライブラリのlibsoup2とlibsoup3がコンフリクトを起こしているようだった。修正方法がわからず、とりあえずProcessing 3では動いているのでProcessing 3を使っていた。
/usr/libの下にはlibsoup2もlibsoup3も入っているので、きっとライブラリのリンク先がまちがっているんだろう、と思っていた。ふと、確かにまちがえているわけだが、本当に参照しているlibsoupのライブラリはどこにあるんだろうと思った。たしかProcessingのライブラリは、ターゲットのLinuxだけではなくMacやWindowsなどもライブラリをまるごと抱えていたな、と思い出した。
そこでProcessingのライブラリのディレクトリで次のコマンドを実行してみた。
$ find . -name 'libsoup*'
./video/library/linux-amd64/libsoup-2.4.so
./video/library/linux-amd64/libsoup-2.4.so.1
./video/library/linux-amd64/libsoup-2.4.so.1.11.1
./video/library/linux-amd64/libsoup-gnome-2.4.so
./video/library/linux-amd64/libsoup-gnome-2.4.so.1
./video/library/linux-amd64/libsoup-gnome-2.4.so.1.11.1
./video/library/macos-aarch64/libsoup-2.4.1.dylib
./video/library/macos-x86_64/libsoup-2.4.1.dylib
Ubuntuのシステムに入っているライブラリをみているのではなく、ProcessingのVideoライブラリ “Video Library for Processing 4 / GStreamer-based video library for Processing. by The Processing Foundation” が用意しているバイナリのライブラリを参照しているということに気づいた。また、大量に出ているエラーの中に次のようなメッセージもみつけた。
(省略)/libraries/video/library/linux-amd64/libavresample.so: ファイルが小さすぎます
(省略)/libraries/video/library/linux-amd64/libavresample.so: ファイルが小さすぎます
libavutil.so.56: 共有オブジェクトファイルを開けません: そのようなファイルやディレクトリはありません
(省略)/libraries/video/library/linux-amd64/libmp3lame.so: ファイルが小さすぎます
(省略)/libraries/video/library/linux-amd64/libmp3lame.so: ファイルが小さすぎます
(省略)/libraries/video/library/linux-amd64/libmp3lame.so.0: ファイルが小さすぎます
致命的なエラーにはなっていないが、そもそもlinux-amd64以下に用意しているバイナリー形式のライブラリがUbuntu標準のライブラリとの不整合を発生させているのだ。これで理由はわかった。
Pythonでも同じようなコードを書いていて、問題なく動作しているので、自分が使っているUbuntuには開発に必要なこの周りのライブラリはぜんぶ揃っているはずである。わざわざProcessingのローカルを参照しているバイナリなど必要がない。そこでバッサリとlinux-amd64ディレクトリを消した。ついでに使わないmacos-aarch64、macos-x86_64、windows-amd64以下も大量のバイナリのライブラリを含んでいるので、これもディレクトリごとバッサリと消した。
Processing 4でVideoを使うプログラムを動かしたら、何のエラーも出さずにWebカメラからの画像取り込みは動作した。しばらく放置していた問題はこれで解決した。とりあえずメモとして残す。