文書の過去の版を表示しています。
macOS Catalina以降のvideoライブラリ利用
macOSはCatalina(10.15)以降は32bit動作のアプリケーション及びライブラリが動作しなくなりました。それに伴いProcessingのvideoライブラリを動作させるためには、少し工夫が必要になりました。Processingのjavaモードでどうしてもvideoライブラリを動作させないと行けないんだという方に向けた内容です。このような状況では授業でvideoライブラリを使うのは割けた方がいいです。どうしても使いたいのなら p5js で授業をしたほうがよいです。以下、動作までのまとめ情報。
同様の問題はすでにgithub上で議論されています。以下がそのissueスレッドです。
いろいろ議論されているので、どこを同対応すればよいか基本的には全部読んだ方がよいです。私の環境(macOS 10.15, Processing 3.5.4)では下記の対応をすることで、動作を確認しました。
ポイントとしては
- video ライブラリを64bit 対応のbeta版に入れ替える
- macOS側のセキュリティ設定を行う(←これが厄介でした)
の2つをそれぞれ対応する。というだけなのですが、少しトリッキーですね。以下に解決法を日本語で手短にまとめておきます。
解決方法
まずは、書類/Processing/Libraries/video のフォルダを [[https://github.com/processing/processing-video/releases/tag/r6-v2.0-beta4]]のベータ最新版と入れ替える。
ちなみにmacOSでは日本語環境だと、書類というフォルダ名ですが、実体はDocumentsというフォルダ名であることを注意してください。terminalで利用するときは Documentsとなります。
次にターミナルで~/Documents/processing/libraries/video/library/macosx に行き、次のコマンドを実行します。
$ xattr -p com.apple.quarantine libavcodec.58.35.100.dylib
すると 00c1;5dc1bfaa;Chrome;78F18F7D-3F71-4E55-8D58-BAB946AB4707 という文字列が帰ってきます。これは実行環境によって微妙に変わるようですが、最初の4文字が00c1でない場合は、そこだけ00c1に変更してください。その後下記をターミナルで実行しますが、その際 STRING 部分は上記の文字列で読み替えてください。
$ xattr -w com.apple.quarantine "STRING" *.dylib $ cd gstreamer-1.0 $ xattr -w com.apple.quarantine "STRING" *.dylib
ここまででライブラリの準備は終わりです。では次にmacOS側のセキュリティ設定を修正します。ひょっとすると現状までの準備で動作する人がいるかも知れません。その人はすでに過去Processingを利用していて、カメラのセキュリティ設定が適切になされている場合になります。私の環境もそうでしたが、ここまでの修正だけでは実行時にエラーがでてしまいました。それはmacOS側でProcessingがカメラを利用することを許可していないのが原因です。そこであとは「設定」→「セキュリティとプライバシー」→「プライバシー」→「カメラ」をクリックすると出てくるカメラ利用許可一覧にProcessingが入ればよいです。ただし3.5.4を利用してカメラ動作のサンプルを実行しても、「カメラの使用を許可しますか?」ダイアログがでることなく、そのままプログラムが終了してしまいます。通常はこのダイアログボックスにユーザが許可をだすことで、macOSのプライバシー設定に自動で反映されるのですが、そこがProcessingとmacOS側で連携が取れていません。
ただしこれはProcessingをGUI操作で実行した場合に起こるようで、terminalから直接Processingを起動すると、ちゃんとダイアログボックスが表示されます。つまり手順としては、
- Processingを一旦終了
- terminal で Processing/Contents/MacOS に移動して、次のようにProcessingを実行する。
- $ ./Processing
- 新規スケッチファイルの中に下記のプログラムをコピーして実行する
import processing.video.*; Capture cam; void setup() { size(640, 480); String[] cameras = Capture.list(); if (cameras.length == 0) { println("There are no cameras available for capture."); exit(); } else { println("Available cameras:"); for (int i = 0; i < cameras.length; i++) { println(cameras[i]); } // The camera can be initialized directly using an // element from the array returned by list(): cam = new Capture(this, 320,240, cameras[0] ); cam.start(); } } void draw() { if (cam.available() == true) { cam.read(); } image(cam, 0, 0); // The following does the same, and is faster when just drawing the image // without any additional resizing, transformations, or tint. //set(0, 0, cam); }
以上で、カメラの許可ダイアログが表示されると思います。これを許可してあげると自動でセキュリティ設定にもProcessingが追加されるのを確認してください。以降は通常のGUI操作でProcessingを起動しても問題はありません。
以上。