Media over QUIC
ProposedMedia over QUIC (MoQ) is an IETF protocol (draft-ietf-moq-transport) for live media streaming built on QUIC. It aims to replace the fragmented RTMP-ingest + HLS/DASH-delivery + WebRTC-for-real-time stack with a single publish-subscribe protocol that delivers sub-500ms latency at CDN scale. MoQ multiplexes live and on-demand content over QUIC streams with publisher-defined object priorities.
In one line
Media over QUIC (IETF draft-ietf-moq-transport, active 2024–2026) is a pub/sub media protocol over QUIC (WebTransport in browsers). Publishers send Objects organized in Groups and Tracks to a Relay infrastructure. Subscribers request Tracks with a priority and latency preference. QUIC stream prioritization enables sub-500ms live broadcast at CDN scale. Goals: replace RTMP ingest, HLS delivery, and WebRTC for real-time video with a single protocol.
Quick Reference
| Field | Size | Description |
|---|---|---|
| Transport | QUIC / WebTransport | Native clients use raw QUIC. Browser clients use WebTransport (requires QUIC/HTTP/3). Both share the same MoQ application protocol on top. |
| Object model | Track > Group > Object | Track: a named content stream (e.g., 'video/1080p', 'audio/aac'). Group: a group of related objects (e.g., one GOP/segment). Object: an individual media unit (e.g., one video frame or audio packet). |
| Relay | CDN-operated | MoQ relays (operated by CDNs) route content from publishers to subscribers at scale. Unlike SFUs in WebRTC, MoQ relays are generic – they do not decode media. |
| Priority | per object | Publishers assign delivery priority to each object. QUIC stream scheduling delivers high-priority objects first. This enables I-frame prioritization for live video. |
| Latency modes | real-time to VOD | Subscribers choose a delivery preference: real-time (drop old groups, minimize latency) to default (full delivery, allow buffering). Same infrastructure for live and VOD. |
| SUBSCRIBE | Track request | Subscribers send SUBSCRIBE messages for specific Tracks. The relay routes Objects for those Tracks from the publisher through the relay network. |
| ANNOUNCE | Track advertisement | Publishers send ANNOUNCE to tell relays which Track Namespaces they can serve. Enables dynamic content discovery without pre-configuration. |
Key Characteristics
Sub-500ms at CDN scale
MoQ's QUIC stream priority scheduling delivers high-priority frames first. I-frames get priority over B-frames. Live sports at broadcast quality with YouTube-level scale.
Single protocol for all latencies
Same MoQ infrastructure serves real-time interactive video (sub-500ms), near-real-time live (2–10s), and VOD. No separate RTMP/HLS/WebRTC stacks.
CDN relay compatible
MoQ relays are generic packet forwarders – they route Objects without decoding media. Existing CDN infrastructure can add MoQ relay capability without media processing.
Pre-RFC, active work
MoQ is still an active IETF draft. The API and wire format may change before RFC publication. Production deployment is experimental as of 2026.
Message Format
// MoQ session establishment over WebTransport
const transport = new WebTransport('https://relay.example.com/moq');
await transport.ready;
// MoQ control stream (bidirectional stream 0)
// CLIENT_SETUP message:
// [MESSAGE_TYPE=0x20][VERSION=0x01][NUM_PARAMS=1]
// [PARAM_PATH=/live/event123]
// ANNOUNCE: publisher tells relay about available tracks
// [MESSAGE_TYPE=0x0E][TRACK_NAMESPACE=live/event123]
// [TRACK_NAME=video/1080p]
// SUBSCRIBE: subscriber requests a track
// [MESSAGE_TYPE=0x03][SUBSCRIBE_ID=1]
// [TRACK_NAMESPACE=live/event123]
// [TRACK_NAME=video/1080p]
// [FILTER_TYPE=LATEST_GROUP]
// [PRIORITY=128]// Object delivery (QUIC streams)
// Each MoQ Object arrives on its own QUIC stream:
// STREAM_HEADER_SUBGROUP message:
// [GROUP_ID=1001][SUBGROUP_ID=0][PUBLISHER_PRIORITY=128]
// OBJECT:
// [OBJECT_ID=0][OBJECT_PAYLOAD_LENGTH=4096]
// [H.264 I-frame bytes...]
// SUBSCRIBE_OK from relay:
// [MESSAGE_TYPE=0x04][SUBSCRIBE_ID=1]
// [EXPIRES=0] // no expiry
// [CONTENT_EXISTS=1]
// [LARGEST_GROUP=1000][LARGEST_OBJECT=5]
// Latency preference (subscriber sets at SUBSCRIBE time):
// FILTER_TYPE = LATEST_OBJECT: minimize latency, may skip objects
// FILTER_TYPE = LATEST_GROUP: skip to latest group (I-frame)
// FILTER_TYPE = ABSOLUTE_START: start from specific group/object