# FFmpeg 嵌入使用说明 ## 快速开始 ### 1. 下载 FFmpeg 二进制文件 根据你的目标平台下载对应的 FFmpeg 静态构建版本,并放置到对应的平台目录下: **重要**:使用平台特定目录组织,编译时会自动只嵌入对应平台的版本。 #### macOS (Apple Silicon 或 Intel) ```bash # 使用 Homebrew 安装(推荐) brew install ffmpeg # 复制到 macOS 专用目录 cp /opt/homebrew/bin/ffmpeg wails/resources/ffmpeg/darwin/ffmpeg cp /opt/homebrew/bin/ffprobe wails/resources/ffmpeg/darwin/ffprobe # 或者如果是 Intel Mac cp /usr/local/bin/ffmpeg wails/resources/ffmpeg/darwin/ffmpeg cp /usr/local/bin/ffprobe wails/resources/ffmpeg/darwin/ffprobe # 设置权限 chmod +x wails/resources/ffmpeg/darwin/ffmpeg chmod +x wails/resources/ffmpeg/darwin/ffprobe ``` **或者下载静态构建版本:** ```bash # Apple Silicon wget https://evermeet.cx/ffmpeg/ffmpeg-6.1.zip unzip ffmpeg-6.1.zip cp ffmpeg wails/resources/ffmpeg/darwin/ffmpeg cp ffprobe wails/resources/ffmpeg/darwin/ffprobe chmod +x wails/resources/ffmpeg/darwin/ffmpeg wails/resources/ffmpeg/darwin/ffprobe ``` #### Windows ```powershell # 下载 # 访问 https://www.gyan.dev/ffmpeg/builds/ # 下载 ffmpeg-release-essentials.zip # 解压后复制 bin 目录下的文件到 windows 目录 copy ffmpeg.exe wails\resources\ffmpeg\windows\ffmpeg.exe copy ffprobe.exe wails\resources\ffmpeg\windows\ffprobe.exe ``` #### Linux ```bash # 下载静态构建版本 wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz tar xf ffmpeg-release-amd64-static.tar.xz cd ffmpeg-*-amd64-static # 复制到 Linux 专用目录 cp ffmpeg ../../wails/resources/ffmpeg/linux/ffmpeg cp ffprobe ../../wails/resources/ffmpeg/linux/ffprobe chmod +x ../../wails/resources/ffmpeg/linux/ffmpeg chmod +x ../../wails/resources/ffmpeg/linux/ffprobe ``` ### 2. 编译应用 二进制文件会在编译时根据目标平台自动选择并嵌入: ```bash cd wails # 在 macOS 上编译 macOS 版本(只嵌入 darwin/ 目录的文件) go build -o VideoConcat # 交叉编译 Windows 版本(只嵌入 windows/ 目录的文件) GOOS=windows GOARCH=amd64 go build -o VideoConcat.exe # 交叉编译 Linux 版本(只嵌入 linux/ 目录的文件) GOOS=linux GOARCH=amd64 go build -o VideoConcat ``` **优势**: - ✅ macOS 版本只包含 macOS 的 FFmpeg,体积更小 - ✅ Windows 版本只包含 Windows 的 FFmpeg,体积更小 - ✅ 交叉编译时不会混入其他平台的二进制文件 ### 3. 运行应用 应用启动时会自动: 1. 检查系统 PATH 中的 ffmpeg 2. 如果未找到,从嵌入的资源中提取到临时目录 3. 使用提取的二进制文件 ## 工作原理 ### 嵌入过程 ```go // main.go //go:embed resources/ffmpeg var embeddedFFmpeg embed.FS ``` 这行代码会在编译时将所有 `resources/ffmpeg/` 目录下的文件嵌入到程序中。 ### 运行时提取 应用首次启动时: 1. 检查系统是否有 ffmpeg 2. 如果没有,从嵌入的文件系统中查找匹配的二进制文件 3. 提取到临时目录:`{临时目录}/videoconcat-ffmpeg/{进程ID}/` 4. 设置执行权限 5. 使用提取的文件 ### 文件查找顺序 1. `resources/ffmpeg/ffmpeg` 或 `resources/ffmpeg/ffmpeg.exe` 2. `resources/ffmpeg/{GOOS}/ffmpeg` 或 `resources/ffmpeg/{GOOS}/ffmpeg.exe` 3. `resources/ffmpeg/{GOOS}_{GOARCH}/ffmpeg` 等 ## 目录结构示例 ### ⭐ 推荐:按平台组织(自动平台选择) ``` wails/resources/ffmpeg/ ├── darwin/ # macOS 版本 │ ├── ffmpeg │ └── ffprobe ├── windows/ # Windows 版本 │ ├── ffmpeg.exe │ └── ffprobe.exe ├── linux/ # Linux 版本 │ ├── ffmpeg │ └── ffprobe └── README.md ``` **编译行为**: - 在 macOS 上编译 → 只嵌入 `darwin/` 目录 - 在 Windows 上编译 → 只嵌入 `windows/` 目录 - 在 Linux 上编译 → 只嵌入 `linux/` 目录 ### 向后兼容:单目录结构 ``` wails/resources/ffmpeg/ ├── ffmpeg # 当前平台的 ffmpeg(不推荐) ├── ffprobe # 当前平台的 ffprobe └── README.md ``` **注意**:这种方式会嵌入所有文件,不推荐使用。 ## 注意事项 ### 文件大小 - FFmpeg 静态构建版本通常 50-200 MB - 嵌入后会增加最终可执行文件的大小 - 考虑使用 LZMA 压缩或分平台构建来减小体积 ### Git 提交 默认情况下,二进制文件被 `.gitignore` 忽略。如果需要提交: ```bash # 方法1:强制添加 git add -f wails/resources/ffmpeg/ffmpeg # 方法2:修改 .gitignore(不推荐,文件太大) ``` ### 权限问题 在 macOS/Linux 上,确保文件有执行权限: ```bash chmod +x wails/resources/ffmpeg/ffmpeg chmod +x wails/resources/ffmpeg/ffprobe ``` ### 临时文件清理 提取的文件保存在临时目录中。如果进程异常退出,可能需要手动清理: ```bash # macOS/Linux rm -rf /tmp/videoconcat-ffmpeg # Windows rd /s /q %TEMP%\videoconcat-ffmpeg ``` ## 故障排查 ### 问题:找不到 ffmpeg **检查清单:** 1. 确认二进制文件已放置在 `wails/resources/ffmpeg/` 目录 2. 检查文件名是否正确(Windows 需要 `.exe` 后缀) 3. 检查文件权限(macOS/Linux) 4. 查看应用日志,查找详细的错误信息 ### 问题:权限被拒绝 **解决方案:** ```bash chmod +x wails/resources/ffmpeg/ffmpeg chmod +x wails/resources/ffmpeg/ffprobe ``` ### 问题:提取失败 **可能原因:** - 临时目录不可写 - 磁盘空间不足 - 文件损坏 **检查:** - 查看应用日志 - 检查临时目录权限和空间