首页 > 解决方案 > 使用 cx_freeze 编译时找不到 ffmpeg 可执行文件

问题描述

我从一个代码构建了一个可执行文件ffmpy,我用cx_freeze. 正如预期的那样,它可以在我的 PC 上运行,我认为这是因为我已经ffmpeg在我的 Windows 上安装了它。

但是,我需要这个编译后的代码可以在任何 PC 上工作,而不仅仅是ffmpeg安装在哪里。

当我运行可执行文件时,ffmpy错误显示,Executable "ffmpeg" not found.

这是我setup.py的 for cx_freeze。这setup.py适用于我想要编译的任何东西,除了在哪里ffmpeg使用。

import sys
from cx_Freeze import setup, Executable
from cx_Freeze import setup
from distutils.core import Extension
import os   

os.environ['TCL_LIBRARY'] = r'C:\Users\Acer\Miniconda3\envs\updated\tcl\tcl8.6'
os.environ['TK_LIBRARY'] = r'C:\Users\Acer\Miniconda3\envs\updated\tcl\tk8.6'


addtional_mods = ['numpy.core._methods', 'numpy.lib.format']
setup(
      name = 'programm',
      version = '5.0.1',
      description = 'PyQt',
      options = {'build_exe': {'includes': addtional_mods}},
      executables = [Executable('ffmpy_test.py', base = "Win32GUI")])

我的问题是,我的ffmpy_test.py可执行文件如何ffmpeg.exe在编译目录中找到。我试图将 ffmpeg 目录放在那里,但这没有用。

这是我编译的测试代码:

from ffmpy import FFmpeg

ff = FFmpeg(inputs={'input.wmv': None}, outputs={'output.mp4': None})
ff.cmd
'ffmpeg -i input.ts output.mp4'
ff.run() 

标签: pythonffmpegcx-freezeffmpy

解决方案


此导入语句:from ffmpy import FFmpeg在我的 python 代码中FFmpegffmpy模块导入类。该类查找安装在我的 Windows 上的ffmpeg.exeon C:/ffmpeg/bin/ffmpeg.exeffmpeg

受@l'L'l 评论的启发,我研究了如何在模块的类中ffmpeg导入。FFmpegffmpy

ffmpy模块中:

class FFmpeg(object):
    """Wrapper for various `FFmpeg <https://www.ffmpeg.org/>`_ related applications (ffmpeg,
    ffprobe).
    """

    def __init__(self, executable='ffmpeg', global_options=None, inputs=None, outputs=None):
        ...

因此,我需要更改executable参数中的路径,以便将导入语句指向ffmpeg我手动放置在代码所在目录中的目录。

但是,我在代码中修改了executable参数的默认值,而不是在ffmpy模块中,如下所示:

from ffmpy import FFmpeg
import os
d = os.getcwd()
ff = FFmpeg(executable=d+'/ffmpeg/bin/ffmpeg.exe',inputs={'input.wmv': None}, outputs={'output.mp4': None})
ff.cmd
'ffmpeg -i input.wmv output.mp4'
ff.run()

推荐阅读