中文 | English | 文档

介绍
libmedia 是一个用于在 Web 平台上处理多媒体内容(如音频、视频、字幕)的工具库。
libmedia 有 TypeScript 模块和 WebAssembly 模块,并且设计理念上以 TypeScript 模块为主导;我们将音视频的封装解封装层放在 TypeScript 模块实现,这样就能使用异步 IO 来处理各种来源的流,可以让整个系统在非 SharedArrayBuffer 和非 Worker 环境上运行。
解码编码模块放入 WebAssembly 模块中,这些模块可以从 FFmpeg 的 libavcodec 模块中编译而来,并且将每种解码器和编码器编译成单独的 wasm 模块,解决编译产物太大的问题,使用的时候只需要去加载要使用的模块。同时编解码模块可以使用 WebCodecs。
libmedia 的 API 设计上参照 FFmpeg 设计,很多数据结构概念都是一致的,所以你能看见诸如 AVStream、AVCodecParameters、AVFormatContext、AVPacket、AVFrame 等数据结构。FFmpeg 作为音视频行业事实上的标准,其设计是非常优秀的;照着设计直接得到优秀的设计模式,还减少开发者学习理解的难度,毕竟做音视频开发的多少都对 FFmpeg 学习过;当然最主要的原因是我们需要让这些数据可以在 TypeScript 模块和 WebAssembly 模块中都可以进行读写操作,其在内存上的布局和 FFmpeg 保持一致是前提。
libmedia 是设计在多线程上的,只是可以回退到单线程上运行;所以对多线程开发比较亲和;开发者可以很优雅的基于此做多线程的开发,毕竟在音视频领域使用多线程带来的体验绝对要高出很多。
库
avformat 音视频封装解封装库(flv、mp4、mpegts、matroska、ogg、mp3)
avcodec 音视频编解码库,主要是 C/C++(FFmpeg 和其他编解码项目) 编译的 Wasm 和 Web 平台标准 WebCodecs
audioresample 音频重采样(FFmpeg 音频重采样模块编译)
audiostretchpitch 音频变速、变调处理(soundtouch 编译)
videoscale 视频缩放,格式转换(FFmpeg libswscale 模块编译)
avnetwork Web 平台网络文件 IO 相关(Fetch、WebSocket、WebTransport、File)
avprotocol 音视频协议(dash、m3u8、rtp、rtsp、rtmp)
avrender 音视频渲染(8bit、10bit、HDR、audioWorklet、WebGL、WebGPU)
avpipeline 媒体任务处理管线,用于多线程并行化处理任务
多线程
libmedia 支持多线程,但需要页面可以使用 SharedArrayBuffer,你可以通过在顶层文档的响应头上添加以下两个响应头:
- Cross-Origin-Opener-Policy: same-origin
- Cross-Origin-Embedder-Policy: require-corp
来开启使用 SharedArrayBuffer,若不支持多线程将回退到主线程上运行。
工具
使用
查看 编译配置示例 找到对应你的构建工具的参考示例,快速知道如何集成 libmedia 到你的项目中。
当前支持的封装格式
| Format |
Input |
Output |
| flv(enhanced-rtmp-v2) |
✅ |
✅ |
| mov |
✅ |
✅ |
| mp4 |
✅ |
✅ |
| mpegts |
✅ |
✅ |
| mpegps |
✅ |
❌ |
| matroska |
✅ |
✅ |
| webm |
✅ |
✅ |
| avi |
✅ |
❌ |
| h264 裸流 |
✅ |
✅ |
| hevc 裸流 |
✅ |
✅ |
| vvc 裸流 |
✅ |
✅ |
| mp3 |
✅ |
✅ |
| ogg |
✅ |
✅ |
| ivf |
✅ |
✅ |
| aac |
✅ |
✅ |
| flac |
✅ |
✅ |
| wav |
✅ |
✅ |
| webvtt |
✅ |
❌ |
| srt |
✅ |
❌ |
| ass |
✅ |
❌ |
| ssa |
✅ |
❌ |
| ttml |
✅ |
❌ |
| avif |
✅ |
❌ |
| heif |
✅ |
❌ |
当前支持的音视频协议
| Protocol |
Input |
Output |
| hls |
✅ |
❌ |
| dash |
✅ |
❌ |
| rtmp |
✅ |
❌ |
| rtsp |
✅ |
❌ |
编解码器
编解码器被编译成了单独的 wasm 模块,解码器在 dist/decode 目录下,编码器在 dist/encode 目录下。编解码器的 wasm 模块有四个版本分别为 baseline、atomic、simd、64。baseline 版本是基准版本,指令集对应到 WebAssembly 的 MVP 版本,但需要支持 Mutable Globals,兼容性最高,性能最低;atomic 增加了 atomic 原子操作指令集和 Bulk Memory 指令集;simd 增加了 simd 向量加速指令集,性能最高。目前的 simd 版本是靠编译器自动优化的,不同的编解码器实现效果不同(目前没有看见过有针对 wasm 指令集做加速优化的开源项目,如果想要更高的加速效果需要自己优化,当前只有 h264 的 simd 解码器是手动优化的,也是性能最好的一个 wasm 模块);64 是 64 位指令集,前面的三个版本都是 32 位,64 位指令集也包括 atomic 和 simd 指令集,需要在支持 wasm64 的环境下运行,并且 libmedia 也需要使用对应的 64 位编译的版本。
四个版本和 webcodecs 的兼容性支持情况
| 环境 |
baseline |
atomic |
simd |
64 |
webcodecs |
| Chrome |
74+ |
75+ |
91+ |
133+ |
94+ |
| Firefox |
61+ |
79+ |
89+ |
N/A |
130+ |
| Safari |
13.4+ |
15+ |
16.4+ |
N/A |
16.4+(video only) |
| Wasmtime |
0.20+ |
15+ |
15+ |
N/A |
N/A |
| Wasmer |
0.7+ |
N/A |
N/A |
N/A |
N/A |
| Node.js |
12.0+ |
16.4+ |
16.4+ |
N/A |
N/A |
| Deno |
0.1+ |
1.9+ |
1.9+ |
N/A |
N/A |
| wasm2c |
1.0.1+ |
N/A |
N/A |
N/A |
N/A |
目前支持的解码 codecs 支持情况
| codec |
baseline |
atomic |
simd |
64 |
webcodecs(Chrome) |
| h264 |
✅ |
✅ |
✅ |
✅ |
✅ |
| hevc |
✅ |
✅ |
✅ |
✅ |
✅ (只支持硬解) |
| vvc |
✅ |
✅ |
✅ |
✅ |
❌ |
| av1 |
✅ |
✅ |
✅ |
✅ |
✅ |
| vp8 |
✅ |
✅ |
✅ |
✅ |
✅ |
| vp9 |
✅ |
✅ |
✅ |
✅ |
✅ |
| mpeg1 |
✅ |
✅ |
✅ |
✅ |
❌ |
| mpeg2 |
✅ |
✅ |
✅ |
✅ |
❌ |
| mpeg4 |
✅ |
✅ |
✅ |
✅ |
❌ |
| theora |
✅ |
✅ |
✅ |
✅ |
❌ |
| h261 |
✅ |
✅ |
✅ |
✅ |
❌ |
| h263 |
✅ |
✅ |
✅ |
✅ |
❌ |
| wmv |
✅ |
✅ |
✅ |
✅ |
❌ |
| mjpeg |
✅ |
✅ |
✅ |
✅ |
❌ |
| rv10 |
✅ |
✅ |
✅ |
✅ |
❌ |
| rv20 |
✅ |
✅ |
✅ |
✅ |
❌ |
| rv30 |
✅ |
✅ |
✅ |
✅ |
❌ |
| rv40 |
✅ |
✅ |
✅ |
✅ |
❌ |
| msmpeg4 |
✅ |
✅ |
✅ |
✅ |
❌ |
| aac |
✅ |
✅ |
✅ |
✅ |
✅ |
| mp3 |
✅ |
✅ |
✅ |
✅ |
✅ |
| opus |
✅ |
✅ |
✅ |
✅ |
✅ |
| flac |
✅ |
✅ |
✅ |
✅ |
✅ |
| speex |
✅ |
✅ |
✅ |
✅ |
❌ |
| vorbis |
✅ |
✅ |
✅ |
✅ |
❌ |
| ac3 |
✅ |
✅ |
✅ |
✅ |
❌ |
| eac3 |
✅ |
✅ |
✅ |
✅ |
❌ |
| dts |
✅ |
✅ |
✅ |
✅ |
❌ |
| wma |
✅ |
✅ |
✅ |
✅ |
❌ |
| cook |
✅ |
✅ |
✅ |
✅ |
❌ |
| sipr |
✅ |
✅ |
✅ |
✅ |
❌ |
| ralf |
✅ |
✅ |
✅ |
✅ |
❌ |
| G.711 A-law |
✅ |
✅ |
✅ |
✅ |
❌ |
| G.711 μ-law |
✅ |
✅ |
✅ |
✅ |
❌ |
| png |
✅ |
✅ |
✅ |
✅ |
❌ |
| webp |
✅ |
✅ |
✅ |
✅ |
❌ |
| tiff |
✅ |
✅ |
✅ |
✅ |
❌ |
| bmp |
✅ |
✅ |
✅ |
✅ |
❌ |
| gif |
✅ |
✅ |
✅ |
✅ |
❌ |
目前支持的编码 codecs 支持情况
| codec |
baseline |
atomic |
simd |
64 |
webcodecs(Chrome) |
| h264 |
✅ |
✅ |
✅ |
✅ |
✅ |
| hevc |
❌ |
✅ |
✅ |
✅ |
❌ |
| vvc |
❌ |
❌ |
❌ |
❌ |
❌ |
| av1 |
❌ |
✅ |
✅ |
✅ |
✅ |
| vp8 |
✅ |
✅ |
✅ |
✅ |
✅ |
| vp9 |
✅ |
✅ |
✅ |
✅ |
✅ |
| mpeg4 |
✅ |
✅ |
✅ |
✅ |
❌ |
| theora |
✅ |
✅ |
✅ |
✅ |
❌ |
| aac |
✅ |
✅ |
✅ |
✅ |
✅ |
| mp3 |
✅ |
✅ |
✅ |
✅ |
❌ |
| opus |
✅ |
✅ |
✅ |
✅ |
✅ |
| flac |
✅ |
✅ |
✅ |
✅ |
❌ |
| speex |
✅ |
✅ |
✅ |
✅ |
❌ |
| vorbis |
✅ |
✅ |
✅ |
✅ |
❌ |
| ac3 |
✅ |
✅ |
✅ |
✅ |
❌ |
| eac3 |
✅ |
✅ |
✅ |
✅ |
❌ |
| dts |
✅ |
✅ |
✅ |
✅ |
❌ |
| G.711 A-law |
✅ |
✅ |
✅ |
✅ |
❌ |
| G.711 μ-law |
✅ |
✅ |
✅ |
✅ |
❌ |
x265 wasm 编码器比较特殊,无法在非多线程环境下运行
相关文章
下一代 Web 音视频技术会是什么样的
开源协议
libmedia 使用 LGPL 开源协议,你需要遵守协议要求,详情查看 LGPL
但某些依赖库是 GPL 协议,如果你使用了这些依赖库则 libmedia 将被传染为 GPL 协议。这些依赖库使用在下面的组件:
- dist/encoder/x264.wasm
- dist/encoder/x264-atomic.wasm
- dist/encoder/x264-simd.wasm
- dist/encoder/x264-64.wasm
- dist/encoder/x265-atomic.wasm
- dist/encoder/x265-simd.wasm
- dist/encoder/x265-64.wasm
依赖库开源协议
版权所有 © 2024-现在 赵高兴
Copyright © 2024-present, Gaoxing Zhao
赞助作者
如果该项目对你有帮助,可以扫描二维码赞助作者:
加微信 zhaohappy_ 备注 libmedia 加作者微信,入群交流。
评论