4.3 KiB
4.3 KiB
平台特定 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 二进制文件放置到对应目录:
# 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. 编译不同平台
# 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. 验证嵌入内容
编译后,可以使用以下方法验证:
# 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 的最佳实践
故障排查
问题:编译时找不到文件
原因:对应平台的目录中没有二进制文件
解决:
# 检查文件是否存在
ls -la wails/resources/ffmpeg/darwin/
ls -la wails/resources/ffmpeg/windows/
ls -la wails/resources/ffmpeg/linux/
问题:交叉编译时仍嵌入所有文件
原因:使用了旧的目录结构(根目录下的文件)
解决:确保使用平台特定目录(darwin/, windows/, linux/)
问题:运行时找不到 FFmpeg
检查:
- 查看应用日志,确认 FFmpeg 查找路径
- 检查临时目录中是否成功提取
- 验证二进制文件是否有执行权限
向后兼容
如果不想使用平台特定目录,仍然可以使用根目录放置文件(resources/ffmpeg/ffmpeg),但这样会:
- 嵌入所有平台的二进制文件
- 增加不必要的文件大小
- 不推荐使用