# FFmpeg

{% hint style="warning" %}
注意：此功能需要在 Eagle 4.0 beta 7 以上版本才能使用
{% endhint %}

## FFmpeg 依赖插件简介

「FFmpeg 依赖插件」是一款面向浏览器插件开发者的开发工具包，它将 FFmpeg 强大的多媒体处理能力封装为易用的依赖包。此工具包让开发者能在自身的插件中轻松实现图像、视频和音频格式的编解码，以及流媒体处理和格式转换等高级功能。通过集成「FFmpeg 依赖插件」，开发者可无缝拓展其插件的多媒体处理能力，为用户带来更多富有创意和实用性的功能。

## 安装 FFmpeg 依赖插件

1. 进入插件中心
2. 搜索并找到 FFmpeg 插件
3. 点击安装 FFmpeg 插件

{% hint style="info" %}
请注意，当用户安装具有 FFmpeg 依赖的插件时，Eagle 会自动提示用户安装「FFmpeg 依赖插件」。因此，开发者无需专门编写代码让用户进行安装，只需为可能出现的错误提供相应提示。
{% endhint %}

## 如何使用 FFmpeg 依赖插件

如果你希望在你的插件中使用 FFmpeg 相关功能，你需要在插件的 `manifest.json` 文件中添加 `dependencies` 定义，让 Eagle 系统知道这个插件需要额外的扩展功能，示例如下：

```json
{
    "id": "LBCZE8V6LPCKD",
    "version": "1.0.0",
    "platform": "all",
    "arch": "all",
    "name": "窗口插件",
    "logo": "/logo.png",
    "keywords": [],
    "dependencies": ["ffmpeg"],
    "devTools": false,
    "main":
    {
        "url": "index.html",
        "width": 640,
        "height": 480,
    }
}
```

### 窗口插件示例 <a href="#gylpl" id="gylpl"></a>

你可以使用 `eagle.extraModule.ffmpeg` 来调用 FFmpeg 依赖插件提供的功能，示例如下：

```javascript
eagle.onPluginCreate(async (plugin) => {

    // 检查 FFmpeg 依赖插件是否已经安装
    const isFFemptInstalled = await eagle.extraModule.ffmpeg.isInstalled();
    
    // 从打开插件中心，弹出安装 FFmpeg 依赖插件页面。
    if (!isFFemptInstalled) {
        await eagle.extraModule.ffmpeg.install();
        return;
    }
    
    // 获取 FFmpeg 二进制文件所在位置
    const ffmpegPaths= await eagle.extraModule.ffmpeg.getPaths();
    const ffmpegBinaryPath = ffmpegPaths.ffmpeg;
    const ffprobeBinaryPath = ffmpegPaths.ffprobe;
    
    // 使用 spwan 指令执行相关操作
    const spawn = require('child_process').spawn;
    const ffprobe = spawn(ffprobePath, [
	'-v', 'error',
	'-print_format', 'json',
	'-show_format',
	'-show_streams',
	"C:\\your_file.mp4"
    ]);
});
```

### 缩略图插件示例 <a href="#gylpl" id="gylpl"></a>

你可以通过 `extraModule` 参数获取 FFmpeg 相关功能，示例如下：

```javascript

module.exports = async ({ src, dest, item, plugin, extraModule }) => {
    return new Promise(async (resolve, reject) => {
        try {
        
            const ffmpegModule = extraModule.ffmpeg;
	
            // 检查 FFmpeg 依赖插件是否已经安装
            if (!ffmpegModule.isInstalled) {
		return reject(new Error(`ffmpeg is not installed.`));
	    }
	    
            // 获取 FFmpeg 二进制文件所在位置
            const { ffmpeg, ffprobe } = ffmpegModule.paths;
            
            // 使用 spwan 指令执行相关操作
            const spawn = require('child_process').spawn;
            const ffprobe = spawn(ffprobePath, [
	        '-v', 'error',
        	'-print_format', 'json',
	        '-show_format',
	        '-show_streams',
	        "C:\\your_file.mp4"
            ]);
            
            return resolve(item);
        }
        catch (err) {
            return reject(err);
        }
    });
}
```
