moq-rtc 0.1.3

WebRTC (WHIP/WHEP) gateway for Media over QUIC
Documentation

WebRTC ↔ MoQ gateway.

Bridges WHIP (RFC 9725) and WHEP between WebRTC peers and [moq_net] broadcasts. The crate is split along two orthogonal axes so all four combinations can land independently:

RTP-in (ingest into MoQ) RTP-out (egress from MoQ)
HTTP server [Server::publish_router] (WHIP server) [Server::subscribe_router] (WHEP server)
HTTP client [Client::subscribe] (WHEP client) [Client::publish] (WHIP client)

The two HTTP-client paths and the two HTTP-server paths share a single [session::Session] driver and the same per-codec adapters in [codec]; the per-direction split lives in [session::MediaSink] (ingest) / [egress::EgressSource] (egress).

Embedding

Build a [Server] over your own OriginProducer / OriginConsumer and merge [Server::publish_router] / [Server::subscribe_router] into your own axum app, or dial out with [Client]. A command-line interface is provided by the moq-cli binary, on top of this library.

The bundled routers are unauthenticated: they derive the broadcast name from the request path. To own the HTTP route and authorize requests yourself (resolving the broadcast name from a verified token), skip the routers and call [whip::accept] (ingest) / [whep::accept] (egress) from your own handler. Return the [Response::answer] in your HTTP response, then run [Response::run] to drive the media session for its lifetime.

Bitstream gotcha

The WebRTC ↔ MoQ shape conversion for H.264 and H.265 is handled by moq-mux importers: str0m hands us Annex-B (start-code NALs with inline parameter sets) and that's exactly what the importers want. AV1 uses the shared OBU splitter/importer. Opus, VP8, and VP9 pass through.