如何使用 Heroku buildpack ffmpeg for Python?



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

如何使用构建包? 子流程? 操作系统?如何称呼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'])

首先,我假设你已经知道如何将Python应用程序部署到Heroku,并且你已经有一个可以从Heroku访问的工作应用程序,因为这个答案是特定于如何使用ffmpeg构建包的。(如果您还没有,请先查看 Heroku 与 Python 入门(。

步骤 1:添加 ffmpeg 构建包

构建包基本上告诉 Heroku 如何为您的应用程序设置环境(要安装哪些依赖项,要运行哪些脚本等(。对于 Python 应用程序,您需要拥有官方的 heroku/python 构建包,您可以通过以下方式进行检查:

$ 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
...

一旦你现在知道如何运行你的ffmpeg命令(并且它有效(,你所要做的就是从你的应用程序中调用同一组命令。 请注意,您不需要更改目录(就像您对初始代码所做的那样(或指定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)

确保将命令的所有空格分隔部分分隔到列表中的单独元素中。然后您可以使用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     : isomn  
minor_version   : 512n  
compatible_brands: isomiso2avc1mp41n    
TSSE            : Lavf58.33.100n   
...
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输出。

最新更新