The following section provides non-normative JSON examples of various catalogs compliant with this draft.
5.6.1. Time-aligned Audio/Video Tracks with single quality
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
}
]
}
5.6.2. Simulcast video tracks - 3 alternate qualities along with audio
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
}
]
}
5.6.3. SVC video tracks with 2 spatial and 2 temporal qualities
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,
"buffers": {"target":2000},
"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,
"buffers": {"target":2000},
"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,
"buffers": {"target":2000},
"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,
"buffers": {"target":2000},
"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,
"buffers": {"target":2000},
"role": "audio",
"codec":"opus",
"samplerate":48000,
"channelConfig":"2",
"bitrate":32000
}
]
}
5.6.4. Delta update - adding two tracks
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.
{
"generatedAt": 1746104606044,
"deltaUpdate": [
{
"op": "add",
"tracks": [
{
"name": "slides",
"isLive": true,
"role": "video",
"codec": "av01.0.08M.10.0.110.09",
"width": 1920,
"height": 1080,
"framerate": 15,
"bitrate": 750000,
"renderGroup": 1
}
]
},
{
"op": "clone",
"tracks": [
{
"parentName": "video-1080",
"parentNamespace": "example.com/custom",
"name": "video-720",
"width": 1280,
"height": 720,
"bitrate": 600000
}
]
}
]
}
5.6.5. Delta update removing tracks
This example shows a delta update for a media producer removing two tracks from an established video conference.
{
"generatedAt": 1746104606044,
"deltaUpdate": [
{
"op": "remove",
"tracks": [{"name": "video"}, {"name": "slides"}]
}
]
}
5.6.6. Time-aligned Audio/Video Tracks with custom field values
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,
"buffers": {"target":2000, "min": 1500, "max": 5000},
"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,
"buffers": {"target":2000, "min": 1500, "max": 5000},
"role": "audio",
"renderGroup": 1,
"codec":"opus",
"samplerate":48000,
"channelConfig":"2",
"bitrate":32000
}
]
}
5.6.7. Time-aligned VOD Audio/Video Tracks
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
}
]
}
5.6.8. Encrypted Audio/Video Tracks
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="
}
]
}
5.6.9. Media timeline and Event timeline
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
}
]
}
5.6.10. Media timeline template
This example shows a catalog using inline media timeline templates instead of an explicit media timeline track. The Section 5.2.15 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
}
]
}
5.6.11. Video track with embedded captions and SCTE-35 events
This example shows a live broadcast with CEA-608 closed captions embedded in the video track and a separate SCTE-35 event timeline for ad insertion.
{
"version": "1",
"generatedAt": 1746104606044,
"tracks": [
{
"name": "video",
"packaging": "loc",
"isLive": true,
"targetLatency": 4000,
"role": "video",
"renderGroup": 1,
"codec": "avc1.4d401f",
"width": 1920,
"height": 1080,
"framerate": 30,
"bitrate": 5000000,
"accessibility": [
{
"scheme": "urn:scte:dash:cc:cea-608:2015",
"value": "CC1=eng;CC3=spa"
}
]
},
{
"name": "audio",
"packaging": "loc",
"isLive": true,
"targetLatency": 4000,
"role": "audio",
"renderGroup": 1,
"codec": "opus",
"samplerate": 48000,
"channelConfig": "2",
"bitrate": 128000
},
{
"name": "scte35",
"packaging": "eventtimeline",
"eventType": "urn:scte:scte35:2013:bin",
"mimeType": "application/json",
"isLive": true,
"role": "eventtimeline",
"depends": ["video"]
}
]
}
5.6.12. Video track with CEA-708 captions
This example shows a live broadcast with CEA-708 closed captions embedded in the video track, demonstrating multiple caption services.
{
"version": "1",
"generatedAt": 1746104606044,
"tracks": [
{
"name": "video",
"packaging": "loc",
"isLive": true,
"targetLatency": 4000,
"role": "video",
"renderGroup": 1,
"codec": "hev1.1.6.L93.B0",
"width": 1920,
"height": 1080,
"framerate": 30,
"bitrate": 4000000,
"accessibility": [
{
"scheme": "urn:scte:dash:cc:cea-708:2015",
"value": "1=lang:eng;2=lang:spa;3=lang:fra"
}
]
},
{
"name": "audio",
"packaging": "loc",
"isLive": true,
"targetLatency": 4000,
"role": "audio",
"renderGroup": 1,
"codec": "mp4a.40.2",
"samplerate": 48000,
"channelConfig": "2",
"bitrate": 128000
}
]
}
5.6.13. Terminating a live broadcast
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": []
}
5.6.14. Variable Substitution for personalized delivery
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"
}
]
}
5.6.16. Publish tracks for logs and metrics
This example shows a catalog that includes publish tracks for client-side logging and metrics collection. The subscriber can publish QoE data and logs back to the delivery system using these track definitions. The namespace and track name formats follow the conventions defined in [MOQLOG] and [MOQMETRICS].
{
"version": "1",
"generatedAt": 1746104606044,
"tracks": [
{
"name": "video",
"namespace": "broadcast.example.com/live/stream1",
"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": "broadcast.example.com/live/stream1",
"packaging": "loc",
"isLive": true,
"targetLatency": 2000,
"role": "audio",
"renderGroup": 1,
"codec": "opus",
"samplerate": 48000,
"channelConfig": "2",
"bitrate": 32000
}
],
"publishTracks": [
{
"namespace": "moq://metrics.moq.arpa/v1/%resourceId%",
"name": "4",
"packaging": "moqmetrics",
"role": "metrics",
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
},
{
"namespace": "moq://moq-syslog.arpa/logs-v1/%resourceId%",
"name": "6",
"packaging": "moqlog",
"role": "log",
"connectionUri": "moqt://logs.example.com:4443",
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
]
}
In this example:
-
The metrics track uses the namespace format defined in [MOQMETRICS] with %resourceId% as a placeholder for the subscriber's unique resource identifier. The track name "4" indicates Warning level granularity.
-
The log track uses the namespace format defined in [MOQLOG] with %resourceId% as a placeholder. The track name "6" indicates Informational level priority. This track establishes a separate connection to logs.example.com.
-
Both tracks include authentication tokens for publishing authorization.
-
The subscriber MUST replace %resourceId% with their actual resource identifier as defined in the respective specifications.