Прежде всего, я предполагаю, что вы уже знаете, как развернуть приложение Python в Heroku, и у вас уже есть работающее приложение, доступное из Heroku, поскольку этот ответ относится только к как использовать пакет сборки ffmpeg .(Если вы этого еще не сделали, сначала отметьте Начало работы в Heroku с Python ).
Шаг 1. Добавление пакета сборки ffmpeg
Buildpacks в основном рассказывает Heroku, как настроить среду для вашего приложения (какие зависимости устанавливать, какие сценарии запускать и т. д.).Для приложений Python вам нужен официальный heroku / python buildpack, и вы можете проверить это с помощью:
$ heroku buildpacks
=== ginomempin-ffmpeg-app Buildpack URL
heroku/python
Чтобы добавить другие зависимости ( ffmpeg )вам нужно установить пакет сборки для него в приложении Heroku (например, https://github.com/jonathanong/heroku-buildpack-ffmpeg-latest). Из документации Heroku на Добавление пакета сборки , это делается с помощью heroku buildpacks:add <buildpack>
:
$ heroku buildpacks:add --index 2 https://github.com/jonathanong/heroku-buildpack-ffmpeg-latest.git
Buildpack added. Next release on ginomempin-ffmpeg-app will use:
1. heroku/python
2. https://github.com/jonathanong/heroku-buildpack-ffmpeg-latest.git
Run git push heroku master to create a new release using these buildpacks.
$ heroku buildpacks
=== ginomempin-ffmpeg-app Buildpack URLs
1. heroku/python
2. https://github.com/jonathanong/heroku-buildpack-ffmpeg-latest.git
Обратите внимание на --index 2
в моем примере. Это просто для заказа пакетов сборки, сначала Python, так как это основной пакет сборки, а затем ffmpeg. Это зависит от вашего приложения.
Теперь протестируйте еговнеся изменения в свой код, затем разверните его (т. е. git push heroku master
). В журналах Heroku должно отображаться, что теперь добавлен сборочный пакет:
remote: -----> Python app detected
remote: -----> Installing requirements with pip
remote:
remote: -----> ffmpeg app detected
remote: -----> Install ffmpeg
remote: DOWNLOAD_URL = https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-amd64-static.tar.xz
remote: exporting PATH
Шаг 2. Проверка сборочного пакета ffmpeg
Использованиекоманда heroku run
, чтобы проверить, как использовать установленный ffmpeg . Для этого примера приложения я поместил тестовый файл assets / sample.mp4 в корневой каталогкаталог моего приложения.
├── app.py
├── assets
│ └── sample.mp4
├── ...
└── runtime.txt
$ heroku run "which ffmpeg"
Running which ffmpeg on ⬢ ginomempin-ffmpeg-app... up, run.7460 (Free)
/app/vendor/ffmpeg/ffmpeg
$ heroku run "ffmpeg -i assets/sample.mp4 -vn -f mp3 assets/sample.mp3"
...
Output #0, mp3, to 'assets/sample.mp3':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
...
Как только вы теперь знаете, как выполнить команду ffmpegs (и это работает), все, что вам нужно сделать, это вызвать тот же набор команд из вашего приложения.Обратите внимание, что вам не нужно менять каталоги (как вы делали с исходным кодом ) или укажите путь к ffmpeg
.
Шаг 3: Вызов ffmpeg из приложения Python
Использование Python subprocess
для вызова тех же команд:
cmd = ['ffmpeg', '-i', './assets/sample.mp4', '-vn', '-f', 'mp3', './assets/sample.mp3']
out = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
print(out.stdout)
print(out.stderr)
for f in os.listdir("./assets"):
print(f)
Убедитесь, что выразделите все разделенные пробелами части команды на отдельный элемент в списке .Затем вы можете проверить вывод, используя heroku logs --tail
(по какой-то причине вывод ffmpeg сохраняется в stderr
вместо stdout
):
2019-09-29T11:54:57.050692+00:00 app[web.1]: b''
2019-09-29T11:54:57.050736+00:00 app[web.1]: b"ffmpeg version N-50091-gfc20ba9e04-static https://johnvansickle.com/ffmpeg/
...
Output #0, mp3, to './assets/sample.mp3':\n
Metadata:\n
major_brand : isom\n
minor_version : 512\n
compatible_brands: isomiso2avc1mp41\n
TSSE : Lavf58.33.100\n
...
2019-09-29T11:54:57.050809+00:00 app[web.1]: sample.mp4
2019-09-29T11:54:57.050815+00:00 app[web.1]: sample.mp3
Вы должны получитьтот же вывод subprocess.run
, что и вывод, полученный при использовании heroku run
.