如何为 Python 使用 Heroku buildpack ffmpeg?

How to use the Heroku buildpack ffmpeg for Python?

我想在 Heroku 上的 Python 应用程序中使用 ffmpeg buildpack。
我正在使用来自 https://github.com/jonathanong/heroku-buildpack-ffmpeg-latest.

的 ffmpeg buildpack

如何使用buildpack?子进程? os?如何调用ffmpeg? 谁能教教我?

这是我的代码,我想将 mp4 文件转换为 mp3 文件。 实际上,我不知道 detect/compile/release 文件。

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

首先,我假设您已经知道如何将 Python 应用程序部署到 Heroku,并且您已经有一个可从 Heroku 访问的可用应用程序,因为此答案特定于 如何使用ffmpeg buildpack。 (如果您还没有,请先检查 Getting Started on Heroku with Python)。

第 1 步:添加 ffmpeg buildpack

Buildpacks basically tell Heroku how to setup the environment for your app (which dependencies to install, which scripts to run, etc.). For Python apps, you need to have the official heroku/python buildpack,您可以通过以下方式查看:

$ heroku buildpacks
=== ginomempin-ffmpeg-app Buildpack URL
heroku/python

要添加其他依赖项 (ffmpeg),您需要在 Heroku 应用程序上为其安装构建包(例如 https://github.com/jonathanong/heroku-buildpack-ffmpeg-latest). From the Heroku docs on Adding a buildpack,这是通过 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 buildpack

使用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
    ...

一旦您现在知道如何 运行 您的 ffmpeg 命令(并且它有效),您所要做的就是从您的应用程序调用同一组命令。请注意,您不需要更改目录(就像您对 initial code 所做的那样)或指定 ffmpeg.

第 3 步:从 Python 应用程序调用 ffmpeg

使用 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)

确保将命令的所有 space 分隔部分分隔到列表 中的单独元素中。然后您可以使用 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

您应该得到与使用 heroku run.

时相同的 subprocess.run 输出