基于 QUIC 的媒体传输
Media over QUIC (MoQ) 是一种下一代实时媒体协议,能够在大规模场景下提供实时延迟。 MoQ 基于现代 Web 技术构建,在不受 WebRTC 限制的情况下,提供与 WebRTC 相当的延迟。 核心网络功能委托给 QUIC 库处理,其余部分在应用层实现,从而让你完全掌控媒体管道。
主要特性:
- 🚀 实时延迟,利用 QUIC 实现优先级排序和部分可靠性。
- 📈 大规模扩展,专为扇出设计,并支持跨区域集群。
- 🌐 现代 Web,使用 WebTransport、WebCodecs 和 WebAudio。
- 🎯 多语言支持,提供 Rust(原生)和 TypeScript(Web)库。
- 🔧 通用性,适用于任何实时数据,而不仅仅是媒体。包含文本聊天,既作为示例也是核心功能。
注意: 本项目实现了 moq-lite,它是 IETF moq-transport 草案的一个前向兼容子集。moq-lite 可与任何 moq-transport CDN(例如 Cloudflare)配合使用。其关注点更集中,优先考虑简洁性和可部署性。
快速入门
完整文档位于 doc.moq.dev。
- 运行演示 - 使用中继、演示媒体和 Web UI 在本地试用 MoQ。
- Agent 设置 - 教你的 AI 编码代理(Claude Code、Cursor 等)如何使用 MoQ 进行构建。
- Linux 软件包 - 从
apt.moq.dev/rpm.moq.dev安装中继和 GStreamer 插件。 - 生产环境设置 - 使用真实域名和 TLS 部署中继。
查看其实际效果的最快方式(需要 Nix 和 flakes):
# Runs a relay, demo media, and the web server
nix develop -c just
然后访问 https://localhost:8080。没有 Nix?请参阅 演示指南 以进行手动设置。
架构
MoQ 被设计为一个分层协议栈。
规则 1:CDN 不得了解任何关于你的应用程序、媒体编解码器或可用轨道的信息。 所有内容都可以完全 E2EE,而 CDN 不会在意。不允许包含业务逻辑。
相反,moq-relay 基于编码在 moq-net 头中的规则进行操作。
这些规则基于视频编码,但足够通用,可用于任何实时数据。
目标是在支持广泛用例的同时,尽可能保持服务器的简单。
媒体逻辑被拆分到另一个称为 hang 的协议中。
它相当简单,仅旨在供客户端或媒体服务器使用。
如果你想做更定制化的事情,你可以随时扩展它或完全替换它。
可以将 hang 视为类似于 HLS/DASH,而 moq-lite 类似于 HTTP。
┌─────────────────┐
│ Application │ 🏢 Your business logic
│ │ - authentication, non-media tracks, etc.
├─────────────────┤
│ hang │ 🎬 Media-specific encoding/streaming
│ │ - codecs, containers, catalog
├─────────────────├
│ moq-lite │ 🚌 Generic pub/sub transport
│ │ - broadcasts, tracks, groups, frames
├─────────────────┤
│ WebTransport │ 🌐 Browser-compatible QUIC
│ QUIC │ - HTTP/3 handshake, multiplexing, etc.
└─────────────────┘
库
本仓库同时提供 Rust 和 TypeScript 库,它们具有相似的 API,但针对各自语言进行了优化。
Rust
| Crate | Description | Docs |
|---|---|---|
| moq-net | 网络层:内置缓存、扇出和优先级设置的实时发布/订阅。协商使用 moq-lite 或 moq-transport 线协议。 | |
| moq-relay | 可集群化的中继服务器。此中继执行扇出,将多个客户端和服务器连接在一起。 | |
| moq-token | moq-relay 支持的认证方案。可作为库或 CLI 用于认证会话。 | |
| moq-native | 配置 Quinn QUIC 端点的有主见辅助工具。这比它应该的更困难。 | |
| libmoq | moq-net 的 C 绑定。 | |
| hang | 基于 moq-net 之上的媒体特定编码/流传输层。可作为库使用。 | |
| moq-cli | 用于向 MoQ 中继发布媒体的 CLI。 | |
| moq-mux | 用于将内容导入 MoQ 广播的媒体复用器和解复用器(fMP4/CMAF、HLS)。 | |
| moq-gst | 用于发布或消费 MoQ 广播的 GStreamer 插件。默认不构建;需要 GStreamer 开发库。 |
TypeScript
| 包 | 描述 | NPM |
|---|---|---|
| @moq/net | 网络层:内置缓存、扇出和优先级设置的实时发布/订阅。协商使用 moq-lite 或 moq-transport 线协议。旨在用于浏览器,在服务器端运行时需使用 WebTransport polyfill。 | |
| @moq/token | 用于 JS/TS 环境的身份验证库 & CLI(参见 Authentication) | |
| @moq/hang | 核心媒体库:目录、容器和支持。由 @moq/watch 和 @moq/publish 共享。 | |
| @moq/demo | 使用 @moq/hang 的示例。 | |
| @moq/watch | 订阅并渲染 MoQ 广播(Web Component + JS API)。 | |
| @moq/publish | 将媒体发布到 MoQ 广播(Web Component + JS API)。 | |
| @moq/ui-core | 由 @moq/watch/ui 和 @moq/publish/ui 使用的共享 UI 组件(Button、Icon、Stats、CSS 主题)。 |
协议
阅读规范:
开发
# See all available commands
just
# Build everything
just build
# Lint and compile what your branch changed
just check
# Automatically fix some linting errors, same scope
just fix
# Same as the above, over every package
just check-all
just fix-all
License
在以下任一许可下授权:
- Apache License, Version 2.0(LICENSE-APACHE或 https://www.apache.org/licenses/LICENSE-2.0)
- MIT license(LICENSE-MIT或 https://opensource.org/licenses/MIT)
例外: cpp/obs/下的 OBS 插件根据 GPL-2.0-or-later 授权(参见 cpp/obs/LICENSE),因为它链接了 OBS Studio 的 libobs,后者为 GPL-2.0。这是一个可单独分发的作品;根据 GPLv2,它在本仓库中的存在仅为聚合,不影响项目其余部分的 MIT/Apache 授权。libmoq和其他 moq crates 仍保持 MIT/Apache 授权。