Skip to main content

Ergonomic Python wrapper for MoQ (Media over QUIC)

Project description

moq-lite

Ergonomic Python wrapper for MoQ (Media over QUIC) — a next-generation live media delivery protocol providing real-time latency at massive scale.

moq-lite wraps the auto-generated moq-ffi bindings with a Pythonic API: no Moq prefixes, async iterators, context managers, and simplified connection setup.

Installation

pip install moq-lite

Quick Start

Subscribe to a stream

import asyncio
import moq_lite 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_lite 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_lite 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_lite-0.0.3.tar.gz (8.1 kB view details)

Uploaded Source

Built Distribution

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

moq_lite-0.0.3-py3-none-any.whl (7.4 kB view details)

Uploaded Python 3

File details

Details for the file moq_lite-0.0.3.tar.gz.

File metadata

  • Download URL: moq_lite-0.0.3.tar.gz
  • Upload date:
  • Size: 8.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.2 {"installer":{"name":"uv","version":"0.11.2","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_lite-0.0.3.tar.gz
Algorithm Hash digest
SHA256 77c8887fdd97e592f07a097bfd9ac8a4e894eb2868692cf1e37a9be998056388
MD5 129b1541112e1d0194942bc663d649e3
BLAKE2b-256 bb40fbea8253b1322b2d54acaaec7da1e1ae7c157dc9ae05ee29019bb8c29c3c

See more details on using hashes here.

File details

Details for the file moq_lite-0.0.3-py3-none-any.whl.

File metadata

  • Download URL: moq_lite-0.0.3-py3-none-any.whl
  • Upload date:
  • Size: 7.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.2 {"installer":{"name":"uv","version":"0.11.2","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_lite-0.0.3-py3-none-any.whl
Algorithm Hash digest
SHA256 177cbaf87c947bcf60994f4f20d9545b18797e811de359e70897ce997167940e
MD5 b4cedb36d599c02acfb5489adda8550c
BLAKE2b-256 3eb059db3e3fed2462ea8b51ace5490b79313acf7ca0eae43da4d80c205a766b

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