🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
PyInstaller

PyInstallerは、Pythonのスクリプトを一括でWindowsなどで動く実行可能ファイルに変換できるツールです。このツールを用いることで自作のPythonプログラムを別で使用する場合でもPythonをインストールする必要がありません。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

FFmpeg

FFmpegは、動画と音声を交換できるフリーソフトウェアです。UNIX系OSから派生した、MS-DOSから操作するコマンドラインツールです。libavcodecやlibavformat、libswscale、libavfilterなどを含みます。ライセンスは、コンパイルの際のオプションによりLGPLもしくはGPLに決定されます。対応コーデックや使用できるオプションが多く、幅広く利用されています。

Q&A

解決済

1回答

2626閲覧

ffmpeg実行時に「dyld: Library not loaded: @loader_path/libavdevice.58.dylib」というエラーが出てしまう

tomtakeru

総合スコア4

PyInstaller

PyInstallerは、Pythonのスクリプトを一括でWindowsなどで動く実行可能ファイルに変換できるツールです。このツールを用いることで自作のPythonプログラムを別で使用する場合でもPythonをインストールする必要がありません。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

FFmpeg

FFmpegは、動画と音声を交換できるフリーソフトウェアです。UNIX系OSから派生した、MS-DOSから操作するコマンドラインツールです。libavcodecやlibavformat、libswscale、libavfilterなどを含みます。ライセンスは、コンパイルの際のオプションによりLGPLもしくはGPLに決定されます。対応コーデックや使用できるオプションが多く、幅広く利用されています。

0グッド

0クリップ

投稿2021/01/19 07:27

編集2021/01/21 12:26

/usr/local/bin/ffmpegをUSBにコピーし、そのUSBをffmpegのインストールされていないPCに差し込んで、ffmpegを実行すると以下のようなエラーが発生します。どのようにすれば実行できるでしょうか?

console

1$ USB_path/ffmpeg -i sample.mp4 2dyld: Library not loaded: @loader_path/libavdevice.58.dylib 3 Referenced from: USB_path/ffmpeg 4 Reason: image not found

ちなみに実際に実現したいのは、subprocessモジュールを用いてffmpegを利用するPythonファイルをPyInstallerで単一実行ファイルにして配布することです。

###調べたこと

  • エラーの内容を調べたところ、拡張子.dylibはダイナミックライブラリのことで、プログラムなどの実行時に必要に応じてロードされる、複数のアプリケーションが共有するライブラリでした。

現在、どうやってロードするのかを調べています。

  • 自分のPCのコンソールでffmpegを実行すると(以下)、libavdeviceや58というバージョンらしき数字が出力されているのが確認できました。

console

1$ ffmpeg 2ffmpeg version 4.3.1 Copyright (c) 2000-2020 the FFmpeg developers 3 built with Apple clang version 12.0.0 (clang-1200.0.32.28) 4 configuration: --prefix=/usr/local/Cellar/ffmpeg/4.3.1_9 --enable-shared --enable-pthreads --enable-version3 --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librtmp --enable-libspeex --enable-libsoxr --enable-videotoolbox --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack 5 libavutil 56. 51.100 / 56. 51.100 6 libavcodec 58. 91.100 / 58. 91.100 7 libavformat 58. 45.100 / 58. 45.100 8 libavdevice 58. 10.100 / 58. 10.100 #この行 9 libavfilter 7. 85.100 / 7. 85.100 10 libavresample 4. 0. 0 / 4. 0. 0 11 libswscale 5. 7.100 / 5. 7.100 12 libswresample 3. 7.100 / 3. 7.100 13 libpostproc 55. 7.100 / 55. 7.100 14Hyper fast Audio and Video encoder 15usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}... 16 17Use -h to get full help or, even better, run 'man ffmpeg'

現在、どうやってこのlibavdevice.dylibをロードしているのかを調べています。
###環境
ffmpegダウンロード済みのPC:
macOS Catalina
バージョン10.15.7
機種MacBook Pro

ffmpeg未ダウンロードのPC:
macOS High Sierra
バージョン10.13.6
機種MacBook Pro

ffmpeg 4.3.1_9

(2021/1/19 16:00)

新しいエラー(2021/1/20 10:30追記)

console

1$ ffmpeg 2dyld: lazy symbol binding failed: Symbol not found: ____chkstk_darwin 3 Referenced from: /Volumes/ToyMemory/videdi.app/Contents/MacOS/libavutil.56.dylib (which was built for Mac OS X 10.15) 4 Expected in: /usr/lib/libSystem.B.dylib 5 6dyld: Symbol not found: ____chkstk_darwin 7 Referenced from: /Volumes/ToyMemory/videdi.app/Contents/MacOS/libavutil.56.dylib (which was built for Mac OS X 10.15) 8 Expected in: /usr/lib/libSystem.B.dylib

「which was built for Mac OS X 10.15」というエラー内容から考えて、High Sierra 10.13.6では実行は難しいのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

--add-binary オプションでバイナリを含めることが出来ます。
Using Spec Files — PyInstaller 4.2 documentation

しかし ffmpeg のライセンスは複雑ですので配布する場合はよくライセンスをお読みになってからのほうがよいと思います。
FFmpeg License and Legal Considerations

投稿2021/01/19 07:49

A_kirisaki

総合スコア2853

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tomtakeru

2021/01/19 09:43 編集

コメントしていただきありがとうございます。 私の場合、.specファイルに以下のようなコードを書いてPyInstallerによりffmpegとffproveをバンドルしています。 a = Analysis(['myapp.py'], pathex=['/Users/user/Desktop/myapp'], binaries=[['/usr/local/bin/ffmpeg', '.'], ['/usr/local/bin/ffprobe', '.']], ・・・以下略 ffmpegのバイナリコードはパッケージの中を覗くと入っているのですが、pythonのsubprocessで実行すると質問の内容のようなエラーが出てしまい、コンソールでパスを指定して実行してみても同様です。必要であれば.specファイルの全文を追記します! ffmpegのライセンスについては、いただいたURLの内容を確認させていただきます。ご指摘していただきありがとうございます。
A_kirisaki

2021/01/19 09:53

関連する dylib 全てを含めないと動かないかと思います。どの dylib が必要かは Mac であれば otool -L ffmpeg で調べられるらしいです。自分のマシンで試す分にはライセンス無用なのでやってみると良いんじゃないんでしょうか。ワイルドカード使えたら一気に登録できてラッキーっぽいですね(Linux はそんなことなかった)。
tomtakeru

2021/01/19 10:05

返信ありがとうございます。 その方法で解決を目指したいと思います。 知識が乏しいため、もし可能でしたら教えていただきたいのですが、ffmpegのようなdylibの必要とするバイナリファイルはどこからそのdylibファイルを探しているのでしょうか?
A_kirisaki

2021/01/19 10:18

バイナリ実行ファイルというのはソースコードをコンパイルして作られるわけですが、そのコンパイルの際に「こういう名前の共有ライブラリを使うよ」と名前だけ伝えておきます。そしてコンパイルすると実行バイナリにその名前が記載されます。 いざ実行する時 OS はその名前のライブラリがないかを決められた手順に沿ってディレクトリを探していきます。そして見つかったらその共有ライブラリのバイナリと持ってきた実行バイナリを合体させて真の実行できるバイナリをメモリ上に作り出します。 大雑把ですがこんな感じで実行ファイルというのは実行されているのです。
tomtakeru

2021/01/19 10:44 編集

ご返信ありがとうございます。 バイナリ実行ファイルの共有ライブラリ利用の流れがなんとなくわかりました!ありがとうございます。 試しにエラーとなっている共有ライブラリも一緒にバンドルしてコマンドを実行したところ、違うファイルに関してのエラーに変わりました!他のファイルもバンドルしていけばエラーは解消できそうです! 図々しくて申し訳ないのですがワイルドカードだとエラーがでてしまいまして、何か楽な良い方法をご存知でしたらご教授願いたいです。 そしてもう一つお聞きしたいのが、/usr/local/Cellar/ffmpeg/4.3.1_9/lib/ディレクトリのffmpeg固有のライブラリ以外の共有ライブラリは、もとからどんなPCにも入っているものなのでしょか?その場合、バンドルしなくても良いのでしょうか?
A_kirisaki

2021/01/19 10:53

PyInstaller そんなに詳しくないのでワイルドカード以外何かあるか、ちょっとドキュメント見ないとわからないですね……。この辺が参考になるかもしれないです。 https://pyinstaller.readthedocs.io/en/stable/spec-files.html#adding-binary-files ffmpeg 以外の共有ライブラリについては「ものによる」と「Mac はわからん!」の二つですね。ただ普通なら PyInstaller さんがおそらくいい感じにパックしてくれるはずなので気にしなくても良い気がします。
tomtakeru

2021/01/20 01:33 編集

以下のようにすれば、ワイルドカード使えました! ['/usr/local/opt/*/lib/*.dylib', '.'] しかしまだエラーが出てしまいます。エラーを質問に追記させていただきます。
A_kirisaki

2021/01/20 10:32

それやっちゃうと今度は余計なライブラリまでひっついていっちゃうんですよね……。実行バイナリ巨大なサイズになってませんか?あと標準で使ってる Mac のライブラリとかも古いやつをパッケージしてしまうので追記のエラーが出るんだと思います。 ちなみに確認し忘れたんですけど --onefile オプションって試したんですよね?
tomtakeru

2021/01/21 12:41 編集

巨大になってました・・・。なのでひとつずつ調べてspecファイルのbinariesに追加していきました。ですがやはり、追記した新しいエラーが最終的に出てしまいました。なので、他のMacOS 10.15のPCで試したところ、実行できたのでMacOSの問題でした。MacOS 10.13で起動できないのは、おそらくエラーに出ているMacOS 10.15用の共有ライブラリが原因ではないかなと思っていますが、今回はスルーしようと思います。 PyInstallerのオプションに関してですが、--onefileなしでまとめていたので--onefileありにして、実行ファイルの実行時に他のbinariesファイルを一時的なフォルダに展開するようにして、アプリのサイズを小さくすることができました。ですが、最初のエラーはやはり出てしまうので--onefileオプションをつける場合でも、共有ライブラリは自動で読み込めないようです。https://pyinstaller.readthedocs.io/en/stable/runtime-information.html#run-time-informationこちらのページに--onefileオプション設定時の一時的なフォルダのパスについての記述がありました。 たくさん教えてくださり、ありがとうございました!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問