# 平台特定 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`），但这样会：
- 嵌入所有平台的二进制文件
- 增加不必要的文件大小
- 不推荐使用
