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.2.tar.gz (5.6 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.2-py3-none-any.whl (6.3 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: moq_lite-0.0.2.tar.gz
  • Upload date:
  • Size: 5.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.10.10 {"installer":{"name":"uv","version":"0.10.10","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.2.tar.gz
Algorithm Hash digest
SHA256 5d9a3f6ab32733a122c8fc59b801f94d585fe532a94919344fe69d2a156480d9
MD5 19825b44afc228020c2c7ddafda13e16
BLAKE2b-256 a8ac2b44e533f258be27158ce7e0241c72868a4684b0d50b692f95ce05e1d493

See more details on using hashes here.

File details

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

File metadata

  • Download URL: moq_lite-0.0.2-py3-none-any.whl
  • Upload date:
  • Size: 6.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.10.10 {"installer":{"name":"uv","version":"0.10.10","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.2-py3-none-any.whl
Algorithm Hash digest
SHA256 9b5a8e4de70d61e4f5da7e78aeff9595db2d563906d9b8b5e512109b2995644b
MD5 1bcb97d6e9a68c850e9ab1ec31cae1b3
BLAKE2b-256 6df24590749ec96ce1df2315e2d28a6ab5d5bce5f70ca0ef2aea1a913682f144

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