Skip to main content

The networking layer for Media over QUIC: real-time pub/sub with built-in caching, fan-out, and prioritization.

Project description

moq-net

The networking layer for Media over QUIC in Python: real-time pub/sub with built-in caching, fan-out, and prioritization, on top of QUIC.

moq-net wraps the auto-generated moq-ffi bindings with a Pythonic API: no Moq prefixes, async iterators, context managers, and simplified connection setup. At session setup it negotiates either the moq-lite or moq-transport wire protocol.

Installation

pip install moq-net

Quick Start

Subscribe to a stream

import asyncio
import moq_net as moq

async def main():
    async with moq.Client("https://relay.quic.video") as client:
        async for announcement in client.announced():
            catalog = await announcement.broadcast.catalog()

            for name in catalog.audio:
                async for frame in announcement.broadcast.subscribe_media(name):
                    print(f"Got frame: {len(frame.payload)} bytes, ts={frame.timestamp_us}")

asyncio.run(main())

Publish a stream

import asyncio
import moq_net as moq

async def main():
    async with moq.Client("https://relay.quic.video") as client:
        broadcast = moq.BroadcastProducer()

        # Publish an Opus audio track (init bytes from your encoder)
        audio = broadcast.publish_media("opus", opus_init_bytes)
        client.publish("my-stream", broadcast)

        # Write frames
        audio.write_frame(payload, timestamp_us=0)
        audio.write_frame(payload, timestamp_us=20000)

        # Clean up
        audio.finish()
        broadcast.finish()

asyncio.run(main())

Advanced: Manual origin wiring

For full control over the origin topology:

import moq_net as moq

origin = moq.OriginProducer()
client = moq.Client(
    "https://relay.quic.video",
    publish=origin,
    subscribe=origin,
)

API

Connection

  • Client(url, *, tls_verify=True, publish=None, subscribe=None) — async context manager for connecting to a relay

Publishing

  • BroadcastProducer() — create a broadcast to publish tracks into
    • .publish_media(format, init) → MediaProducer
    • .finish()
  • MediaProducer — write frames to a track
    • .write_frame(payload, timestamp_us)
    • .finish()

Subscribing

  • BroadcastConsumer — subscribe to tracks within a broadcast
    • .subscribe_catalog() → CatalogConsumer
    • .subscribe_media(name, max_latency_ms=10000) → MediaConsumer
    • await .catalog() → Catalog (convenience)
  • CatalogConsumer — async iterator of Catalog
  • MediaConsumer — async iterator of Frame

Origin (advanced)

  • OriginProducer() — manage broadcast announcements
    • .consume() → OriginConsumer
    • .publish(path, broadcast)
  • OriginConsumer — discover broadcasts
    • .announced(prefix) → Announced (async iterator)
    • .announced_broadcast(path) → AnnouncedBroadcast (awaitable)

Types

  • Catalog.audio: dict[str, Audio], .video: dict[str, Video], .display, .rotation, .flip
  • Frame.payload: bytes, .timestamp_us: int, .keyframe: bool
  • Audio.codec, .sample_rate, .channel_count, .bitrate, .description
  • Video.codec, .coded: Dimensions, .display_ratio, .bitrate, .framerate, .description
  • Dimensions.width: int, .height: int

See Also

  • moq-ffi — raw UniFFI bindings (lower-level)
  • MoQ project — full monorepo with Rust server, TypeScript browser lib, and more

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

moq_net-0.1.0.tar.gz (9.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

moq_net-0.1.0-py3-none-any.whl (7.6 kB view details)

Uploaded Python 3

File details

Details for the file moq_net-0.1.0.tar.gz.

File metadata

  • Download URL: moq_net-0.1.0.tar.gz
  • Upload date:
  • Size: 9.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for moq_net-0.1.0.tar.gz
Algorithm Hash digest
SHA256 db3be2698559ade55647bfa510b63f38d4f9fa80e3c0c3b71f801d47147758a7
MD5 0d55c3a8cdad7e445bbc706c63f21032
BLAKE2b-256 ee2a2edb812e3af05e8b655baa9c6076c4afa7394b887dedbaad87048a071c79

See more details on using hashes here.

File details

Details for the file moq_net-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: moq_net-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 7.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for moq_net-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 2a0e8f32d153372556fff3a67390af541c0d89d2cad7d4bde757c4164680f3f2
MD5 5ce3d156e6f18b3f9887b14ff1017d2d
BLAKE2b-256 1018803a2d7b6350c3e202bccaa99e73d52e7a9b18ed4e36b5e4f41d2ad5b288

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page