ITADN
README.md
以下内容由 AI 翻译,如有问题请点此提交 issue 反馈

Media over QUIC

License Discord Crates.io npm

基于 QUIC 的媒体传输

Media over QUIC (MoQ) 是一种下一代实时媒体协议,能够在大规模场景下提供实时延迟。 MoQ 基于现代 Web 技术构建,在不受 WebRTC 限制的情况下,提供与 WebRTC 相当的延迟。 核心网络功能委托给 QUIC 库处理,其余部分在应用层实现,从而让你完全掌控媒体管道。

主要特性:

  • 🚀 实时延迟,利用 QUIC 实现优先级排序和部分可靠性。
  • 📈 大规模扩展,专为扇出设计,并支持跨区域集群。
  • 🌐 现代 Web,使用 WebTransportWebCodecsWebAudio
  • 🎯 多语言支持,提供 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 部署中继。

查看其实际效果的最快方式(需要 Nixflakes):

# 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.
└─────────────────┘

本仓库同时提供 RustTypeScript 库,它们具有相似的 API,但针对各自语言进行了优化。

Rust

CrateDescriptionDocs
moq-net网络层:内置缓存、扇出和优先级设置的实时发布/订阅。协商使用 moq-litemoq-transport 线协议。docs.rs
moq-relay可集群化的中继服务器。此中继执行扇出,将多个客户端和服务器连接在一起。
moq-tokenmoq-relay 支持的认证方案。可作为库或 CLI 用于认证会话。
moq-native配置 Quinn QUIC 端点的有主见辅助工具。这比它应该的更困难。docs.rs
libmoqmoq-net 的 C 绑定。docs.rs
hang基于 moq-net 之上的媒体特定编码/流传输层。可作为库使用。docs.rs
moq-cli用于向 MoQ 中继发布媒体的 CLI。
moq-mux用于将内容导入 MoQ 广播的媒体复用器和解复用器(fMP4/CMAF、HLS)。docs.rs
moq-gst用于发布或消费 MoQ 广播的 GStreamer 插件。默认不构建;需要 GStreamer 开发库。

TypeScript

描述NPM
@moq/net网络层:内置缓存、扇出和优先级设置的实时发布/订阅。协商使用 moq-litemoq-transport 线协议。旨在用于浏览器,在服务器端运行时需使用 WebTransport polyfill。npm
@moq/token用于 JS/TS 环境的身份验证库 & CLI(参见 Authentication)npm
@moq/hang核心媒体库:目录、容器和支持。由 @moq/watch@moq/publish 共享。npm
@moq/demo使用 @moq/hang 的示例。
@moq/watch订阅并渲染 MoQ 广播(Web Component + JS API)。npm
@moq/publish将媒体发布到 MoQ 广播(Web Component + JS API)。npm
@moq/ui-core@moq/watch/ui@moq/publish/ui 使用的共享 UI 组件(Button、Icon、Stats、CSS 主题)。npm

协议

阅读规范:

开发

# 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

请参阅开发指南justfile以获取更多信息。

License

在以下任一许可下授权:

例外: 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 授权。