hang

Crates.iohang
lib.rshang
version0.5.5
created_at2025-03-24 00:09:59.801994+00
updated_at2025-09-22 21:33:02.474514+00
descriptionMedia over QUIC
homepage
repositoryhttps://github.com/kixelated/moq
max_upload_size
id1603218
size114,756
(kixelated)

documentation

README

Documentation Crates.io License: MIT

hang

A media library built on top of moq-lite for streaming audio and video. hang provides media-specific functionality, split into a few components:

  • Broadcast: A discoverable collection of tracks, documented using a catalog.
  • Catalog: Metadata describing the available tracks, codec information, etc. This is a live track itself and is updated as tracks are added/removed/changed.
  • Track: Audio/video streams, as well as other types of data.
  • Group: A group of pictures (video) or collection of samples (audio). Each group is independently decodable.
  • Frame: A timestamp and a codec payload pair.

Supported Codecs

We most of the implement the WebCodecs specification.

  • Video: H.264, H.265, VP8, VP9, AV1
  • Audio: AAC, Opus

CMAF Import

There's also a cmaf module that can import fMP4/CMAF files into a hang broadcast. It's crude and doesn't support all features, but it's a good starting point to ingest existing content.

Example

use hang::{BroadcastProducer, Frame};

let mut broadcast = BroadcastProducer::new();

// Create a video track
let video = hang::catalog::Video {
    track: moq_lite::Track { name: "video".to_string(), priority: 1 },
	// Decoder configuration.
    config: Default::default(),
};
let mut track = broadcast.create_video(video);

// NOTE: Unlike moq_lite, you don't create a group producer.
// One will be created automatically when you write a keyframe.

let frame = Frame {
    timestamp: std::time::Duration::from_secs(1),
    keyframe: true,
    payload: b"video data".as_slice().into(),
};
track.write(frame);
Commit count: 645

cargo fmt