FFmpeg.js API 文档与代码示例

FFmpeg.js API 文档与代码示例

FFmpeg.js 是 FFmpeg 的 JavaScript 端口,允许您在浏览器中执行各种多媒体处理任务,无需服务器端交互。它利用 WebAssembly 技术,提供接近原生性能的音视频编解码、转码、滤镜应用等功能。本文将深入探讨 FFmpeg.js 的 API,并提供丰富的代码示例,帮助您快速上手并将其集成到您的 Web 项目中。

核心 API

FFmpeg.js 的核心功能通过 FFmpeg 对象暴露。您可以通过 createFFmpeg 函数创建一个新的 FFmpeg 实例:

javascript
const { createFFmpeg, fetchFile } = FFmpeg;
const ffmpeg = createFFmpeg({
log: true, // 开启日志输出
corePath: 'https://unpkg.com/@ffmpeg/[email protected]/dist/ffmpeg-core.js', // 指定 core 路径
});

createFFmpeg 函数接受一个配置对象,其中常用的选项包括:

  • log: 是否开启日志输出,默认为 false
  • corePath: 指定 FFmpeg core 文件的路径。
  • mainName: 指定 main 模块的名称,默认为 main

创建 FFmpeg 实例后,需要先加载 FFmpeg core 文件:

javascript
await ffmpeg.load();

加载完成后,您可以使用 FS 模块操作虚拟文件系统,将输入文件写入内存:

javascript
const fileData = await fetchFile('input.mp4');
ffmpeg.FS('writeFile', 'input.mp4', fileData);

FS 模块提供了类似 Node.js fs 模块的 API,例如 readFilewriteFileunlink 等。

运行 FFmpeg 命令

加载输入文件后,您可以使用 run 方法执行 FFmpeg 命令:

javascript
await ffmpeg.run('-i', 'input.mp4', '-c:v', 'libx264', 'output.mp4');

run 方法接受一个字符串数组作为参数,每个元素代表一个命令行参数。

获取输出文件

执行命令后,您可以使用 FS 模块读取输出文件:

javascript
const outputData = ffmpeg.FS('readFile', 'output.mp4');

outputData 是一个 Uint8Array 类型的数组,包含输出文件的二进制数据。您可以将其转换为 Blob 对象,然后创建 URL,用于下载或在浏览器中预览:

```javascript
const blob = new Blob([outputData.buffer], { type: 'video/mp4' });
const url = URL.createObjectURL(blob);

const videoElement = document.createElement('video');
videoElement.src = url;
document.body.appendChild(videoElement);
```

更复杂的例子:音频转码和合并

以下示例演示如何将多个音频文件转换为 MP3 格式,并合并成一个文件:

```javascript
const { createFFmpeg, fetchFile } = FFmpeg;
const ffmpeg = createFFmpeg({ log: true });
await ffmpeg.load();

const audioFiles = ['audio1.wav', 'audio2.wav'];
const outputFileName = 'merged.mp3';

for (const file of audioFiles) {
const fileData = await fetchFile(file); // 假设你已经获取了音频文件的数据
ffmpeg.FS('writeFile', file, fileData);

// 将每个音频文件转换为 MP3 格式
await ffmpeg.run('-i', file, '-c:a', 'libmp3lame', ${file}.mp3);
ffmpeg.FS('unlink', file); // 删除原始文件
}

// 合并所有 MP3 文件
const inputFiles = audioFiles.map(file => ${file}.mp3);
const concatList = inputFiles.map(file => file '${file}').join('\n');
ffmpeg.FS('writeFile', 'concat.txt', concatList);

await ffmpeg.run('-f', 'concat', '-safe', '0', '-i', 'concat.txt', '-c', 'copy', outputFileName);

// 清理中间文件
ffmpeg.FS('unlink', 'concat.txt');
inputFiles.forEach(file => ffmpeg.FS('unlink', file));

const outputData = ffmpeg.FS('readFile', outputFileName);
const blob = new Blob([outputData.buffer], { type: 'audio/mpeg' });
const url = URL.createObjectURL(blob);

const audioElement = document.createElement('audio');
audioElement.src = url;
audioElement.controls = true;
document.body.appendChild(audioElement);

```

处理进度

FFmpeg.js 提供了 progress 事件,可以用来跟踪处理进度:

javascript
ffmpeg.setProgress(({ ratio }) => {
console.log(`Progress: ${ratio * 100}%`);
});

ratio 的取值范围是 0 到 1,表示处理进度。

错误处理

run 方法可能会抛出错误,例如命令行参数错误或处理过程中出现问题。您可以使用 try...catch 块捕获错误:

javascript
try {
await ffmpeg.run(...command);
} catch (error) {
console.error('Error:', error);
}

其他 API

除了上述核心 API 外,FFmpeg.js 还提供了一些其他 API,例如:

  • exit:退出 FFmpeg.js。
  • wasm: 访问底层 WebAssembly 模块。

总结

FFmpeg.js 为 Web 开发者提供了强大的多媒体处理能力。通过本文的介绍和示例,您可以了解 FFmpeg.js 的核心 API,并将其集成到您的 Web 项目中,实现各种音视频处理功能。记住要根据实际需求选择合适的 FFmpeg 命令,并处理潜在的错误。希望本文能帮助您更好地理解和使用 FFmpeg.js。 建议在实际使用过程中参考官方文档和示例,以获取更全面的信息和指导. 此外,要注意浏览器兼容性问题,以及处理大文件时可能出现的性能瓶颈。 通过合理的代码优化和资源管理,可以最大程度地发挥 FFmpeg.js 的优势,为用户提供流畅的音视频体验。 不断学习新的 FFmpeg 命令和技巧,可以拓展 FFmpeg.js 的应用场景,实现更丰富的多媒体功能。

THE END