Yahweasel/libav.js
This is a compilation of the libraries associated with handling audio and video in ffmpeg—libavformat, libavcodec, libavfilter, libavutil, libswresample, and libswscale—for emscripten, and thus the web.
解决的问题
Web 应用经常需要处理音频或视频文件——转换格式、提取帧或应用滤镜。传统上,在浏览器中执行这些操作需要服务器端协助或原生插件。libav.js 将领先的开源多媒体框架 FFmpeg 的强大功能带入纯 JavaScript 和 WebAssembly。通过将 FFmpeg 的核心库(libavformat、libavcodec、libavfilter、libavutil、libswresample)编译为 WebAssembly 和 asm.js,它允许您直接在浏览器(或 Node.js)中编码、解码、封装、解封装和过滤音频和视频,无需任何原生代码。
工作原理
libav.js 使用 Emscripten 将 FFmpeg 的库编译为 WebAssembly 和 asm.js。您加载一个暴露全局 LibAV 对象的 JavaScript 文件;调用 LibAV.LibAV() 返回一个 Promise,该 Promise 解析为一个可用的实例。该实例提供诸如 writeFile、ff_init_demuxer_file、ff_init_decoder、ff_read_multi 和 ff_decode_multi 等函数来处理媒体操作。它通过虚拟设备支持异步 I/O,从而避免了 FFmpeg 内存文件系统的限制。该项目高度可定制:您可以从预构建的变体(例如 default、opus、flac、webm、aac)中选择,这些变体包含特定的编解码器和容器,或者使用配置片段创建自己的变体。每个变体都可以选择是否包含 ffmpeg 和 ffprobe CLI 工具,并且提供可选的调试版本。许可处理得当:FFmpeg 是 LGPL 许可,因此包含源代码;包装代码使用宽松的 0-clause BSD 许可。
适用人群
这适用于需要在浏览器中处理音频或视频的 Web 开发人员——例如,构建媒体编辑器、转换器或流媒体应用。如果您希望保证特定的编解码器集,无论浏览器支持如何(尤其是在与 WebCodecs 结合使用时,WebCodecs 缺乏封装/解封装功能且编解码器覆盖不一致),它也很有用。该库适用于浏览器和 Node.js,但建议 Node.js 用户改用原生 FFmpeg。提供了 TypeScript 类型定义,以便集成到 TypeScript 项目中。
亮点
- 纯 JavaScript 和 WebAssembly——无需插件或服务器。
- 基于完整的 FFmpeg 库:libavformat、libavcodec、libavfilter、libavutil、libswresample。
- 包含
ffmpeg和ffprobeCLI(在某些变体中)作为 JavaScript 函数。 - 模块化变体:为每个解封装器或解码器单独构建,可通过配套工具(如 AVGuesser 和 TransAVormer)按需加载。
- 通过虚拟设备实现异步 I/O,因此文件大小仅受 JavaScript 数字类型的限制。
- 通过配套的 polyfill 和桥接项目与 WebCodecs 配合使用。
- 清晰的许可:提供源代码(LGPL),包装代码采用 0-clause BSD。
- 高度可定制:针对不同的 FFmpeg 版本构建或创建自定义变体。
- 发布在 NPM 和 GitHub 上,并提供 CDN 选项以便快速使用。
相关
- 项目
- 项目
- 项目
- 项目