# FFmpeg 二进制文件放置说明

此目录用于存放 FFmpeg 和 FFprobe 的二进制文件。这些文件会被**嵌入到 Go 程序**中，随应用一起分发。

**重要**：二进制文件会被编译到最终的可执行文件中，因此文件大小会增加。建议使用静态构建版本以减小体积。

## 目录结构

### ⭐ 推荐：按平台组织（实现自动平台选择）

```
resources/
└── ffmpeg/
    ├── darwin/         # macOS 版本（编译 macOS 时自动嵌入）
    │   ├── ffmpeg
    │   └── ffprobe
    ├── windows/        # Windows 版本（编译 Windows 时自动嵌入）
    │   ├── ffmpeg.exe
    │   └── ffprobe.exe
    └── linux/          # Linux 版本（编译 Linux 时自动嵌入）
        ├── ffmpeg
        └── ffprobe
```

**优势**：
- ✅ 每个平台只嵌入对应平台的二进制文件
- ✅ 减小最终可执行文件大小
- ✅ 避免跨平台打包时的混乱
- ✅ 使用 Go 构建标签自动选择

### 选项 2：所有平台通用（向后兼容）

```
resources/
└── ffmpeg/
    ├── ffmpeg          # 当前平台的 ffmpeg（macOS/Linux）
    ├── ffmpeg.exe      # 或 Windows 版本
    ├── ffprobe         # 当前平台的 ffprobe（macOS/Linux）
    └── ffprobe.exe     # 或 Windows 版本
```

**注意**：这种方式会嵌入所有文件，增加不必要的体积。

## 获取 FFmpeg 二进制文件

### macOS

```bash
# 使用 Homebrew 安装
brew install ffmpeg

# 复制到资源目录
cp /opt/homebrew/bin/ffmpeg resources/ffmpeg/ffmpeg
cp /opt/homebrew/bin/ffprobe resources/ffmpeg/ffprobe

# 或者如果是 Intel Mac
cp /usr/local/bin/ffmpeg resources/ffmpeg/ffmpeg
cp /usr/local/bin/ffprobe resources/ffmpeg/ffprobe
```

### Windows

1. 下载 FFmpeg Windows 构建版本：
   - 访问 https://www.gyan.dev/ffmpeg/builds/
   - 下载 ffmpeg-release-essentials.zip
   - 解压后找到 `bin` 目录下的 `ffmpeg.exe` 和 `ffprobe.exe`

2. 复制到资源目录：
   ```powershell
   copy ffmpeg.exe resources\ffmpeg\ffmpeg.exe
   copy ffprobe.exe resources\ffmpeg\ffprobe.exe
   ```

### Linux

```bash
# Ubuntu/Debian
sudo apt-get install ffmpeg

# 复制到资源目录
cp /usr/bin/ffmpeg resources/ffmpeg/ffmpeg
cp /usr/bin/ffprobe resources/ffmpeg/ffprobe
```

或者下载静态构建版本：
```bash
wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz
tar xf ffmpeg-release-amd64-static.tar.xz
cp ffmpeg-*-amd64-static/ffmpeg resources/ffmpeg/ffmpeg
cp ffmpeg-*-amd64-static/ffprobe resources/ffmpeg/ffprobe
```

## 注意事项

1. **文件权限**：在 macOS/Linux 上，确保二进制文件有执行权限：
   ```bash
   chmod +x resources/ffmpeg/ffmpeg
   chmod +x resources/ffmpeg/ffprobe
   ```

2. **架构匹配**：
   - macOS：确保使用正确的架构（Intel 或 Apple Silicon）
   - Linux：确保使用正确的架构（amd64、arm64 等）

3. **依赖库**：静态构建版本通常更好，因为不需要外部依赖库。

4. **打包时**：在打包应用时，确保将此目录的内容包含到应用包中。

## 应用程序查找顺序

1. **系统 PATH**：首先检查系统 PATH 中是否有 ffmpeg/ffprobe
2. **嵌入资源**：如果未找到，从嵌入的 Go 资源中提取并解压到临时目录
3. **文件系统资源**：最后尝试从打包的资源目录查找（如果嵌入资源未找到）

## 嵌入和使用方式

### 工作原理

1. **编译时**：
   - 使用 Go 构建标签（build tags）根据目标平台自动选择嵌入文件
   - macOS 构建时：只嵌入 `resources/ffmpeg/darwin/*`
   - Windows 构建时：只嵌入 `resources/ffmpeg/windows/*`
   - Linux 构建时：只嵌入 `resources/ffmpeg/linux/*`

2. **运行时**：首次使用时，从嵌入的文件系统中提取二进制文件到临时目录

3. **缓存**：提取的文件会缓存在临时目录中，避免重复提取

### 构建标签说明

项目使用以下文件实现平台特定嵌入：

- `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 会自动只编译匹配当前平台的文件，因此：
- 在 macOS 上编译 → 只嵌入 darwin 目录的文件
- 在 Windows 上编译 → 只嵌入 windows 目录的文件
- 在 Linux 上编译 → 只嵌入 linux 目录的文件

### 注意事项

- **文件大小**：二进制文件会被嵌入到最终可执行文件中，会增加程序大小
- **首次运行**：首次运行时需要提取二进制文件，可能会有短暂的延迟
- **临时目录**：提取的文件保存在 `{临时目录}/videoconcat-ffmpeg/{进程ID}/` 中
- **权限**：提取的文件会自动设置执行权限（Unix 系统）
- **清理**：临时文件在程序退出后通常会被系统清理，但进程异常退出时可能需要手动清理

## Git 提交注意事项

默认情况下，`.gitignore` 已配置忽略二进制文件。如果需要将二进制文件提交到 Git：

1. 移除 `.gitignore` 中的相关规则，或
2. 使用 `git add -f` 强制添加

**注意**：二进制文件通常很大（几十到几百 MB），可能不适合提交到 Git。建议使用构建脚本在编译时自动下载。
