在分布式系统中使用ffmpeg -- python

时间:2024-03-24 18:14:15

ffmpeg是常用的用来处理视频的工具,它的功能非常强大,包含了丰富的音视频处理接口,如视频格式转换,音视频分离、添加水印等。出于效率上的考虑,ffmpeg是基于c编写的,所以在使用之前通常需要编译安装。想要在分布式集群上面用ffmpeg,需要在每台机器上安装ffmpeg或者用预先编译好的包。本文将详细介绍如何在分布式集群上使用预先编译好的ffmpeg包。

1、imageio-ffmpeg自动下载ffmpeg可执行文件

     如果你在python中调用ffmpeg功能,可以使用imageio,imageio包含一个imageio-ffmpeg库(https://github.com/imageio/imageio-ffmpeg)。 imageio-ffmpeg是ffmpeg的python封装。在使用imageio-ffmpeg操作视频时,如果检测到当前系统没有安装ffmpeg,会自动下载已经编译好的ffmpeg二进制可执行文件。不过这个可执行文件大约有30M,整个下载的过程会耗费较多的时间。

2、拷贝ffmpeg可执行文件到执行路径

     如果分布式集群被限制无法访问外网,或者无法接受下载ffmpeg可执行文件的耗时,是否有更好的方法?一种解决办法是把可执行文件放在运行脚本中。ffmpeg可执行文件的下载地址:https://github.com/imageio/imageio-binaries/tree/master/ffmpeg在分布式系统中使用ffmpeg -- python
     下载合适的可执行文件,与运行的python脚本放在一起。在分布式集群上执行脚本的时候先把ffmpeg可执行文件拷贝到imageio-ffmpeg下载并存储ffmpeg可执行文件的目录。imageio-ffmpeg通过下面这段代码自动下载ffmpeg可执行文件到本地:

imageio.plugins.ffmpeg.download()
def download():
    """ Download the ffmpeg exe to your computer.
    """
    plat = get_platform()
    if not (plat and plat in FNAME_PER_PLATFORM):
        raise RuntimeError("FFMPEG exe isn't available for platform %s" % plat)
    get_remote_file('ffmpeg/' + FNAME_PER_PLATFORM[plat])

通过跟踪这段代码就可以知道ffmpeg可执行文件的具体下载位置。

3、修改imageio-ffmpeg获取ffmpeg exe的代码

      另一种方法是替换imageio-ffmpeg获取ffmpeg exe的脚本,site-packages/imageio/plugins/ffmpeg.py。该脚本的get_exe() 会找到ffmpeg可执行文件,并返回可执行文件的绝对路径。