# 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
```

### 问题：提取失败

**可能原因：**
- 临时目录不可写
- 磁盘空间不足
- 文件损坏

**检查：**
- 查看应用日志
- 检查临时目录权限和空间
