Использование ffmpeg на PythonAnywhere

Мое (первое) веб-приложение использует pydub, который зависит от ffmpeg. В моей локальной среде Windows я установил ffmpeg и добавил путь к исполняемым файлам ffmpeg в переменные среды Windows «путь».

Все это работает локально, но поклон, что я развернул свое приложение на PythonAnywhere, следующая строка в моем коде вызывает ошибку:

 sound.export(export_path, format = "mp3", bitrate = "128k")

Я считаю, что ошибка связана с тем, что этот код использует ffmpeg.

Я читал на их форумах, что ffmpeg установлен для всех пользователей PythonAnywhere. Есть ли что-то, что мне нужно сделать, чтобы заставить его работать? Нужно ли добавлять путь к файлам ffmpeg в переменные среды? У меня есть файл .env с другими переменными env — нужно ли мне что-то добавить к нему?

Вы можете попробовать включить пакет static-ffmpeg в свой venv. Этот пакет загружает двоичные файлы ffmpeg в папку venv site-packages. Итак, я подозреваю, что это будет работать на PythonAnywhere.

kesh 15.11.2022 17:32

Я установил пакет и добавил использование в свой views.py, но все равно получаю ту же ошибку. Может я что-то не так сделал?

ragmats 15.11.2022 17:54

Насколько я знаю, пакет не добавляет автоматически свои двоичные файлы ffmpeg в системный путь, когда вы используете его в программе Python. Существует недокументированная функция static_ffmpeg.add_paths(), которая загружает и добавляет двоичные файлы в путь. (Похоже, что владелец недавно добавил пакет.) Я настоятельно рекомендую просмотреть код в пакете (не большой репозиторий), чтобы лучше понять его самостоятельно.

kesh 15.11.2022 18:01

Я добавил «import static_ffmpeg», а затем «static_ffmpeg.add_paths()» в views.py, но, похоже, это ничего не изменило.

ragmats 15.11.2022 18:03

Когда я набираю «ffmpeg» в терминале PythonAnywhere, я получаю информацию о версии и конфигурации, поэтому кажется, что он установлен. Должно быть что-то еще, что мне нужно сделать, чтобы мой код правильно его использовал. Как уже упоминалось, он работал локально в Windows, где я установил ffmpeg и добавил его в переменную среды path. Я понятия не имею, как это сделать на PythonAnywhere.

ragmats 15.11.2022 18:16

Я не знаю, как работает PythonAnywhere, но вы можете попробовать напечатать os.environ['PATH'] в своей программе Python и сравнить его с $PATH в терминале, чтобы проверить, включен ли каталог ffmpeg в оба. (Я не могу сказать вам, что делать, если нет... но, по крайней мере, вы знаете, что делать дальше)

kesh 15.11.2022 18:21

Когда я печатаю os.environ['PATH'] из своего приложения, я получаю "/home/gridsquid/.local/bin:/usr/local/bin:/usr/bin:/bin". Когда я ввожу «$PATH» в терминал, я получаю: «bash: /home/gridsquid/.virtualenvs/myvirtualenv/bin:/home/gridsqui‌​d/.local/bin:/usr/lo‌​cal/julia- 1.6.1/bin:‌​/usr/lib/postgresql/‌​12/bin/:/home/gridsq‌​uid/.local/bin:/usr/‌​local/julia-1.6.1/bi‌​n :/usr/lib/postgresq‌​l/12/bin/:/usr/local‌​/sbin:/usr/local/bin‌​:/usr/sbin:/usr/bin:‌​/sbin:/bin: Нет такой файл или каталог». Я не уверен, что делать с этой информацией (извините, нуб здесь).

ragmats 15.11.2022 18:46

Кроме того, я получил этот ответ от PythonAnywhere: «Он установлен для всех пользователей и находится в пути». Итак, почему мой код не работает здесь, если он работает локально?

ragmats 15.11.2022 19:14

о, хорошо, значит, сервис поддерживает ffmpeg по умолчанию. мой плохой, я не предполагал, что. os.system('ffmpeg') работает?

kesh 15.11.2022 19:31
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
9
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вернулся домой и сам попробовал PythonAnywhere, и я не обнаружил никаких проблем с ним и его FFmpeg.

Ничего не устанавливая (ни FFmpeg, ни пакетов Python), я успешно запускаю REPL:

>>> os.system('ffmpeg')
[snipped ffmpeg banner]
>>> import pydub
>>> pydub.utils.get_encoder_name()
'ffmpeg'
>>> pydub.utils.get_prober_name()
'ffprobe'
>>> pydub.utils.get_supported_codecs()
[snipped a large list of FFmpeg codecs]

Итак, ваша проблема не в ffmpeg/pydub. Напишите точную ошибку. Может быть, вам не нравится сохранять файл в указанную вами директорию?

Ты прав. Я добавил более подробную информацию к моему решению ниже. Спасибо.

ragmats 16.11.2022 18:42

Проблема была не в ffmpeg, который, как я подтвердил, установлен для всех пользователей PythonAnywhere. Вместо этого моя проблема заключалась в пути экспорта, который я использовал с pydub. Я исправил свою проблему, изменив:

export_path = "media/my_path"

к

export_path = "home/my_app/my_app/media/my_path"

который затем используется в

sound.export(export_path, format = "mp3", bitrate = "128k")

Другие вопросы по теме