221 lines
5.6 KiB
Markdown
221 lines
5.6 KiB
Markdown
# 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
|
||
```
|
||
|
||
### 问题:提取失败
|
||
|
||
**可能原因:**
|
||
- 临时目录不可写
|
||
- 磁盘空间不足
|
||
- 文件损坏
|
||
|
||
**检查:**
|
||
- 查看应用日志
|
||
- 检查临时目录权限和空间
|