質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
87.20%
PyInstaller

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

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

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

FFmpeg

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

解決済

PyIlnstallerによって単一実行ファイル化したアプリケーションでpydubを利用したい

tomtakeru
tomtakeru

総合スコア4

PyInstaller

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

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

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

FFmpeg

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

2回答

0リアクション

0クリップ

731閲覧

投稿2020/12/06 06:40

編集2020/12/09 02:21

前提・実現したいこと

TkInterを用いてGUIを表示するPythonファイル(myapp.py)をPyInstallerによって単一実行ファイル(myapp.app)にしました。そのmyapp.pyでPydubを利用しようとしましたが、エラーがログに出力されました。

発生している問題・エラーメッセージ

[Error 2]No such file or directory: 'ffprobe': 'ffprobe'

myapp.py内でのPydubのコード

Python

segument = pydub.AudioSegment.from_file(file_path)

試したこと①

myapp.py内でffmpegやffprobeをsubprocessモジュールを用いて実行しているので、PyInstallerでこれらのファイルをmyapp.appにバンドルしています。そのためmyapp.app/Contents/MacOS/内にffmpegやffprobeのバイナリファイルがあります。そこでこれらのファイルパスをPydubに教えることで解消できるのではないかと考えました。

PudubのGitHub
pydubをgitで確認すると、以下のような記述がありました。

pydub/audio_segment.py

class AudioSegment(object): # --略-- converter = get_encoder_name() # either ffmpeg or avconv # --略--

pydub/utils.py

# --略-- def get_encoder_name(): """ Return enconder default application for system, either avconv or ffmpeg """ if which("avconv"): return "avconv" elif which("ffmpeg"): return "ffmpeg" else: # should raise exception warn("Couldn't find ffmpeg or avconv - defaulting to ffmpeg, but may not work", RuntimeWarning) return "ffmpeg" # --略--

そこでpydub.AudioSegmentクラスのconverterを設定してあげれば良いと考え、先述したコードの前に次のコードを追加しましたが、同じエラーが表示され解決できませんでした。(APP_PATHはmyapp.appのパスの文字列)

pydub.AudioSegment.converter = APP_PATH + '/Contents/MacOS/ffmpeg' # 追加 segument = pydub.AudioSegment.from_file(file_path)

また、pydub/audio_segment.pyのAudioSegmentクラス内に次のようなメソッドがありましたが、使い方がわかりませんでした。

pydub/audio_segment.py

class AudioSegment(object): #--略-- # TODO: remove in 1.0 release # maintain backwards compatibility for ffmpeg attr (now called converter) @classproperty def ffmpeg(cls): return cls.converter @ffmpeg.setter def ffmpeg(cls, val): cls.converter = val # --略--

試したこと②

sys.path.appendを用いてpydubにffmpegやffprobeのパスを教えようとしましたが、同じエラーが表示され、解決できませんでした。

sys.path.append(APP_PATH + '/Contents/MacOS/ffmpeg') sys.path.append(APP_PATH + '/Contents/MacOS/ffprobe')

環境

MacOS 10.15.7

Python 3.6
PyInstaller 3.6
FFmpeg 4.3.1
Pydub 0.24.1

(追記)回答してくださった方のアドバイスを聞いて試したこと

確認事項

  1. tkinterなしで問題は再現しますか
  2. pyinstallerを使わない場合に問題が再現するのか
  3. converterのファイルパスの確認

1・2の確認事項

  • tkinterなしpyinstallerなし→正常
  • tkinterありpyinstallerなし→正常
  • tkinterなしpyinstallerあり→正常?
  • tkinterありpyinstallerあり→今回のエラー

このようになったのですが、tkinterなしpyinstallerありでの確認に関しては、実際の状況と全く同じ状況を作れませんでした。このエラーが出る前に単一実行ファイルを作る際のエラーが出ていました。その解決に用いた方法がtkinterなしだとエラーが出ます。

そのため次のコマンドのように実行した結果、正常に動きました。

tkinterなしpyinstallerありでのpyinstallerのコマンドとその実行

console

pyinstaller --windowed audio_play_test.py open dist/audio_play_test/audio/audio_play_test

audio_play_test.py

python

import sounddevice import pydub import time import numpy video_path = "/---/sample.mp4" segment = pydub.AudioSegment.from_file(video_path) samples = numpy.array(segment.get_array_of_samples().tolist(),dtype="int16").reshape(-1,segment.channels) sounddevice.play(samples, segment.frame_rate) time.sleep(30)

ここまで試した時点でかなり時間がたってしまい、締め切りも迫っていることから根本的な解決を諦め、違う方法をとることにしました。もともと動画ファイルの音声を再生することが目的であったため、subprocessでffmpegを実行し、waveファイルを作成してsinmpleaudioで再生することで実装しました。解答していただいた方には申し訳ないのですが、また時間のある時にこの問題の解決に取り組みたいと思います。

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

PyInstaller

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

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

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

FFmpeg

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