如何将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
相关产品推荐
相关产品推荐

