You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将ffmpeg嵌入PyInstaller打包的音视频Python脚本EXE文件?

解决PyInstaller打包时嵌入ffmpeg的有效方案

核心思路

将ffmpeg二进制文件打包进EXE,运行时自动解压到临时目录,脚本动态调用解压后的ffmpeg路径,无需用户单独下载。


步骤1:准备ffmpeg二进制文件

  • 下载对应Windows系统的ffmpeg静态编译包(需与你的Python环境位数一致:32位/64位),提取出ffmpeg.exe,放在Python脚本的同级目录下。

步骤2:修改Python脚本,动态获取ffmpeg路径

脚本中不能写死ffmpeg路径,需适配开发环境和打包后的环境:

import sys
import os

def get_ffmpeg_path():
    # 打包后,PyInstaller会将资源解压到sys._MEIPASS临时目录
    if hasattr(sys, '_MEIPASS'):
        return os.path.join(sys._MEIPASS, 'ffmpeg.exe')
    # 开发环境下,直接调用同级目录的ffmpeg
    else:
        return os.path.join(os.path.dirname(__file__), 'ffmpeg.exe')

# 后续调用ffmpeg时使用此路径
ffmpeg_exec = get_ffmpeg_path()
# 示例调用(替换成你的业务逻辑)
# subprocess.run([ffmpeg_exec, "-i", input_video, output_video])

步骤3:修改.spec文件,添加ffmpeg到打包资源

在Analysis模块的datas参数中加入ffmpeg的路径映射,确保打包时被包含:

a = Analysis(
    ['your_script.py'],  # 替换成你的脚本文件名
    pathex=[],
    binaries=[],
    datas=[('ffmpeg.exe', '.')],  # 第一个参数是ffmpeg的本地路径,第二个是打包后存放的相对目录
    hiddenimports=[],
    hookspath=[],
    hooksconfig={},
    runtime_hooks=[],
    excludes=[],
    noarchive=False,
)
pyz = PYZ(a.pure)

exe = EXE(
    pyz,
    a.scripts,
    a.binaries,
    a.datas,
    [],
    name='your_script',  # 打包后的EXE文件名
    debug=False,
    bootloader_ignore_signals=False,
    strip=False,
    upx=True,
    upx_exclude=[],
    runtime_tmpdir=None,
    console=True,  # 若为GUI程序,改为False
    disable_windowed_traceback=False,
    argv_emulation=False,
    target_arch=None,
    codesign_identity=None,
    entitlements_file=None,
)

步骤4:重新打包

执行命令用修改后的.spec文件打包:

pyinstaller your_script.spec

注意事项

  • 确保ffmpeg版本与系统位数匹配,否则打包后运行会出现兼容性错误。
  • 测试打包后的EXE时,需将本地目录的ffmpeg.exe移走,验证是否使用打包嵌入的版本。
  • 若脚本中使用subprocess调用ffmpeg,必须使用动态获取的ffmpeg_exec路径,不能依赖系统环境变量中的ffmpeg。

内容的提问来源于stack exchange,提问作者Abdelrahman Zaki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 00:37:04