| .. | ||
| darwin | ||
| linux | ||
| windows | ||
| .gitignore | ||
| .gitkeep | ||
| README.md | ||
| 使用说明.md | ||
| 平台特定嵌入说明.md | ||
FFmpeg 二进制文件放置说明
此目录用于存放 FFmpeg 和 FFprobe 的二进制文件。这些文件会被嵌入到 Go 程序中,随应用一起分发。
重要:二进制文件会被编译到最终的可执行文件中,因此文件大小会增加。建议使用静态构建版本以减小体积。
目录结构
⭐ 推荐:按平台组织(实现自动平台选择)
resources/
└── ffmpeg/
├── darwin/ # macOS 版本(编译 macOS 时自动嵌入)
│ ├── ffmpeg
│ └── ffprobe
├── windows/ # Windows 版本(编译 Windows 时自动嵌入)
│ ├── ffmpeg.exe
│ └── ffprobe.exe
└── linux/ # Linux 版本(编译 Linux 时自动嵌入)
├── ffmpeg
└── ffprobe
优势:
- ✅ 每个平台只嵌入对应平台的二进制文件
- ✅ 减小最终可执行文件大小
- ✅ 避免跨平台打包时的混乱
- ✅ 使用 Go 构建标签自动选择
选项 2:所有平台通用(向后兼容)
resources/
└── ffmpeg/
├── ffmpeg # 当前平台的 ffmpeg(macOS/Linux)
├── ffmpeg.exe # 或 Windows 版本
├── ffprobe # 当前平台的 ffprobe(macOS/Linux)
└── ffprobe.exe # 或 Windows 版本
注意:这种方式会嵌入所有文件,增加不必要的体积。
获取 FFmpeg 二进制文件
macOS
# 使用 Homebrew 安装
brew install ffmpeg
# 复制到资源目录
cp /opt/homebrew/bin/ffmpeg resources/ffmpeg/ffmpeg
cp /opt/homebrew/bin/ffprobe resources/ffmpeg/ffprobe
# 或者如果是 Intel Mac
cp /usr/local/bin/ffmpeg resources/ffmpeg/ffmpeg
cp /usr/local/bin/ffprobe resources/ffmpeg/ffprobe
Windows
-
下载 FFmpeg Windows 构建版本:
- 访问 https://www.gyan.dev/ffmpeg/builds/
- 下载 ffmpeg-release-essentials.zip
- 解压后找到
bin目录下的ffmpeg.exe和ffprobe.exe
-
复制到资源目录:
copy ffmpeg.exe resources\ffmpeg\ffmpeg.exe copy ffprobe.exe resources\ffmpeg\ffprobe.exe
Linux
# Ubuntu/Debian
sudo apt-get install ffmpeg
# 复制到资源目录
cp /usr/bin/ffmpeg resources/ffmpeg/ffmpeg
cp /usr/bin/ffprobe resources/ffmpeg/ffprobe
或者下载静态构建版本:
wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz
tar xf ffmpeg-release-amd64-static.tar.xz
cp ffmpeg-*-amd64-static/ffmpeg resources/ffmpeg/ffmpeg
cp ffmpeg-*-amd64-static/ffprobe resources/ffmpeg/ffprobe
注意事项
-
文件权限:在 macOS/Linux 上,确保二进制文件有执行权限:
chmod +x resources/ffmpeg/ffmpeg chmod +x resources/ffmpeg/ffprobe -
架构匹配:
- macOS:确保使用正确的架构(Intel 或 Apple Silicon)
- Linux:确保使用正确的架构(amd64、arm64 等)
-
依赖库:静态构建版本通常更好,因为不需要外部依赖库。
-
打包时:在打包应用时,确保将此目录的内容包含到应用包中。
应用程序查找顺序
- 系统 PATH:首先检查系统 PATH 中是否有 ffmpeg/ffprobe
- 嵌入资源:如果未找到,从嵌入的 Go 资源中提取并解压到临时目录
- 文件系统资源:最后尝试从打包的资源目录查找(如果嵌入资源未找到)
嵌入和使用方式
工作原理
-
编译时:
- 使用 Go 构建标签(build tags)根据目标平台自动选择嵌入文件
- macOS 构建时:只嵌入
resources/ffmpeg/darwin/* - Windows 构建时:只嵌入
resources/ffmpeg/windows/* - Linux 构建时:只嵌入
resources/ffmpeg/linux/*
-
运行时:首次使用时,从嵌入的文件系统中提取二进制文件到临时目录
-
缓存:提取的文件会缓存在临时目录中,避免重复提取
构建标签说明
项目使用以下文件实现平台特定嵌入:
ffmpeg_darwin.go- macOS 平台(使用//go:build darwin)ffmpeg_windows.go- Windows 平台(使用//go:build windows)ffmpeg_linux.go- Linux 平台(使用//go:build linux)ffmpeg_default.go- 其他平台(向后兼容)
编译时,Go 会自动只编译匹配当前平台的文件,因此:
- 在 macOS 上编译 → 只嵌入 darwin 目录的文件
- 在 Windows 上编译 → 只嵌入 windows 目录的文件
- 在 Linux 上编译 → 只嵌入 linux 目录的文件
注意事项
- 文件大小:二进制文件会被嵌入到最终可执行文件中,会增加程序大小
- 首次运行:首次运行时需要提取二进制文件,可能会有短暂的延迟
- 临时目录:提取的文件保存在
{临时目录}/videoconcat-ffmpeg/{进程ID}/中 - 权限:提取的文件会自动设置执行权限(Unix 系统)
- 清理:临时文件在程序退出后通常会被系统清理,但进程异常退出时可能需要手动清理
Git 提交注意事项
默认情况下,.gitignore 已配置忽略二进制文件。如果需要将二进制文件提交到 Git:
- 移除
.gitignore中的相关规则,或 - 使用
git add -f强制添加
注意:二进制文件通常很大(几十到几百 MB),可能不适合提交到 Git。建议使用构建脚本在编译时自动下载。