无法使用auto-py-to-exe包含ffmpeg.exe

1 投票
1 回答
50 浏览
提问于 2025-04-14 15:49

我正在尝试为我的PyQT应用程序生成一个exe文件,这个应用程序使用了auto-py-to-exe来打包。

在这个应用程序中,有一些地方调用了ffmpeg作为操作系统命令(比如 'ffmpeg -i file ... output')。因为我在我的电脑上安装了ffmpeg,并且它可以通过Windows的路径访问,所以当我在自己的电脑上运行这个exe文件时,没有任何问题。

但是,如果是其他没有安装ffmpeg的人,他们就会遇到一个错误,提示类似于“'ffmpeg' 不是内部或外部命令,也不是可运行的程序或批处理文件”。

我不想把ffmpeg放在应用程序的文件夹里,因为我调用的本地模块已经在使用ffmpeg作为操作系统命令。

我首先尝试将ffmpeg.exe作为文件添加(这是在一个StackOverflow帖子中推荐的),然后尝试作为二进制文件,但都没有成功。autopytoexe

我已经尝试了这个配置。

有没有人能帮我解决这个问题?

编辑 N°2

结果发现,当我在自己的电脑上导出exe文件并将ffmpeg作为二进制文件包含时,无论是使用pyinstaller还是auto-py-to-exe,最终的exe文件都无法识别ffmpeg命令,即使它在文件夹里。

__internal folder

不过,我在另一台机器上尝试了相同的配置,结果没有任何错误。

我还尝试安装了另一个版本的ffmpeg,并将这个版本链接到最终的exe文件,但也没有成功。

1 个回答

0

对我有帮助的回答可以在 这里 找到。我把 ffmpeg.exe 放到了根目录的二进制文件里,并且把它作为额外文件添加到了根目录。

--add-data "D:/sdw/ffmpeg/ffmpeg.exe;." --add-binary "D:/sdw/ffmpeg/ffmpeg.exe;."  

然后在代码中,你需要用绝对路径来调用 ffmpeg -i... 的内容,就像上面回答中强调的那样。

def resource_path(relative_path):
""" Get absolute path to resource, works for dev and for PyInstaller """
    try:
    # PyInstaller creates a temp folder and stores path in _MEIPASS
        base_path = sys._MEIPASS
    except Exception:
        base_path = os.path.abspath(".")

    return os.path.join(base_path, relative_path)

所以 subprocess.run 的用法大概是这样的:

subprocess.run(resource_path('ffmpeg -i .... ')

这对我来说是有效的,不过我只是个新手,在做一个小项目,所以希望这至少能给你指个方向。

撰写回答