{"id":27287377,"url":"https://github.com/englishm/moq-rs","last_synced_at":"2025-04-11T20:19:39.052Z","repository":{"id":276822681,"uuid":"873121011","full_name":"englishm/moq-rs","owner":"englishm","description":"Fork of kixelated/moq-rs to continue tracking the IETF MoQ Working Group drafts","archived":false,"fork":false,"pushed_at":"2025-02-28T15:26:00.000Z","size":1402,"stargazers_count":17,"open_issues_count":24,"forks_count":19,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-04-11T20:19:32.011Z","etag":null,"topics":["livestreaming","lowlatency","mediaoverquic","moq","quic"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/englishm.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE-APACHE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-10-15T16:27:12.000Z","updated_at":"2025-03-10T09:00:44.000Z","dependencies_parsed_at":"2025-02-10T17:22:42.174Z","dependency_job_id":"095b7ba3-64ef-4f27-bf02-4078656b5964","html_url":"https://github.com/englishm/moq-rs","commit_stats":null,"previous_names":["englishm/moq-rs"],"tags_count":31,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/englishm%2Fmoq-rs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/englishm%2Fmoq-rs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/englishm%2Fmoq-rs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/englishm%2Fmoq-rs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/englishm","download_url":"https://codeload.github.com/englishm/moq-rs/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248473102,"owners_count":21109629,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["livestreaming","lowlatency","mediaoverquic","moq","quic"],"created_at":"2025-04-11T20:19:38.263Z","updated_at":"2025-04-11T20:19:39.044Z","avatar_url":"https://github.com/englishm.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n\t\u003cimg height=\"128px\" src=\"https://github.com/kixelated/moq-rs/blob/main/.github/logo.svg\" alt=\"Media over QUIC\"\u003e\n\u003c/p\u003e\n\nMedia over QUIC (MoQ) is a live media delivery protocol utilizing QUIC streams.\nSee [quic.video](https://quic.video) for more information.\n\nThis repository contains a few crates:\n\n-   **moq-relay**: Accepting content from publishers and serves it to any subscribers.\n-   **moq-pub**: Publishes fMP4 broadcasts.\n-   **moq-transport**: An implementation of the underlying MoQ protocol.\n-   **moq-api**: A HTTP API server that stores the origin for each broadcast, backed by redis.\n-   **moq-dir**: Aggregates announcements, used to discover broadcasts.\n-   **moq-clock**: A dumb clock client/server just to prove MoQ is more than media.\n\nThere's currently no way to view media with this repo; you'll need to use [moq-js](https://github.com/kixelated/moq-js) for that.\nA hosted version is available at [quic.video](https://quic.video) and accepts the `?host=localhost:4443` query parameter.\n\n# Development\n\nLaunch a basic cluster, including provisioning certs and deploying root certificates:\n\n```\nmake run\n```\n\nThen, visit https://quic.video/publish/?server=localhost:4443.\n\nFor more control, use the [dev helper scripts](dev/README.md).\n\n# Usage\n\n## moq-relay\n\n[moq-relay](moq-relay) is a server that forwards subscriptions from publishers to subscribers, caching and deduplicating along the way.\nIt's designed to be run in a datacenter, relaying media across multiple hops to deduplicate and improve QoS.\nThe relays optionally register themselves via the [moq-api](moq-api) endpoints, which is used to discover other relays and share broadcasts.\n\nNotable arguments:\n\n-   `--bind \u003cADDR\u003e` Listen on this address, default: `[::]:4443`\n-   `--tls-cert \u003cCERT\u003e` Use the certificate file at this path\n-   `--tls-key \u003cKEY\u003e` Use the private key at this path\n-   `--announce \u003cURL\u003e` Forward all announcements to this instance, typically [moq-dir](moq-dir).\n\nThis listens for WebTransport connections on `UDP https://localhost:4443` by default.\nYou need a client to connect to that address, to both publish and consume media.\n\n## moq-pub\n\nA client that publishes a fMP4 stream over MoQ, with a few restrictions.\n\n-   `separate_moof`: Each fragment must contain a single track.\n-   `frag_keyframe`: A keyframe must be at the start of each keyframe.\n-   `fragment_per_frame`: (optional) Each frame should be a separate fragment to minimize latency.\n\nThis client can currently be used in conjuction with either ffmpeg or gstreamer.\n\n### ffmpeg\n\nmoq-pub can be run as a binary, accepting a stream (from ffmpeg via stdin) and publishing it to the given relay.\nSee [dev/pub](dev/pub) for the required ffmpeg flags.\n\n### gstreamer\n\nmoq-pub can also be run as a library, currently used for a [gstreamer plugin](https://github.com/kixelated/moq-gst).\nThis is in a separate repository to avoid gstreamer being a hard requirement.\nSee [run](https://github.com/kixelated/moq-gst/blob/main/run) for an example pipeline.\n\n## moq-transport\n\nA media-agnostic library used by [moq-relay](moq-relay) and [moq-pub](moq-pub) to serve the underlying subscriptions.\nIt has caching/deduplication built-in, so your application is oblivious to the number of connections under the hood.\n\nSee the published [crate](https://crates.io/crates/moq-transport) and [documentation](https://docs.rs/moq-transport/latest/moq_transport/).\n\n## moq-clock\n\n[moq-clock](moq-clock) is a simple client that can publish or subscribe to the current time.\nIt's meant to demonstate that [moq-transport](moq-transport) can be used for more than just media.\n\n## moq-dir\n\n[moq-dir](moq-dir) is a server that aggregates announcements.\nIt produces tracks based on the prefix, which are subscribable and can be used to discover broadcasts.\n\nFor example, if a client announces the broadcast `.public.room.12345.alice`, then `moq-dir` will produce the following track:\n\n```\nTRACK namespace=. track=public.room.12345.\nOBJECT +alice\n```\n\nUse the `--announce \u003cmoq-dir-url\u003e` flag when running the relay to forward all announcements to the instance.\n\n## moq-api\n\nThis is a API server that exposes a REST API.\nIt's used by relays to inserts themselves as origins when publishing, and to find the origin when subscribing.\nIt's basically just a thin wrapper around redis that is only needed to run multiple relays in a (simple) cluster.\n\n# License\n\nLicensed under either:\n\n-   Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)\n-   MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fenglishm%2Fmoq-rs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fenglishm%2Fmoq-rs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fenglishm%2Fmoq-rs/lists"}