# libmedia
**Repository Path**: mxlz/libmedia
## Basic Information
- **Project Name**: libmedia
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: LGPL-3.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-01-21
- **Last Updated**: 2025-02-21
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
libmedia
======
中文 | [English](README_en.md) | [文档](https://zhaohappy.github.io/libmedia/docs)
 [](https://github.com/zhaohappy/cheap)   [](https://www.npmjs.com/settings/libmedia/packages)
### 介绍
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](https://zhaohappy.github.io/libmedia/test/avplayer.html)
[在线本地播放器](https://zhaohappy.github.io/libmedia/product/player/player.html)
- AVTranscoder 是 libmedia 的转码工具实现
[在线 demo](https://zhaohappy.github.io/libmedia/test/avtranscoder.html)
### 当前支持的封装格式
| Format | Input | Output |
| ---------| --------|-----------|
| flv | ✅ | ✅ |
| mov | ✅ | ✅ |
| mp4 | ✅ | ✅ |
| mpegts | ✅ | ✅ |
| mpegps | ✅ | ❌ |
| matroska | ✅ | ✅ |
| webm | ✅ | ✅ |
| h264 裸流 | ✅ | ❌ |
| hevc 裸流 | ✅ | ❌ |
| vvc 裸流 | ✅ | ❌ |
| mp3 | ✅ | ✅ |
| ogg | ✅ | ✅ |
| ivf | ✅ | ✅ |
| aac | ✅ | ❌ |
| flac | ✅ | ❌ |
| wav | ✅ | ❌ |
| webvtt | ✅ | ❌ |
| srt | ✅ | ❌ |
| ass | ✅ | ❌ |
| ssa | ✅ | ❌ |
| ttml | ✅ | ❌ |
### 当前支持的音视频协议
| 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 | ✅ | ✅ | ✅ | ✅ | ❌ |
| aac | ✅ | ✅ | ✅ | ✅ | ✅ |
| mp3 | ✅ | ✅ | ✅ | ✅ | ✅ |
| opus | ✅ | ✅ | ✅ | ✅ | ✅ |
| flac | ✅ | ✅ | ✅ | ✅ | ❌ |
| speex | ✅ | ✅ | ✅ | ✅ | ❌ |
| vorbis | ✅ | ✅ | ✅ | ✅ | ❌ |
| ac3 | ✅ | ✅ | ✅ | ✅ | ❌ |
| eac3 | ✅ | ✅ | ✅ | ✅ | ❌ |
| dts | ✅ | ✅ | ✅ | ✅ | ❌ |
| G.711 A-law | ✅ | ✅ | ✅ | ✅ | ❌ |
| G.711 μ-law | ✅ | ✅ | ✅ | ✅ | ❌ |
#### 目前支持的编码 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 音视频技术会是什么样的](./articles/下一代%20Web%20音视频技术会是什么样的.md)
### 开源协议
libmedia 使用 LGPL 开源协议,你需要遵守协议要求,详情查看 [LGPL](https://github.com/zhaohappy/libmedia/blob/master/COPYING.LGPLv3)
但某些依赖库是 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
#### 依赖库开源协议
- [ffmpeg](https://github.com/FFmpeg/FFmpeg): LGPL v2.1+
- [soundtouch](https://www.surina.net/soundtouch/): LGPL v2.1
- [openh264](https://github.com/cisco/openh264): BSD-2-Clause
- [x264](https://www.videolan.org/developers/x264.html): GPL
- [x265](https://www.videolan.org/developers/x265.html): GPL
- [theora](https://github.com/xiph/theora): BSD-3-Clause
- [vorbis](https://xiph.org/vorbis/): based BSD
- [speex](https://www.speex.org/): revised BSD
- [opus](https://opus-codec.org/): BSD-3-Clause
- [libvpx](https://chromium.googlesource.com/webm/libvpx/): BSD-3-Clause
- [libogg](https://github.com/gcp/libogg): BSD-3-Clause
- [lame](https://lame.sourceforge.io/): LGPL
- [kvazaar](https://github.com/ultravideo/kvazaar): BSD-3-Clause
- [flac](https://github.com/xiph/flac): BSD-3-Clause
- [fdkaac](https://www.linuxfromscratch.org/blfs/view/svn/multimedia/fdk-aac.html): based BSD
- [dav1d](https://code.videolan.org/videolan/dav1d/): BSD-2-Clause
- [aom](https://aomedia.googlesource.com/aom/): BSD-2-Clause
- [hls-parser](https://github.com/kuu/hls-parser): MIT
- [sdp-transform](https://github.com/clux/sdp-transform): MIT
- [ass.js](https://github.com/weizhenye/ASS): MIT
- [ass-compiler](https://github.com/weizhenye/ass-compiler): MIT
- [yox](https://github.com/yoxjs/yox): MIT
版权所有 (C) 2024-现在 赵高兴
Copyright (C) 2024-present, Gaoxing Zhao
### 赞助作者
如果该项目对你有帮助,可以扫描二维码赞助作者:
