# 平台特定 FFmpeg 嵌入说明 ## 概述 项目使用 **Go 构建标签(Build Tags)** 实现平台特定的 FFmpeg 嵌入,确保每个平台的构建只包含对应平台的二进制文件。 ## 工作原理 ### 构建标签文件 项目包含以下平台特定文件: - `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 编译器会根据当前编译目标平台(`GOOS`)自动选择匹配的文件: | 编译平台 | 使用文件 | 嵌入目录 | 结果 | |---------|---------|---------|------| | `GOOS=darwin` | `ffmpeg_darwin.go` | `resources/ffmpeg/darwin/*` | 只包含 macOS 版本 | | `GOOS=windows` | `ffmpeg_windows.go` | `resources/ffmpeg/windows/*` | 只包含 Windows 版本 | | `GOOS=linux` | `ffmpeg_linux.go` | `resources/ffmpeg/linux/*` | 只包含 Linux 版本 | ## 目录结构 ``` wails/ ├── main.go # 主文件(声明 getEmbeddedFFmpeg 函数) ├── ffmpeg_darwin.go # macOS 实现 ├── ffmpeg_windows.go # Windows 实现 ├── ffmpeg_linux.go # Linux 实现 ├── ffmpeg_default.go # 默认实现(向后兼容) └── resources/ └── ffmpeg/ ├── darwin/ # macOS 二进制文件 │ ├── ffmpeg │ └── ffprobe ├── windows/ # Windows 二进制文件 │ ├── ffmpeg.exe │ └── ffprobe.exe └── linux/ # Linux 二进制文件 ├── ffmpeg └── ffprobe ``` ## 使用方法 ### 1. 准备二进制文件 将各平台的 FFmpeg 二进制文件放置到对应目录: ```bash # macOS cp /opt/homebrew/bin/ffmpeg wails/resources/ffmpeg/darwin/ffmpeg cp /opt/homebrew/bin/ffprobe wails/resources/ffmpeg/darwin/ffprobe # Windows copy ffmpeg.exe wails\resources\ffmpeg\windows\ffmpeg.exe copy ffprobe.exe wails\resources\ffmpeg\windows\ffprobe.exe # Linux cp ffmpeg wails/resources/ffmpeg/linux/ffmpeg cp ffprobe wails/resources/ffmpeg/linux/ffprobe ``` ### 2. 编译不同平台 ```bash # macOS 版本(只嵌入 darwin/ 目录) GOOS=darwin go build -o VideoConcat-mac # Windows 版本(只嵌入 windows/ 目录) GOOS=windows GOARCH=amd64 go build -o VideoConcat.exe # Linux 版本(只嵌入 linux/ 目录) GOOS=linux GOARCH=amd64 go build -o VideoConcat-linux ``` ### 3. 验证嵌入内容 编译后,可以使用以下方法验证: ```bash # macOS/Linux strings VideoConcat | grep -i ffmpeg | head -5 # Windows (使用 PowerShell) Select-String -Path VideoConcat.exe -Pattern "ffmpeg" | Select-Object -First 5 ``` ## 优势 ### 1. 减小文件体积 - 只嵌入当前平台的二进制文件 - 减少不必要的文件大小增加 - 示例:如果每个平台 FFmpeg 是 50MB,使用平台特定嵌入后: - 之前:所有平台 = 150MB(三个平台都包含) - 现在:每个平台 = 50MB(只包含对应平台) ### 2. 避免交叉编译问题 - 编译 Windows 版本时不会误嵌入 macOS 版本 - 编译 Linux 版本时不会误嵌入 Windows 版本 - 避免运行时找不到正确文件的问题 ### 3. 清晰的目录组织 - 各平台文件分开管理 - 易于维护和更新 - 符合 Go 的最佳实践 ## 故障排查 ### 问题:编译时找不到文件 **原因**:对应平台的目录中没有二进制文件 **解决**: ```bash # 检查文件是否存在 ls -la wails/resources/ffmpeg/darwin/ ls -la wails/resources/ffmpeg/windows/ ls -la wails/resources/ffmpeg/linux/ ``` ### 问题:交叉编译时仍嵌入所有文件 **原因**:使用了旧的目录结构(根目录下的文件) **解决**:确保使用平台特定目录(`darwin/`, `windows/`, `linux/`) ### 问题:运行时找不到 FFmpeg **检查**: 1. 查看应用日志,确认 FFmpeg 查找路径 2. 检查临时目录中是否成功提取 3. 验证二进制文件是否有执行权限 ## 向后兼容 如果不想使用平台特定目录,仍然可以使用根目录放置文件(`resources/ffmpeg/ffmpeg`),但这样会: - 嵌入所有平台的二进制文件 - 增加不必要的文件大小 - 不推荐使用