159 lines
5.4 KiB
Markdown
159 lines
5.4 KiB
Markdown
# 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。建议使用构建脚本在编译时自动下载。
|