pyinstaller打包的时候将ffmpeg也加进包中(包括打包文件夹的方法)

在使用 PyInstaller 打包包含 pydub 的 Python 应用程序时,由于 pydub 需要依赖 ffmpeg,你需要确保 ffmpeg 被正确包含进打包后的程序。以下是操作步骤:


1. 准备 ffmpeg

  • 首先,确保你已经下载并安装了 ffmpeg。可以通过以下方式获取:

    • Windows :从 FFmpeg 官网 下载预编译的二进制文件,并将其解压。

    • Linux/MacOS :可以通过包管理器(如 apt 或 brew)安装:

      bash 复制代码
      sudo apt install ffmpeg   # Linux
      brew install ffmpeg       # MacOS
  • 注意 :需要记录下 ffmpeg 的路径,因为稍后需要将其包括在打包中。


2. 使用 PyInstaller 打包并包含 ffmpeg

PyInstaller 的默认行为不会自动包括外部的可执行文件,因此你需要显式指定 ffmpeg。

方法 1:使用 PyInstaller 的 --add-binary 参数

假设 ffmpeg 的路径是 path/to/ffmpeg,使用以下命令打包:

bash 复制代码
pyinstaller --onefile --add-binary "path/to/ffmpeg:./" your_script.py
  • --add-binary 的格式为:源路径:目标路径。
    • 这里 path/to/ffmpeg 是 ffmpeg 的实际路径。
    • ./ 表示将 ffmpeg 放到打包后的可执行文件同目录下。

打包完成后,可执行文件运行时会在同目录找到 ffmpeg。


方法 2:修改 PyInstaller 的规范文件(更灵活)
  1. 生成 .spec 文件:

    bash 复制代码
    pyinstaller --onefile --name your_script your_script.py
  2. 编辑生成的 .spec 文件,在 binaries 部分添加 ffmpeg:

    python 复制代码
    a = Analysis(
        ...
        binaries=[('path/to/ffmpeg', './')],  # 添加这行
        ...
    )
  3. 使用 .spec 文件重新打包:

    bash 复制代码
    pyinstaller your_script.spec

3. 确保运行时 pydub 能找到 ffmpeg

在代码中显式指定 ffmpeg 的路径(推荐),避免路径问题导致 pydub 找不到 ffmpeg。可以在脚本中加上以下代码:

python 复制代码
from pydub import AudioSegment
from pydub.utils import which

# 显式指定 ffmpeg 的路径
AudioSegment.converter = which("ffmpeg") or "path/to/ffmpeg"

参考spec文件如下:

bash 复制代码
# -*- mode: python ; coding: utf-8 -*-

a = Analysis(
    ['server.py'],
    pathex=[],
    binaries=[("./ffmpeg.exe","./ffmpeg.exe")],
    datas=[("./prompts","prompts"),('./logo.ico','.')],  
    hiddenimports=[],
    hookspath=[],
    hooksconfig={},
    runtime_hooks=[],
    excludes=[],
    noarchive=False,
    optimize=0,
)
pyz = PYZ(a.pure)

exe = EXE(
    pyz,
    a.scripts,
    a.binaries,
    a.datas,
    [],
    name='server',
    debug=False,
    bootloader_ignore_signals=False,
    strip=False,
    upx=True,
    upx_exclude=[],
    runtime_tmpdir=None,
    console=True,
    disable_windowed_traceback=False,
    argv_emulation=False,
    target_arch=None,
    codesign_identity=None,
    entitlements_file=None,
    icon=['logo.ico'],
)

注1 :prompts是文件,我的一些资源基本都放进这个文件夹。

不过文件读取的时候需要注意一点,文件的路径不能直接用相对路径这会报not such file or directory的错误。
注2:如果使用到ffmpeg,还报错。可以添加进路径中不直接使用,比如你是如果是pydub就可以在开头加二行代码

复制代码
from pydub.utils import which
# 显式指定 ffmpeg 的路径
AudioSegment.converter = which("ffmpeg")
python 复制代码
# 获取当前程序所在的路径
if getattr(sys, 'frozen', False):
    # 如果是打包后的程序,使用临时目录路径
    base_path = sys._MEIPASS
else:
    # 如果是开发环境,使用当前脚本所在路径
    base_path = os.path.dirname(__file__)

# 拼接文件的绝对路径
file_path = os.path.join(base_path, 'prompts', '晓语systemPrompt_.txt')
with open(file_path, encoding='utf-8') as r:
    systemprompt = '\n'.join(r.readlines())
    memory.append({'role':'system','content':
                   systemprompt})

总结

通过以上方法,将 ffmpeg 和 pydub 一起打包即可实现完整的功能。--add-binary 参数和修改 .spec 文件是常见的解决方案,确保 ffmpeg 在运行环境中可用,同时代码中显式指定路径以避免找不到依赖的问题。

相关推荐
智能直播14 小时前
网络RTMP拉流不卡顿、声音不同步,一文讲透缓冲区、时间戳
开发语言·ffmpeg·php·音视频·视频编解码
八月的雨季 最後的冰吻1 天前
FFmepg-- 42-ffplay.c 线程安全机制深度分析
c语言·安全·ffmpeg
开开心心就好2 天前
把手机变成电脑麦克风,WiFi连接就能用
智能手机·ffmpeg·计算机外设·电脑·word·音视频
@嵌入式扫地僧2 天前
FFmpeg 解码 H.264 流提取 SEI 用户数据实战
ffmpeg·h.264·流媒体开发·sei 解析·自定义 sei
VimorphTech2 天前
ffmpeg.wasm 实战:浏览器提取视频音频,如何处理进度、取消和资源释放?
ffmpeg
小小龙学IT2 天前
FFmpeg 开源多媒体处理框架深度解析:从命令行到 libav* 全家桶
c语言·ffmpeg·开源
ofoxcoding3 天前
Gemini TTS 与 ElevenLabs 语音合成实测:同一段视频旁白效果对比
ai·ffmpeg·音视频
_大峰_4 天前
索尼 A7M4 误删视频恢复实战:基于原始卡镜像重建 MP4 数据
ffmpeg·数据恢复·音视频·mp4·exfat
Anhty4 天前
3 款手机音频剪辑 APP 横评,短视频配音后期,免费工具怎么选?
功能测试·ffmpeg·音视频
VidDown5 天前
自动给视频挑一张能看的封面:帧评分、构图与批量生成
python·ffmpeg·音视频·视频