Skip to content

1majom/moq-rs

This branch is 88 commits ahead of, 171 commits behind kixelated/moq-rs:refs/heads/main.

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Oct 31, 2024
287df1b · Oct 31, 2024
Jul 10, 2023
May 8, 2024
Sep 27, 2024
Aug 12, 2024
Jul 24, 2024
Aug 19, 2024
Aug 16, 2024
Aug 16, 2024
Aug 16, 2024
Aug 19, 2024
Sep 27, 2024
Aug 16, 2024
Nov 3, 2023
Oct 12, 2023
Oct 8, 2024
May 25, 2023
Jul 25, 2024
Jul 8, 2024
Jul 5, 2023
Jul 5, 2023
Aug 12, 2024
Oct 29, 2024
Oct 9, 2024
Aug 13, 2024
Jul 10, 2024
Oct 31, 2024
Aug 13, 2024
Oct 3, 2024
Sep 3, 2024
Oct 3, 2024

Repository files navigation

About this branch

This project tries to put the very well written Media over QUIC implementation, moq-rs into a custom topology inside mininet. Before the changes of moqtransfork. The project is closely connected to Zotyamester/cdn-optimizer (later referenced as cdn-opti) which can be used as an alternative api instead of the moq-api provided by the original project. The main difference between these that with moq-api the subscriber's relay will always get the publisher's relay without any inbetween relays, only using one link from our relay mesh network. The cdn-opti instead will use the provided costs to calculate a more optimal route while using more then 1 links.

For the whole project to work on a fresh Ubuntu 22.04 machine the vm_start.sh file should be downloaded alone and ran in the folder where we want to see the moq-rs and other projects folders. Also a the_path.py file is needed to be created inside that we the following. And also a venv variable which is all is correctly set up should be the command activating the venv under the venv folder.

PATH_GO=# ':' and the path to go
venv=# source and the venv activate file or nothing if the needed python modules for the cdn-opti are installed systemwide
user=# insert echo $USER here
cargopath=# the path to the cargo bin
test_set = [
	#the wanted tests as a list of tuples, first the topology file, then the wanted API (origi or opti), and lastly clock or gst, latter is better right now
	#two examples
    # ("small_topo_ps.yaml","origi", "gst"),
    # ("small_topo_ps_yaml","opti", "gst"), 
]
# the following are wait times
wait_between_pubs=3
wait_after_pubs=2
wait_between_subs=0.8

Right now to start the good_try.py mininet script we need a topology file. These topology files are gotten from the cdn-opti repo which should be cloned next to this one so it can be reached. Here is a sample topology file:

first_hop_relay:
  - relayid: "node1"
    track: "bbb-720_1000"
last_hop_relay:
  - relayid: "node2"
    track: "bbb-720_1000"

nodes:
  - name: "node1"
    location:
      - 40.7128
      - -74.0060
  - name: "node2"
    location:
      - 37.7749
      - -122.4194

edges:
  - node1: "node1"
    node2: "node2"
    attributes:
      latency: 0
      cost: 0.01
	  underlay_length: 1
  • nodes: are the relays, which can be used in edges, also the length of this list will imply how many relays are there in the topology

  • edges: are the connections between the relays. the provided latency will be applied to the mininet topology, and the cost will be used by the cdn-opti api, the underlay_length will be used when evaluating the measurements

  • in the following list we can provide the publishers by specifying their starting relay and the track name that they will use

  • it is important that the trackname should follow the following naming convention:

    • {id, with one publisher it is not needed}_{the filename of the wanted video w/o .mp4}_{the cost budget that the cdn-opti should use}
  • filename provided by downloading the video files (the first few are converted to that resolution, the latter ones are cut to 30secs) from the vm_start.sh:

    • bbb-{720|480|360|720-30|480-30|360-30}
  • its important that each relay can only have 1 publisher/subscriber when using the cdn-opti

  • All used topology files can be found in cdn-opti repo under the datasources folder

Bellow we can see the original readme of the moq-rs project.


Media over QUIC

Media over QUIC (MoQ) is a live media delivery protocol utilizing QUIC streams. See quic.video for more information.

This repository contains a few crates:

  • moq-relay: Accepting content from publishers and serves it to any subscribers.
  • moq-pub: Publishes fMP4 broadcasts.
  • moq-transport: An implementation of the underlying MoQ protocol.
  • moq-api: A HTTP API server that stores the origin for each broadcast, backed by redis.
  • moq-dir: Aggregates announcements, used to discover broadcasts.
  • moq-clock: A dumb clock client/server just to prove MoQ is more than media.

There's currently no way to view media with this repo; you'll need to use moq-js for that. A hosted version is available at quic.video and accepts the ?host=localhost:4443 query parameter.

Development

Launch a basic cluster, including provisioning certs and deploying root certificates:

make run

Then, visit https://quic.video/publish/?server=localhost:4443.

For more control, use the dev helper scripts.

Usage

moq-relay

moq-relay is a server that forwards subscriptions from publishers to subscribers, caching and deduplicating along the way. It's designed to be run in a datacenter, relaying media across multiple hops to deduplicate and improve QoS. The relays optionally register themselves via the moq-api endpoints, which is used to discover other relays and share broadcasts.

Notable arguments:

  • --bind <ADDR> Listen on this address, default: [::]:4443
  • --tls-cert <CERT> Use the certificate file at this path
  • --tls-key <KEY> Use the private key at this path
  • --announce <URL> Forward all announcements to this instance, typically moq-dir.

This listens for WebTransport connections on UDP https://localhost:4443 by default. You need a client to connect to that address, to both publish and consume media.

moq-pub

A client that publishes a fMP4 stream over MoQ, with a few restrictions.

  • separate_moof: Each fragment must contain a single track.
  • frag_keyframe: A keyframe must be at the start of each keyframe.
  • fragment_per_frame: (optional) Each frame should be a separate fragment to minimize latency.

This client can currently be used in conjuction with either ffmpeg or gstreamer.

ffmpeg

moq-pub can be run as a binary, accepting a stream (from ffmpeg via stdin) and publishing it to the given relay. See dev/pub for the required ffmpeg flags.

gstreamer

moq-pub can also be run as a library, currently used for a gstreamer plugin. This is in a separate repository to avoid gstreamer being a hard requirement. See run for an example pipeline.

moq-transport

A media-agnostic library used by moq-relay and moq-pub to serve the underlying subscriptions. It has caching/deduplication built-in, so your application is oblivious to the number of connections under the hood.

See the published crate and documentation.

moq-clock

moq-clock is a simple client that can publish or subscribe to the current time. It's meant to demonstate that moq-transport can be used for more than just media.

moq-dir

moq-dir is a server that aggregates announcements. It produces tracks based on the prefix, which are subscribable and can be used to discover broadcasts.

For example, if a client announces the broadcast .public.room.12345.alice, then moq-dir will produce the following track:

TRACK namespace=. track=public.room.12345.
OBJECT +alice

Use the --announce <moq-dir-url> flag when running the relay to forward all announcements to the instance.

moq-api

This is a API server that exposes a REST API. It's used by relays to inserts themselves as origins when publishing, and to find the origin when subscribing. It's basically just a thin wrapper around redis that is only needed to run multiple relays in a (simple) cluster.

License

Licensed under either:

About

Rust library for Media over QUIC

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Rust 81.5%
  • Python 13.5%
  • Shell 4.4%
  • Other 0.6%