Как использовать Heroku buildpack ffmpeg для Python? - PullRequest
0 голосов
/ 28 сентября 2019

Я хочу использовать пакет сборки ffmpeg в моем приложении Python на Heroku.
Я использую пакет сборки ffmpeg из https://github.com/jonathanong/heroku-buildpack-ffmpeg-latest.

Как я могу использовать buildpack?подпроцессу?Операционные системы?Как позвонить в ffmpeg?Кто-нибудь может научить меня?

Это мой код, и я хочу конвертировать mp4 файл в mp3 файл.На самом деле, я не знаю о файле обнаружения / компиляции / выпуска.

   subprocess.call(['ffmpeg', '-i', 'xxx.mp4','-vn','-f mp3', 'xxx.mp3'])
   subprocess.call(['ffmpeg', '-i', 'xxx.mp4','-vn','-f mp3', 'xxx.mp3'])

1 Ответ

0 голосов
/ 29 сентября 2019

Прежде всего, я предполагаю, что вы уже знаете, как развернуть приложение 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.

...