| Internet-Draft | MOQT Streaming Format | March 2026 |
| Law | Expires 13 September 2026 | [Page] |
This document specifies the MOQT Streaming Format, designed to operate on Media Over QUIC Transport.¶
This note is to be removed before publishing as an RFC.¶
The latest revision of this draft can be found at https://moq-wg.github.io/msf/ draft-ietf-moq-msf.html. Status information for this document may be found at https://datatracker.ietf.org/doc/draft-ietf-moq-msf/.¶
Discussion of this document takes place on the Media Over QUIC Working Group mailing list (mailto:moq@ietf.org), which is archived at https://mailarchive.ietf.org/arch/browse/moq/. Subscribe at https://www.ietf.org/mailman/listinfo/moq/.¶
Source for this draft and an issue tracker can be found at https://github.com/moq-wg/msf.¶
This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79.¶
Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet-Drafts is at https://datatracker.ietf.org/drafts/current/.¶
Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress."¶
This Internet-Draft will expire on 13 September 2026.¶
Copyright (c) 2026 IETF Trust and the persons identified as the document authors. All rights reserved.¶
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Revised BSD License.¶
MOQT Streaming Format (MSF) is a media format designed to deliver LOC [LOC] compliant media content over Media Over QUIC Transport (MOQT) [MoQTransport]. MSF works by fragmenting the bitstream into objects that can be independently transmitted. MSF leverages a catalog format to describe the output of the original publisher. MSF specifies how content should be packaged and signaled, defines how the catalog communicates the content, specifies prioritization strategies for real-time and workflows for beginning and terminating broadcasts. MSF also details how end-subscribers may perform adaptive bitrate switching. MSF is targeted at real-time and interactive levels of live latency, as well as VOD content.¶
This document describes version 1 of the streaming format.¶
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.¶
This document uses the conventions detailed in Section 1.3 of [RFC9000] when describing the binary encoding.¶
The purpose of MSF is to provide an interoperable media streaming format operating over [MoQTransport]. Interoperability implies that:¶
An original publisher can package incoming media content into tracks, prepare a catalog and announce the availability of the content to an MOQT relay. Media content refers to audio and video data, as well as ancillary data such as captions, subtitles, accessibility and other timed-text data.¶
An MOQT relay can process the announcement as well as cache and propagate the tracks, both to other relays or to the final subscriber.¶
A final subscriber can parse the catalog, request tracks, decode and render the received media data.¶
MSF is intended to provide a format for delivering commercial media content. To that end, the following features are within scope:¶
Catalog track - describes the availability and characteristics of content produced by the original publisher.¶
Timeline track - describes the relationship between MOQT Group and Object IDs to media time.¶
Token-based authorization and access control¶
Captions + Subtitles - support for [WEBVTT] and [IMSC1] transmission¶
Latency support across multiple regimes (thresholds are informative only and describe the delay between the original publisher placing the content on the wire and the final subscriber rendering it)¶
Real-time - less than 500ms¶
Interactive - between 500ms and 2500ms¶
Standard - above 2500ms¶
VOD latency - content that was previously produced, is no longer live and is available indefinitely.¶
Content encryption¶
ABR between time-synced tracks - subscribers may switch between tracks at different quality levels in order to maximize visual or audio quality under conditions of throughput variability.¶
Capable of delivering interstitial advertising.¶
Logs and analytics management - support for the reporting of client-side QoE and relay delivery actions.¶
Initial versions of MSF will prioritize basic features necessary to exercise interoperability across delivery systems. Later versions will add commercially necessary features.¶
MSF delivers LOC [LOC] packaged media bitstreams.¶
This specification references Low Overhead Container (LOC) [LOC] to define how audio and video content is packaged. With this packaging mode, each EncodedAudioChunk or EncodedVideoChunk sample is placed in a separate MOQT Object. Samples that belong to the same Group of Pictures (GOP) MUST be placed within the same MOQT Group.¶
When LOC packaging is used for a track, the catalog packaging attribute (Section 5.3.4) MUST be present and it MUST be populated with a value of "loc".¶
MSF Tracks MAY be time-aligned. Those that are, are subject to the following requirements:¶
Tracks advertised in the catalog as belonging to a common alternate group MUST be time-aligned.¶
The render duration of the first media object of each equally numbered MOQT Group, after decoding, MUST have overlapping presentation time.¶
A consequence of this restriction is that an MSF receiver SHOULD be able to cleanly switch between time-aligned media tracks at group boundaries.¶
MSF supports end-to-end encryption of media content using MoQ Secure Objects [SecureObjects]. When encryption is enabled, the payload of LOC-packaged media objects is encrypted and authenticated, while relays can still route content based on unencrypted header information.¶
The encryption scheme and parameters are signaled in the catalog using the following track-level fields:¶
encryptionScheme Section 5.3.31 - identifies the encryption mechanism¶
cipherSuite Section 5.3.32 - specifies the AEAD algorithm¶
keyId Section 5.3.33 - identifies the key material for decryption¶
trackBaseKey Section 5.3.34 - the base key material for this track¶
When the encryptionScheme field is present in a track definition, subscribers MUST decrypt the object payload using the specified scheme before processing.¶
The keyId and trackBaseKey values are obtained from an external key management system and the mechanism for obtaining these values is out of scope for this specification. Examples of key management systems include MLS-based key distribution [E2EE-MLS] or other out-of-band key exchange mechanisms.¶
Depending on the key management mechanism in use, a keyId MAY be scoped to:¶
Publishers and subscribers MUST use the same key management system and agree on the keyId scope semantics for interoperable operation.¶
The RECOMMENDED encryption scheme for MSF is "moq-secure-objects". Implementations supporting content encryption MUST implement the "moq-secure-objects" scheme as defined in [SecureObjects].¶
When using the "moq-secure-objects" scheme:¶
For LOC-packaged tracks with encryption enabled (see [SecureObjects], Section 4):¶
A Catalog is an MOQT Track that provides information about the other tracks being produced by a MSF publisher. A Catalog is used by MSF publishers for advertising their output and for subscribers in consuming that output. The payload of the Catalog object is opaque to Relays and can be end-to-end encrypted. The Catalog provides the names and namespaces of the tracks being produced, along with the relationship between tracks, properties of the tracks that consumers may use for selection and any relevant initialization data.¶
The catalog track MUST have a case-sensitive Track Name of "catalog".¶
A catalog object MAY be independent of other catalog objects or it MAY represent a delta update of a prior catalog object. The first catalog object published within a new group MUST be independent and MUST provide a complete catalog that does not require any prior catalog object for interpretation. Any catalog objects that precede the first object of the latest group MUST be ignored.¶
A catalog object SHOULD be published only when the availability of tracks changes.¶
Each catalog update MUST be mapped to an MOQT Object.¶
Subscribers accessing the catalog MUST use SUBSCRIBE with a Joining FETCH (offset = 0) in order to obtain the latest complete catalog along with all subsequent catalog objects, including delta updates, that follow.¶
A catalog is a JSON [JSON] document, comprised of a series of mandatory and optional fields. At a minimum, a catalog MUST provide all mandatory fields. A producer MAY add additional fields to the ones described in this draft. Custom field names MUST NOT collide with field names described in this draft. The order of field names within the JSON document is not important.¶
A parser MUST ignore fields it does not understand.¶
Table 1 lists the fields defined at the root of the catalog JSON object.¶
| Field | Name | Definition |
|---|---|---|
| MSF version | version | Section 5.1.1 |
| Generated at | generatedAt | Section 5.1.2 |
| Is Complete | isComplete | Section 5.1.3 |
| Tracks | tracks | Section 5.1.4 |
Required: Yes JSON Type: Number Location: Root Catalog¶
Specifies the version of MSF referenced by this catalog. There is no guarantee that future catalog versions are backwards compatible and field definitions and interpretation may change between versions. A subscriber MUST NOT attempt to parse a catalog version which it does not understand.¶
Required: Optional JSON Type: Number Location: Root Catalog¶
The wallclock time at which this catalog instance was generated, expressed as the number of milliseconds that have elapsed since January 1, 1970 (midnight UTC/GMT). This field SHOULD NOT be included if the isLive field is false.¶
Required: Optional JSON Type: Boolean Location: Root Catalog¶
A catalog-level indication that the broadcast is complete. This is a commitment that all tracks are complete, no new tracks will be added to the catalog, and no new content will be published on any track. Note that even if all individual tracks have isLive Section 5.3.7 set to FALSE, new tracks could still be added to the catalog until isComplete is set to TRUE. This field MUST NOT be included if it is FALSE. This field MUST NOT be removed from a catalog once it has been added.¶
Required: Yes JSON Type: Array Location: Root Catalog¶
An array of track objects Section 5.3.1.¶
Table 2 lists the fields used for delta update operations at the root level.¶
| Field | Name | Definition |
|---|---|---|
| Delta update | deltaUpdate | Section 5.2.1 |
| Add tracks | addTracks | Section 5.2.2 |
| Remove tracks | removeTracks | Section 5.2.3 |
| Clone tracks | cloneTracks | Section 5.2.4 |
Required: Optional JSON Type: Boolean Location: Delta Update¶
A Boolean that if true indicates that this catalog object represents a delta (or partial) update. A delta update has a restricted set of fields and special processing rules - see Section 5.4. This value SHOULD NOT be added to a catalog if it is false.¶
Required: Optional JSON Type: Array Location: Delta Update¶
Indicates a delta processing instruction to add new tracks. The value of this field is an Array of track objects Section 5.3.1. This field MUST NOT be present when the deltaUpdate field is absent or false.¶
Required: Optional JSON Type: Array Location: Delta Update¶
Indicates a delta processing instruction to remove new tracks. The value of this field is an Array of track objects Section 5.3.1. Each track object MUST include a Track Name Section 5.3.3 field, MAY include a Track Namespace Section 5.3.2 field and MUST NOT hold any other fields. This field MUST NOT be present when the deltaUpdate field is absent or false.¶
Required: Optional JSON Type: Array Location: Delta Update¶
Indicates a delta processing instruction to clone new tracks from previously declared tracks. The value of this field is an Array of track objects Section 5.3.1. Each track object MUST include a Parent Name Section 5.3.29 field. This field MUST NOT be present when the deltaUpdate field is absent or false.¶
Table 3 lists the fields defined within each track object.¶
| Field | Name | Definition |
|---|---|---|
| Track namespace | namespace | Section 5.3.2 |
| Track name | name | Section 5.3.3 |
| Packaging | packaging | Section 5.3.4 |
| Event timeline type | eventType | Section 5.3.5 |
| Is Live | isLive | Section 5.3.7 |
| Target latency | targetLatency | Section 5.3.8 |
| Track role | role | Section 5.3.6 |
| Track label | label | Section 5.3.9 |
| Render group | renderGroup | Section 5.3.10 |
| Alternate group | altGroup | Section 5.3.11 |
| Initialization data | initData | Section 5.3.12 |
| Dependencies | depends | Section 5.3.13 |
| Temporal ID | temporalId | Section 5.3.15 |
| Spatial ID | spatialId | Section 5.3.16 |
| Codec | codec | Section 5.3.17 |
| Mime type | mimeType | Section 5.3.18 |
| Framerate | framerate | Section 5.3.19 |
| Timescale | timescale | Section 5.3.20 |
| Bitrate | bitrate | Section 5.3.21 |
| Width | width | Section 5.3.22 |
| Height | height | Section 5.3.23 |
| Audio sample rate | samplerate | Section 5.3.24 |
| Channel configuration | channelConfig | Section 5.3.25 |
| Display width | displayWidth | Section 5.3.26 |
| Display height | displayHeight | Section 5.3.27 |
| Language | lang | Section 5.3.28 |
| Parent name | parentName | Section 5.3.29 |
| Track duration | trackDuration | Section 5.3.30 |
A track object is a JSON Object containing a collection of fields whose location is specified in Table 3.¶
Required: Optional JSON Type: String Location: Track Object¶
The name space under which the track name is defined. See section 2.3 of [MoQTransport]. The track namespace is optional. If it is not declared within a track, then each track MUST inherit the namespace of the catalog track. A namespace declared in a track object overrides any inherited name space.¶
Required: Yes JSON Type: String Location: Track Object¶
A string defining the name of the track. See section 2.3 of [MoQTransport]. Within the catalog, track names MUST be unique per namespace.¶
Required: Yes JSON Type: String Location: Track Object¶
A string defining the type of payload encapsulation. Allowed values are strings as defined in Table 4.¶
Table 4: Allowed packaging values¶
| Name | Value | Reference |
|---|---|---|
| LOC | loc | See RFC XXXX |
| Media Timeline | mediatimeline | See Section 7 |
| Event Timeline | eventtimeline | See Section 8 |
Required: Optional JSON Type: String Location: Track Object¶
A String defining the type & structure of the data contained within the data field of the Event timeline track. Types are defined by the application provider and are not centrally registered. Implementers are encouraged to use a unique naming scheme, such as Reverse Domain Name Notation, where domain name components are listed in reverse order (e.g., "com.example.myeventtype"), to avoid naming collisions. This field is required if the Section 5.3.4 value is "eventtimeline". This field MUST NOT be used if the packaging value is not "eventtimeline".¶
Required: Optional JSON Type: String Location: Track Object¶
A string defining the role of content carried by the track. Specified roles are described in Table 5. These role values are case-sensitive.¶
This role field MAY be used in conjunction with the Mimetype Section 5.3.18 to fully describe the content of the track.¶
Table 5: Reserved track roles¶
| Role | Description |
|---|---|
| audiodescription | An audio description for visually impaired users |
| video | Visual content |
| audio | Audio content |
| mediatimeline | An MSF media timeline Section 7 |
| eventtimeline | An MSF event timeline Section 8 |
| caption | A textual representation of the audio track |
| subtitle | A transcription of the spoken dialogue |
| signlanguage | A visual track for hearing impaired users. |
Custom roles MAY be used as long as they do not collide with the specified roles.¶
Required: Yes JSON Type: Boolean Location: Track Object¶
A track-level indication of whether new Objects will be added to this specific track. True if new Objects will be added to the track. False if no new Objects will be added to the track. A False value is sent under two possible conditions: * the publisher of a previously live track has ended the track. * the track is Video-On-Demand (VOD) and was never live. A True value MUST never follow a False value.¶
Required: Optional JSON Type: Number Location: Track Object¶
The target latency in milliseconds. Target latency is defined as the offset in wallclock time between when content was encoded and when it is displayed to the end user. For example, if a frame of video is encoded at 10:08:32.638 UTC and the target latency is 5000, then that frame should be rendered to the end-user at 10:08:37.638 UTC. If isLive is FALSE, this field MUST be ignored. All tracks belonging to the same render group MUST have identical target latencies. All tracks belonging to the same alternate group MUST have identical target latencies. If this field is absent from the track definition, and isLive is TRUE, then the player MAY choose the latency with which it renders the content.¶
Required: Optional JSON Type: String Location: Track Object¶
A string defining a human-readable label for the track. Examples might be "Overhead camera view" or "Deutscher Kommentar". Note that the [JSON] spec requires UTF-8 support by decoders.¶
Required: Optional JSON Type: Number Location: Track Object¶
An integer specifying a group of tracks which are designed to be rendered together. Tracks with the same group number SHOULD be rendered simultaneously and are designed to accompany one another. A common example would be tying together audio and video tracks.¶
Required: Optional JSON Type: Number Location: Track Object¶
An integer specifying a group of tracks which are alternate versions of one-another. Alternate tracks represent the same media content, but differ in their selection properties. Alternate tracks MUST have matching media time sequences. A subscriber typically subscribes to one track from a set of tracks specifying the same alternate group number. A common example would be a set video tracks of the same content offered in alternate bitrates.¶
Required: Optional JSON Type: String Location: Track Object¶
A string holding Base64 [BASE64] encoded initialization data for the track.¶
Required: Optional JSON Type: Array Location: Track Object¶
Certain tracks may depend on other tracks for decoding. Dependencies holds an array of track names Section 5.3.3 on which the current track is dependent. Since only the track name is signaled, the namespace of the dependencies is assumed to match that of the track declaring the dependencies.¶
Location: T Required: Optional JSON Type: Array¶
A media timeline template for tracks with fixed-duration segments. It specifies the relationship between media time, MOQT Location, and wallclock time through starting points and intervals. See Section 7.4 for the complete format specification, field definitions, and computation formulas.¶
Tracks that include a template field SHOULD NOT also have a separate media timeline track, as the template provides equivalent functionality. Different tracks (e.g., audio and video) MAY have independent template values to accommodate different group durations.¶
Required: Optional JSON Type: Number Location: Track Object¶
A number identifying the temporal layer/sub-layer encoding of the track, starting with 0 for the base layer, and increasing by 1 for the next higher temporal fidelity.¶
Required: Optional JSON Type: Number Location: Track Object¶
A number identifying the spatial layer encoding of the track, starting with 0 for the base layer, and increasing by 1 for the next higher fidelity.¶
Required: Optional JSON Type: String Location: Track Object¶
A string defining the codec used to encode the track. For LOC packaged content, the string codec registrations are defined in Sect 3 and Section 4 of [WEBCODECS-CODEC-REGISTRY].¶
Required: Optional JSON Type: Number Location: Track Object¶
A number defining the framerate of the track, expressed as frames per second. This property SHOULD only accompany video or other frame-based content.¶
Required: Optional JSON Type: Number Location: Track Object¶
The number of time units that pass per second.¶
Required: Optional JSON Type: Number Location: Track Object¶
A number defining the bitrate of the track, expressed in bits per second.¶
Required: Optional JSON Type: Number Location: Track Object¶
A number expressing the encoded width of the video frames in pixels. This property SHOULD only accompany tracks which have a visual representation.¶
Required: Optional JSON Type: Number Location: Track Object¶
A number expressing the encoded height of the video frames in pixels. This property SHOULD only accompany tracks which have a visual representation.¶
Required: Optional JSON Type: Number Location: Track Object¶
The number of audio frame samples per second. This property SHOULD only accompany audio codecs.¶
Required: Optional JSON Type: String Location: Track Object¶
A string specifying the audio channel configuration. This property SHOULD only accompany audio codecs. A string is used in order to provide the flexibility to describe complex channel configurations for multi-channel and Next Generation Audio schemas.¶
Required: Optional JSON Type: Number Location: Track Object¶
A number expressing the intended display width of the track content in pixels. This property SHOULD only accompany tracks which have a visual representation.¶
Required: Optional JSON Type: Number Location: Track Object¶
A number expressing the intended display height of the track content in pixels. This property SHOULD only accompany tracks which have a visual representation.¶
Required: Optional JSON Type: String Location: Track Object¶
A string defining the dominant language of the track. The string MUST be one of the standard Tags for Identifying Languages as defined by [LANG].¶
Required: Optional JSON Type: String Location: Track Object¶
A string defining the parent track name Section 5.3.3 to be cloned. This field MUST only be included inside a Clone tracks Section 5.2.4 object.¶
Required: Optional JSON Type: Number Location: Track Object¶
The duration of the track expressed in integer milliseconds. This field MUST NOT be included if the isLive Section 5.3.7 field value is true.¶
Location: T Required: Optional JSON Type: String¶
A string identifying the encryption scheme used to protect the track content. The default and RECOMMENDED value is "moq-secure-objects" as defined in [SecureObjects]. If this field is absent, the track content is unencrypted.¶
Table 5: Registered encryption schemes¶
| Name | Value | Reference |
|---|---|---|
| MoQ Secure Objects | moq-secure-objects | [SecureObjects] |
Custom encryption schemes MAY be used. Custom scheme names SHOULD use Reverse Domain Name Notation to avoid collisions (e.g., "com.example.custom-encryption").¶
Location: T Required: Optional JSON Type: String¶
A string identifying the AEAD cipher suite used for encryption. This field MUST be present when encryptionScheme is specified. For the "moq-secure-objects" scheme, the following cipher suites are defined:¶
Table 6: Cipher suites for moq-secure-objects¶
| Name | Value | Tag Size |
|---|---|---|
| AES-128-GCM-SHA256 | aes-128-gcm-sha256 | 128 bits |
| AES-256-GCM-SHA512 | aes-256-gcm-sha512 | 128 bits |
| AES-128-CTR-HMAC-SHA256-80 | aes-128-ctr-hmac-sha256-80 | 80 bits |
Implementations MUST support "aes-128-gcm-sha256". Implementations SHOULD support "aes-128-ctr-hmac-sha256-80" for scenarios requiring smaller authentication tags.¶
Location: T Required: Optional JSON Type: String¶
A string identifying the key material used for encryption. This value is transmitted in the Secure Object KID extension header as defined in ([SecureObjects], Section 4.2) of each encrypted object.¶
The keyId and associated trackBaseKey are obtained from an external key management system. The mechanism for obtaining these values is out of scope for this specification. Examples include MLS-based key distribution [E2EE-MLS] or other out-of-band key exchange mechanisms.¶
The scope of a keyId is determined by the key management system in use. A keyId MAY be scoped to a single track, a single MSF session, or multiple tracks and sessions. When multiple tracks share the same Key ID, they MAY share the same base key material, though per-track keys are derived using the track name as defined in ([SecureObjects], Section 5).¶
Location: T Required: Optional JSON Type: String¶
A base64-encoded [BASE64] string containing the base key material for this track, as defined in ([SecureObjects], Section 5). This field works in conjunction with keyId to provide the cryptographic material needed for decryption. The trackBaseKey is obtained from the same key management system that provides the keyId.¶
When present, this field contains the raw key material that, together with the track name and other parameters defined in ([SecureObjects], Section 5), is used to derive the actual encryption keys. Publishers and subscribers MUST use matching trackBaseKey values for successful decryption.¶
A catalog update might contain incremental changes. This is a useful property if many tracks may be initially declared but then there are small changes to a subset of tracks. The producer can issue a delta update to describe these changes. Changes are described incrementally, meaning that a delta update can itself modify a prior delta update.¶
A restricted set of operations are allowed with each delta update: * Add a new track that has not previously been declared. * Add a new track by cloning a previously declared track. * Remove a track that has been previously declared.¶
The following rules are to be followed in constructing and processing delta updates:¶
A delta update MUST include the Delta Update Section 5.2.1 field set to true.¶
A delta update catalog MUST contain at least one instance of Add tracks Section 5.2.2, Remove tracks Section 5.2.3 or Clone Tracks Section 5.2.4 fields and MAY contain more. It MUST NOT contain an instance of a Tracks Section 5.1.4 field or an MSF version Section 5.1.1 field.¶
The Add, Delete and Clone operations are applied sequentially in the order they are declared in the document. Each operation in the sequence is applied to the target document; the resulting document becomes the target of the next operation. Evaluation continues until all operations are successfully applied.¶
A Cloned track inherits all the attributes of the track defined by the Parent Name Section 5.3.29, except the Track Name which MUST be new. Attributes redefined in the cloning Object override inherited values.¶
The tuple of Track Namespace and Track Name defines a fixed set of Track attributes which MUST NOT be modified after being declared. To modify any attribute, a new track with a different Namespace|Name tuple is created by Adding or Cloning and then the old track is removed.¶
Producers that publish frequent delta updates SHOULD periodically publish a new independent catalog in a new MOQT Group in order to bound the amount of delta processing required for joining subscribers.¶
Catalog field values MAY contain variables that are substituted at delivery time. This mechanism enables a single cached catalog to be customized for each viewer, supporting use cases such as personalized advertising, A/B watermarking, QoE reporting endpoints, and logging identifiers.¶
Variables are denoted by enclosing the variable name in percent characters (%).
Variable names MUST consist of alphanumeric characters, hyphens, and underscores.
Variable names are case-sensitive.¶
The percent character (%) MUST NOT appear in catalog field values except as
part of a variable reference. Literal percent characters are not permitted.¶
Variable values MUST consist only of alphanumeric characters, hyphens, underscores,
and the at sign (@). Special characters including commas, semicolons, quotes,
ampersands, and other punctuation MUST NOT appear in variable values. This
restriction prevents injection attacks and ensures safe substitution into
catalog field values.¶
Variables are resolved from the fragment identifier of the URI used to access
the catalog. The fragment identifier is the portion following the # character
and is processed entirely client-side, making it suitable for per-viewer
customization without affecting server-side caching.¶
Query parameters (following the ? character) are reserved for server-side
processing and MUST NOT be used for variable substitution.¶
When a subscriber requests a catalog using a URI containing a fragment identifier,
the fragment is parsed as key-value pairs (using & as delimiter and = as
separator). Each key becomes available as a variable name, and the variable
is replaced with the corresponding value.¶
The following section provides non-normative JSON examples of various catalogs compliant with this draft.¶
This example shows a catalog for a media producer capable of sending LOC packaged, time-aligned audio and video tracks.¶
{
"version": 1,
"generatedAt": 1746104606044,
"tracks": [
{
"name": "1080p-video",
"namespace": "conference.example.com/conference123/alice",
"packaging": "loc",
"isLive": true,
"targetLatency": 2000,
"role": "video",
"renderGroup": 1,
"codec":"av01.0.08M.10.0.110.09",
"width":1920,
"height":1080,
"framerate":30,
"bitrate":1500000
},
{
"name": "audio",
"namespace": "conference.example.com/conference123/alice",
"packaging": "loc",
"isLive": true,
"targetLatency": 2000,
"role": "audio",
"renderGroup": 1,
"codec":"opus",
"samplerate":48000,
"channelConfig":"2",
"bitrate":32000
}
]
}
¶
This example shows a catalog for a media producer capable of sending 3 time-aligned video tracks for high definition, low definition and medium definition video qualities, along with an audio track. In this example the namespace is absent, which infers that each track must inherit the namespace of the catalog.¶
{
"version": 1,
"generatedAt": 1746104606044,
"tracks":[
{
"name": "hd",
"renderGroup": 1,
"packaging": "loc",
"isLive": true,
"targetLatency": 1500,
"role": "video",
"codec":"av01",
"width":1920,
"height":1080,
"bitrate":5000000,
"framerate":30,
"altGroup":1
},
{
"name": "md",
"renderGroup": 1,
"packaging": "loc",
"isLive": true,
"targetLatency": 1500,
"role": "video",
"codec":"av01",
"width":720,
"height":640,
"bitrate":3000000,
"framerate":30,
"altGroup":1
},
{
"name": "sd",
"renderGroup": 1,
"packaging": "loc",
"isLive": true,
"targetLatency": 1500,
"role": "video",
"codec":"av01",
"width":192,
"height":144,
"bitrate":500000,
"framerate":30,
"altGroup":1
},
{
"name": "audio",
"renderGroup": 1,
"packaging": "loc",
"isLive": true,
"targetLatency": 1500,
"role": "audio",
"codec":"opus",
"samplerate":48000,
"channelConfig":"2",
"bitrate":32000
}
]
}
¶
This example shows a catalog for a media producer capable of sending scalable video codec with 2 spatial and 2 temporal layers with a dependency relation as shown below:¶
+----------+
+----------->| S1T1 |
| | 1080p30 |
| +----------+
| ^
| |
+----------+ |
| S1TO | |
| 1080p15 | |
+----------+ +-----+----+
^ | SOT1 |
| | 480p30 |
| +----------+
| ^
+----------+ |
| SOTO | |
| 480p15 |---------+
+----------+
¶
The corresponding catalog uses "depends" attribute to express the track relationships.¶
{
"version": 1,
"generatedAt": 1746104606044,
"tracks":[
{
"name": "480p15",
"namespace": "conference.example.com/conference123/alice",
"renderGroup": 1,
"packaging": "loc",
"isLive": true,
"role": "video",
"codec":"av01.0.01M.10.0.110.09",
"width":640,
"height":480,
"bitrate":3000000,
"framerate":15
},
{
"name": "480p30",
"namespace": "conference.example.com/conference123/alice",
"renderGroup": 1,
"packaging": "loc",
"isLive": true,
"role": "video",
"codec":"av01.0.04M.10.0.110.09",
"width":640,
"height":480,
"bitrate":3000000,
"framerate":30,
"depends": ["480p15"]
},
{
"name": "1080p15",
"namespace": "conference.example.com/conference123/alice",
"renderGroup": 1,
"packaging": "loc",
"isLive": true,
"role": "video",
"codec":"av01.0.05M.10.0.110.09",
"width":1920,
"height":1080,
"bitrate":3000000,
"framerate":15,
"depends":["480p15"]
},
{
"name": "1080p30",
"namespace": "conference.example.com/conference123/alice",
"renderGroup": 1,
"packaging": "loc",
"isLive": true,
"role": "video",
"codec":"av01.0.08M.10.0.110.09",
"width":1920,
"height":1080,
"bitrate":5000000,
"framerate":30,
"depends": ["480p30", "1080p15"]
},
{
"name": "audio",
"namespace": "conference.example.com/conference123/alice",
"renderGroup": 1,
"packaging": "loc",
"isLive": true,
"role": "audio",
"codec":"opus",
"samplerate":48000,
"channelConfig":"2",
"bitrate":32000
}
]
}
¶
This example shows the catalog delta update for a media producer adding two tracks to an established video conference. One track is newly declared, the other is cloned from a previous track.¶
{
"deltaUpdate": true,
"generatedAt": 1746104606044,
"addTracks": [
{
"name": "slides",
"isLive": true,
"role": "video",
"codec": "av01.0.08M.10.0.110.09",
"width": 1920,
"height": 1080,
"framerate": 15,
"bitrate": 750000,
"renderGroup": 1
}
],
"cloneTracks": [
{
"parentName": "video-1080",
"name": "video-720",
"width":1280,
"height":720,
"bitrate":600000
}
]
}
¶
This example shows a delta update for a media producer removing two tracks from an established video conference.¶
{
"deltaUpdate": true,
"generatedAt": 1746104606044,
"removeTracks": [{"name": "video"},{"name": "slides"}]
}
¶
This example shows a catalog for a media producer capable of sending LOC packaged, time-aligned audio and video tracks along with custom fields in each track description.¶
{
"version": 1,
"generatedAt": 1746104606044,
"tracks": [
{
"name": "1080p-video",
"namespace": "conference.example.com/conference123/alice",
"packaging": "loc",
"isLive": true,
"role": "video",
"renderGroup": 1,
"codec":"av01.0.08M.10.0.110.09",
"width":1920,
"height":1080,
"framerate":30,
"bitrate":1500000,
"com.example-billing-code": 3201,
"com.example-tier": "premium",
"com.example-debug": "h349835bfkjfg82394d945034jsdfn349fns"
},
{
"name": "audio",
"namespace": "conference.example.com/conference123/alice",
"packaging": "loc",
"isLive": true,
"role": "audio",
"renderGroup": 1,
"codec":"opus",
"samplerate":48000,
"channelConfig":"2",
"bitrate":32000
}
]
}
¶
This example shows a catalog for a media producer offering VOD (video on-demand) non-live content. The content is LOC packaged, and includes time-aligned audio and video tracks.¶
{
"version": 1,
"tracks": [
{
"name": "video",
"namespace": "movies.example.com/assets/boy-meets-girl-season3/episode5",
"packaging": "loc",
"isLive": false,
"trackDuration": 8072340,
"renderGroup": 1,
"codec":"av01.0.08M.10.0.110.09",
"width":1920,
"height":1080,
"framerate":30,
"bitrate":1500000
},
{
"name": "audio",
"namespace": "movies.example.com/assets/boy-meets-girl-season3/episode5",
"packaging": "loc",
"isLive": false,
"trackDuration": 8072340,
"renderGroup": 1,
"codec":"opus",
"samplerate":48000,
"channelConfig":"2",
"bitrate":32000
}
]
}
¶
This example shows a catalog for encrypted LOC-packaged audio and video tracks using MoQ Secure Objects with AES-128-GCM.¶
{
"version": 1,
"generatedAt": 1746104606044,
"tracks": [
{
"name": "1080p-video",
"namespace": "conference.example.com/conference123/alice",
"packaging": "loc",
"isLive": true,
"targetLatency": 2000,
"role": "video",
"renderGroup": 1,
"codec": "av01.0.08M.10.0.110.09",
"width": 1920,
"height": 1080,
"framerate": 30,
"bitrate": 1500000,
"encryptionScheme": "moq-secure-objects",
"cipherSuite": "aes-128-gcm-sha256",
"keyId": "key-2024-q1-premium",
"trackBaseKey": "dGhpc2lzYXNhbXBsZWJhc2VrZXk="
},
{
"name": "audio",
"namespace": "conference.example.com/conference123/alice",
"packaging": "loc",
"isLive": true,
"targetLatency": 2000,
"role": "audio",
"renderGroup": 1,
"codec": "opus",
"samplerate": 48000,
"channelConfig": "2",
"bitrate": 32000,
"encryptionScheme": "moq-secure-objects",
"cipherSuite": "aes-128-gcm-sha256",
"keyId": "key-2024-q1-premium",
"trackBaseKey": "dGhpc2lzYXNhbXBsZWJhc2VrZXk="
}
]
}
¶
This example shows a catalog for a media producer capable of sending LOC packaged, time-aligned audio and video tracks, along with a Media Timeline which describes the history of those tracks and an Event Timeline providing synchronized data.¶
{
"version": 1,
"generatedAt": 1746104606044,
"tracks": [
{
"name": "history",
"namespace": "conference.example.com/conference123/alice",
"packaging": "mediatimeline",
"mimetype": "application/json",
"depends": ["1080p-video","audio"]
},
{
"name": "identified-objects",
"namespace": "another-provider/time-synchronized-data",
"packaging": "eventtimeline",
"eventType": "com.ai-extraction/appID/v3",
"mimetype": "application/json",
"depends": ["1080p-video"]
},
{
"name": "1080p-video",
"namespace": "conference.example.com/conference123/alice",
"packaging": "loc",
"isLive": true,
"targetLatency": 2000,
"role": "video",
"renderGroup": 1,
"codec":"av01.0.08M.10.0.110.09",
"width":1920,
"height":1080,
"framerate":30,
"bitrate":1500000
},
{
"name": "audio",
"namespace": "conference.example.com/conference123/alice",
"packaging": "loc",
"isLive": true,
"targetLatency": 2000,
"role": "audio",
"renderGroup": 1,
"codec":"opus",
"samplerate":48000,
"channelConfig":"2",
"bitrate":32000
}
]
}
¶
This example shows a catalog using inline media timeline templates instead of an explicit media timeline track. The Section 5.3.14 attribute on each track defines a regular pattern where each segment is 2002ms long. Clients can compute any entry using the template parameters. Note that different tracks MAY have different template values to accommodate different group durations.¶
{
"version": 1,
"generatedAt": 1746104606044,
"tracks": [
{
"name": "1080p-video",
"namespace": "conference.example.com/conference123/alice",
"packaging": "loc",
"isLive": true,
"targetLatency": 2000,
"role": "video",
"renderGroup": 1,
"template": [0, 2002, [0, 0], [1, 0], 1759924158381, 2002],
"codec":"av01.0.08M.10.0.110.09",
"width":1920,
"height":1080,
"framerate":30,
"bitrate":1500000
},
{
"name": "audio",
"namespace": "conference.example.com/conference123/alice",
"packaging": "loc",
"isLive": true,
"targetLatency": 2000,
"role": "audio",
"renderGroup": 1,
"template": [0, 2002, [0, 0], [1, 0], 1759924158381, 2002],
"codec":"opus",
"samplerate":48000,
"channelConfig":"2",
"bitrate":32000
}
]
}
¶
This example shows a catalog for a media producer terminating a previously live broadcast containing a video and an audio track.¶
{
"version": 1,
"generatedAt": 1746104606044,
"isComplete": true,
"tracks": []
}
¶
This example shows a catalog using variable substitution to enable personalized advertising and reporting while maintaining cacheability. Given a catalog request URI of:¶
moqt://relay.example.com/sports/catalog?a=1#token=1234&id=bob&event=xyz¶
The fragment parameters (token, id, event) are available for variable
substitution. The following catalog template:¶
{
"version": 1,
"tracks": [
{
"name": "video",
"packaging": "loc",
"isLive": true,
"role": "video",
"renderGroup": 1
},
{
"name": "cmcdv2-%id%",
"namespace": "advertising-decisions/live-sports/%event%",
"packaging": "eventtimeline",
"eventType": "com.example.iab.vast",
"c4m": "%token%"
}
]
}
¶
Would be resolved by the subscriber as:¶
{
"version": 1,
"tracks": [
{
"name": "video",
"packaging": "loc",
"isLive": true,
"role": "video",
"renderGroup": 1
},
{
"name": "cmcdv2-bob",
"namespace": "advertising-decisions/live-sports/xyz",
"packaging": "eventtimeline",
"eventType": "com.example.iab.vast",
"c4m": "1234"
}
]
}
¶
The MOQT Groups and MOQT Objects need to be mapped to MOQT Streams. Irrespective of the Section 4 in place, each MOQT Object MUST be mapped to a new MOQT Stream.¶
The Group ID of the first Group published in a track at application startup MUST be a unique integer that will not repeat in the future. One approach to achieve this is to set the initial Group ID to the creation time of the first Object in the group, represented as the number of milliseconds since the Unix epoch, rounded to the nearest millisecond. This ensures that republishing the same track in the future, such as after a loss of connectivity or an encoder restart, will not result in smaller or duplicate Group IDs for the same track name. Note that this method does not prevent duplication if more than 1000 Groups are published per second.¶
Each subsequent Group ID MUST increase by 1.¶
If a publisher is able to maintain state across a republish, it MUST signal the gap in Group IDs using the MOQT Prior Group ID Gap Extension header.¶
The media timeline track provides data about the previously published Groups and their relationship to wallclock time and media time. Media timeline tracks allow players to seek to precise points behind the live head in a live broadcast, or for random access in a VOD asset. Media timeline tracks are optional. Multiple media timeline tracks can exist inside a catalog.¶
A media timeline track is a JSON [JSON] document. This document MAY be compressed using GZIP [GZIP]. The document supports two formats: an explicit entry format and a template format. Publishers MAY combine both formats in a single document.¶
The explicit format contains an array of records. Each record consists of an array of three required items, whose ordinal position defines their type:¶
The first item holds the media presentation timestamp, expressed as a JSON Number. This value MUST match the media presentation timestamp, rounded to the nearest millisecond, of the first media sample in the referenced Object¶
The second item holds the MOQT Location of the entry, defined as a tuple of the MOQT Group ID and MOQT Object ID, and expressed as a JSON Array of Numbers, where the first number is the Group ID and the second number is the Object ID.¶
The third item holds the wallclock time at which the media was encoded, defined as the number of milliseconds that have elapsed since January 1, 1970 (midnight UTC/GMT) and expressed as a JSON Number. For VOD assets, or if the wallclock time is not known, the value SHOULD be 0.¶
An example media timeline is shown below:¶
[ [0, [0,0], 1759924158381], [2002, [1,0], 1759924160383], [4004, [2,0], 1759924162385], [6006, [3,0], 1759924164387], [8008, [4,0], 1759924166389] ]¶
A media timeline track MUST carry a 'type' identifier in the Catalog with a value of "mediatimeline". A media timeline track MUST carry a 'depends' attribute which contains an array of all track names to which the media timeline track applies. The mime-type of a media timeline track MUST be specified as "application/json".¶
The publisher MUST publish an independent media timeline in the first MOQT Object of each MOQT Group of a media timeline track. The publisher MAY publish incremental updates in the second and subsequent Objects within each Group. Incremental updates only contain media timeline records since the last media timeline Object.¶
When the relationship between media time, MOQT Location and wallclock time follows a regular, predictable pattern, a media timeline template MAY be used instead of an explicit media timeline track. The template approach is best suited for content with fixed-duration segments, such as VOD assets or live broadcasts with constant segment durations. For content with variable segment durations, the explicit media timeline track (Section 7.1) MUST be used instead.¶
A media timeline template is expressed as an inline track attribute using the Section 5.3.14 field. The template is a JSON Array containing six mandatory values in the following fixed order:¶
startMediaTime - The media presentation timestamp of the first entry, as defined for media timeline entries in Section 7.1.1.¶
deltaMediaTime - The constant interval between media presentation timestamps, expressed as a JSON Number in milliseconds.¶
startLocation - The MOQT Location of the first entry, as defined for media timeline entries in Section 7.1.1.¶
deltaLocation - The constant interval between MOQT Locations, expressed as a JSON Array of two Numbers where the first number is the Group ID delta and the second number is the Object ID delta.¶
startWallclock - The wallclock time of the first entry, as defined for media timeline entries in Section 7.1.1. For VOD assets, or if the wallclock time is not known, the value SHOULD be 0.¶
deltaWallclock - The constant interval between wallclock times, expressed as a JSON Number in milliseconds. For VOD assets, or if the wallclock time is not known, the value SHOULD be 0.¶
All six values are mandatory and MUST appear in the specified order.¶
Clients compute entry values using the following formulas, where n is the zero-based entry index:¶
mediaTime[n] = startMediaTime + (n * deltaMediaTime)
location[n] = [startLocation[0] + (n * deltaLocation[0]),
startLocation[1] + (n * deltaLocation[1])]
wallclock[n] = startWallclock + (n * deltaWallclock)
¶
An example template value is shown below:¶
[0, 2002, [0, 0], [1, 0], 1759924158381, 2002]¶
This template indicates that the first entry has media time 0ms, location [0,0], and wallclock time 1759924158381. Each subsequent entry increments media time by 2002ms, location by [1,0] (next group, same object), and wallclock by 2002ms.¶
Unlike the explicit media timeline track, the media timeline template is intended to be immutable once publishing starts. Publishers MUST NOT change the template values for a track after the first Object has been published.¶
The event timeline track provides a mechanism to associate ad-hoc event metadata with the broadcast. Use-case examples include live sports score data, GPS coordinates of race cars, SAP-types for media segments or active speaker notifications in web conferences.¶
To allow the client to bind this event metadata with the broadcast content described by the media timeline track, each event record MUST contain a reference to one of Media PTS, wallclock time or MOQT Location.¶
Event timeline tracks are optional. Multiple event timeline tracks can exist inside a catalog. The type & structure of the data contained within each event timeline track is declared in the catalog, to facilitate client selection and parsing.¶
An event timeline track is a JSON [JSON] document. This document MAY be compressed using GZIP [GZIP]. The document contains an array of records. Each record consists of a JSON Object containing the following required fields:¶
An index reference, which MUST be either 't' for wallclock time, 'l' for Location or 'm' for Media PTS. Only one of these index values may be used within each record. Event timelines SHOULD use the same index reference type for each record. The definitions for wallclock time, Location and Media PTS are identical to those defined for media timeline payload Section 7.1. Wallclock time and media PTS values are JSON Number, while Location value is an Array of Numbers, where the first item represents the MOQT GroupID and the second item the MOQT Object ID.¶
A 'data' Object, whose structure is defined by the Section 5.3.5 value declared for this track in the Catalog.¶
An event timeline track MUST carry:¶
a Section 5.3.4 attribute with a value of "eventtimeline".¶
a Section 5.3.13 attribute which contains an array of all track names to which the event timeline track applies.¶
a Section 5.3.18 attribute with a value of "application/json".¶
an Section 5.3.5 attribute declaring the type & structure of data contained in the event timeline track.¶
The publisher MUST publish an independent event timeline in the first MOQT Object of each MOQT Group of an event timeline track. The publisher MAY publish incremental updates in the second and subsequent Objects within each Group. Incremental updates only contain event timeline records since the last event timeline Object.¶
This example shows how sports scores and game information might be defined in a live sports broadcast.¶
[
{
"t": 1756885678361,
"data": {
"status": "in_progress",
"period": 1,
"clock": "12:00",
"homeScore": 0,
"awayScore": 0,
"lastPlay": "Game Start"
}
},
{
"t": 1756885981542,
"data": {
"status": "in_progress",
"period": 1,
"clock": "09:25",
"homeScore": 2,
"awayScore": 0,
"lastPlay": "Team A: #23 makes 2-pt jump shot"
}
}
]
¶
This example shows drone GPS coordinates synched with the start of each Group.¶
[
{
"l": [0,0],
"data": [47.1812,8.4592]
},
{
"l": [1,0],
"data": [47.1662,8.5155]
}
]
¶
An MSF URL identifies a MOQT session and an optional sub-resource within that session. It inherits the MOQT URI scheme defined by MOQT [MoQTransport] and extends it to add a fragment definition, which encodes the namespace and name of the track along with optional key-value attributes.¶
"moqt" [ "+q" / "+wt" ] "://" authority path-abempty [ "?" query ] [ "#" msf-fragment ]¶
The MOQT specification carries the normative definition of these components, along with processing instructions. They are repeated here for clarity:¶
Scheme: This case-insensitive scheme defines the underlying transport.¶
Authority: Required. Contains the host and optional port (defaulting to 443). This information is used by the client to establish the transport session.¶
Path: Optional. If present, it provides server-specific configuration or routing information used during connection initialization.¶
Query: Optional. Contains key-value parameters separated by &. If the query is absent, the ? separator MUST be omitted. Query arguments are intended for the server and SHOULD ignored by the client.¶
The msf-fragment element is defined by the following ABNF:¶
msf-fragment = track-identifier [ "&" parameter-list ]
track-identifier = 1*( pchar-no-amp / "/" / "?" )
; MSF namespace-name string; MUST NOT contain '&'
parameter-list = parameter *( "&" parameter )
parameter = param-name "=" param-value
param-name = 1*( pchar-no-amp / "/" / "?" )
param-value = *( pchar-no-amp / "/" / "?" )
pchar-no-amp = unreserved / pct-encoded / "!" / "$" / "'" / "(" / ")"
/ "*" / "+" / "," / ";" / "=" / ":" / "@"
¶
msf-fragment: Optional. Identifies a specific Track. If present, the first element MUST be formatted as an MSF namespace-name string (see Section 9.1.2). The client uses this identifier to initiate a SUBSCRIBE or FETCH command once the transport session is established. The namespace-name string MAY be followed by a series of key-value parameters, separated by & from the namespace-name string and from each other. These key-value parameters are intended for processing by the client and, being part of the fragment, are not transferred to the server at connection time. Certain of the fragment key-value parameters have a reserved meaning, as defined by Section 9.1.1.¶
Table 5 defines reserved key names for the parameter portion of the msf-fragment. Keynames are case-sensitive.¶
| Name | Description |
|---|---|
| wallclock-range | A subclip defined by a wallclock time range |
| mediatime-range | A subclip defined by a media time range |
| location-range | A subclip defined by a MOQT Location range |
| c4m | A base64 encoded C4M token |
wallclock-range - a range defined by start and end wallclock times, each expressed as milliseconds since Unix Epoch and separated by a "-" dash. The dash and end time MAY be omitted to indicate an open range. The range definition is inclusive.¶
mediatime-range - a range defined by start and end media times, each expressed as milliseconds and separated by a "-" dash. The dash and end time MAY be omitted to indicate an open range. The range definition is inclusive.¶
location-range - a range defined by start and end media MOQT Location separated by a "-" dash. Range definitions are inclusive. MOQT Location is expressed as Group ID and Object ID separated by a "." dot. End Location may be omitted to indicate an open range. End Object ID may be ommited, indicating the whole end group is included in the range. The "." dot and "-" dash separators MUST be omitted when the second value is ommited.¶
If multiple ranges are specified within the same URL, the client shall process the union of those ranges.¶
Example fragment parameters:¶
wallclock-range=1761759637565-1761759836189¶
wallclock-range=1761751753894¶
mediatime-range=0-13421¶
mediatime-range=982¶
location-range=34.0-2145.16¶
location-range=16.24 //open range starting at Group ID 16 Object ID 24¶
location-range=16-24 // range from Group ID 16 through to and including all Objects in Group ID 24¶
c4m=gqhkYWxnIGVzaGFyqGR0eXBNhdZ9hdWQAY3VybGZlbWlzcwZleWV2aW5u ZWlhdGVwQWNyZW5lYnJmcmVqMTIzNDU2NzgwMHZpc3VlZF9hdD0xNzMwNDM¶
To represent MoQ Tuples (which are sequences of byte strings) within the URL fragment, MSF uses a specific encoding convention, which is normatively defined by MOQT [MoQTransport] and repeated here for convenience:¶
Hierarchy: Each element of the Namespace tuple is rendered in order, separated by a single hyphen (-).¶
Delimiter: The Track Name is appended to the end, separated from the namespace by a double hyphen (--).¶
Character Escaping:¶
Note: This encoding ensures that the structural delimiters (- and --) remain unambiguous.¶
URl with a required Webtransport connection pointing at a catalog track: moqt+wt://example.com/server/config?a=1&b=2#customer-livestream-123--catalog¶
URL with a required raw QUIC connection pointing at a catalog: moqt+q://example.com/relay-app/relayID#customerID-broadcastID--catalog¶
URL pointing at a non-catalog track (either Webtransport or native QUIC may be used): moqt://example.com/relay-app/relayID#customerID-broadcastID--video¶
URL pointing at a subclip: moqt://example.com/relay-app/relayID#customerID-broadcastID--catalog&location-range=34-64¶
URL pointing at a catalog and supplying a token for the client: moqt://example.com/relay-app/relayID#customerID-broadcastID-- catalog&c4m=gqhkYWxnIGVzaGFyqGR0eXBNhdZ9hdWQAY3VybGZlbWlzcwZl eWV2aW5uZWlhdGVwQWNyZW5lYnJmcmVqMTIzNDU2NzgwMHZpc3VlZF9hdD0xN zMwNDM¶
URL pointing at a catalog and supplying a token for the client along with a separate token for the server: moqt://example.com/relay-app/relayID?token=HTRCII74GHFT@JHBCV SW56HKKneH2Dbyq6NHBI2#customerID-broadcastID--catalog&c4m=gqh kYWxnIGVzaGFyqGR0eXBNhdZ9hdWQAY3VybGZlbWlzcwZleWV2aW5uZWlhdGV wQWNyZW5lYnJmcmVqMTIzNDU2NzgwMHZpc3VlZF9hdD0xNzMwNDM¶
An MSF publisher MUST publish a catalog track object before publishing any media track objects.¶
After publishing a catalog and defining tracks carrying live content, an original publisher can deliver a deterministic signal to all subscribers that the broadcast is complete by taking the following steps:¶
Send a SUBSCRIBE_DONE (See MOQT Sect 8.1.2) message for all active tracks using status code 0x2 Track Ended.¶
If the live stream is being converted instantly to a VOD asset, then publish an independent (non-delta) catalog update which, for each track, sets isLive Section 5.3.7 to FALSE and adds a track duration Section 5.3.30 field.¶
If the live stream is being terminated permanently without conversion to VOD, then publish an independent catalog update which signals isComplete Section 5.1.3 as TRUE and which contains an empty Tracks Section 5.1.4 field.¶
This document creates a new entry in the "MoQ Streaming Format" Registry (see [MoQTransport] Sect 8). The type value is 0x001, the name is "MOQT Streaming Format" and the RFC is XXX.¶
the MoQ Workgroup and mailing lists.¶