如何为 Python 使用 Heroku buildpack ffmpeg?
Posted
技术标签:
【中文标题】如何为 Python 使用 Heroku buildpack ffmpeg?【英文标题】:How to use the Heroku buildpack ffmpeg for Python? 【发布时间】:2020-01-28 11:40:55 【问题描述】:我想在 Heroku 上的 Python 应用程序中使用 ffmpeg buildpack。 我正在使用来自https://github.com/jonathanong/heroku-buildpack-ffmpeg-latest 的 ffmpeg buildpack。
如何使用 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'])
【问题讨论】:
@GinoMempin 如何使用 buildpack 是 import 还是 chdir 或任何可能的方式?你能给出一个示例代码吗?谢谢! 您是否按照Usage 的说明进行操作? 【参考方案1】:首先,我假设您已经知道如何将 Python 应用程序部署到 Heroku,并且您已经有一个可以从 Heroku 访问的工作应用程序,因为这个答案是特定于如何使用 ffmpeg buildpack。 (如果您还没有,请先查看Getting Started on Heroku with Python)。
第 1 步:添加 ffmpeg 构建包
Buildpacks 基本上告诉 Heroku 如何为您的应用设置环境(要安装哪些依赖项,要运行哪些脚本等)。对于 Python 应用,您需要有官方的 heroku/python buildpack,您可以通过以下方式查看:
$ heroku buildpacks
=== ginomempin-ffmpeg-app Buildpack URL
heroku/python
要添加其他依赖项(ffmpeg),您需要在您的 Heroku 应用程序上安装它的 buildpack(例如 https://github.com/jonathanong/heroku-buildpack-ffmpeg-latest)。来自Adding a buildpack 上的 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 日志应该显示 buildpack 现在已添加:
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 命令(并且它有效),您所要做的就是从您的应用程序中调用相同的命令集。请注意,您不需要更改目录(就像您对 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)
确保将命令的所有以空格分隔的部分分隔到列表中的单独元素中。然后您可以使用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
输出。
【讨论】:
以上是关于如何为 Python 使用 Heroku buildpack ffmpeg?的主要内容,如果未能解决你的问题,请参考以下文章
如何为从 Google Domains 到 Heroku 的裸域设置 SSL?
如何为以下设置安装 SSL(React 前端 + Nodejs 后端 + 自定义域 Heroku)