python - 如何为 Python 使用 Heroku buildpack ffmpeg?

标签 python heroku ffmpeg buildpack

我想在 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'])

最佳答案

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

你应该得到相同的subprocess.run output 作为你使用 heroku run 时得到的输出.

关于python - 如何为 Python 使用 Heroku buildpack ffmpeg?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58146519/

相关文章:

python - 缓存和内存使用

PHP MYSQL 查询日期和时间字段之间的数据 HEROKU

ruby-on-rails-3 - heroku 推送失败,错误为 "An error occurred while installing sqlite3-ruby (1.2.5)"

c# - 在C#中将音频和视频文件与FFMPEG合并

ffmpeg - 将特定(看似有效)GIF 转换为 mp4 时图像高度无效

video - 使用 FFmpeg 从图像创建流畅的视频幻灯片

python - 对角线(之字形)遍历坐标的索引

python - 释放另一个进程占用的资源

python - 使用正则表达式搜索字符串列表以查找子字符串 Python

ruby-on-rails - 在 5 分钟内将 Radiant 部署到 Heroku 导致管理员权限错误