如何使用Heroku buildpack ffmpeg for Python?

2024-10-03 15:33:20 发布

您现在位置:Python中文网/ 问答频道 /正文

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

Tags: 文件httpsgithubcom应用程序herokucallmp3
1条回答
网友
1楼 · 发布于 2024-10-03 15:33:20

首先,我假设您已经知道如何将Python应用程序部署到Heroku,并且您已经有了一个可以从Heroku访问的工作应用程序,因为这个答案是针对如何使用ffmpeg buildpack的。(如果还没有,请先检查Getting Started on Heroku with Python)。你知道吗

步骤1:添加ffmpeg构建包

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

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

要添加其他依赖项(ffmpeg),您需要在Heroku应用程序(例如https://github.com/jonathanong/heroku-buildpack-ffmpeg-latest)上为其安装buildpack。在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。这只是为了订购buildpacks,Python首先是主buildpack,其次是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 buildpack

使用^{}命令检查如何使用已安装的ffmpeg。对于这个示例应用程序,我推了一个资产/示例.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的^{}调用相同的命令:

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)

确保将命令中所有空格分隔的部分分隔到列表中的一个单独元素中。然后可以使用^{}检查输出(出于某种原因,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输出。你知道吗

相关问题 更多 >