Skip to content

Latest commit

 

History

1,412 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

libmedia

中文 | English | 文档

license npm

介绍

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,若不支持多线程将回退到主线程上运行。

工具

  • AVPlayer 是 libmedia 的音视频播放器实现,支持软解、硬解、MSE;支持多种封装协议、多种编码格式。 在线 demo 在线本地播放器

  • AVTranscoder 是 libmedia 的转码工具实现 在线 demo

使用

查看 编译配置示例 找到对应你的构建工具的参考示例,快速知道如何集成 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

依赖库开源协议

版权所有 (C) 2024-现在 赵高兴

Copyright (C) 2024-present, Gaoxing Zhao

赞助作者

如果该项目对你有帮助,可以扫描二维码赞助作者:

加微信 zhaohappy_ 备注 libmedia 加作者微信,入群交流。

About

一个 TypeScript 实现的高性能媒体库,支持 WebCodecs 和 Wasm。 A high-performance media library implemented in TypeScript, support WebCodecs and Wasm.

Topics

Resources

Stars

377 stars

Watchers

10 watching

Forks

Releases

Used by

Contributors

Languages