Sign in

§5.6

Catalog Examples

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.15. Time-aligned Audio/Video Tracks with Authorization

This example shows a catalog for a media producer requiring authorization for premium content. The premium 4K track uses CAT authorization with a token resolved via variable substitution from %cat-token%. The standard 720p track uses Privacy Pass with a token resolved from %pp-token%. Token presentation timing is determined by the authorization scheme specification.

{
  "version": "1",
  "generatedAt": 1746104606044,
  "tracks": [
    {
      "name": "premium-4k-video",
      "namespace": "streaming.example.com/live/sports",
      "packaging": "loc",
      "isLive": true,
      "targetLatency": 2000,
      "role": "video",
      "renderGroup": 1,
      "codec": "av01.0.12M.10.0.110.09",
      "width": 3840,
      "height": 2160,
      "framerate": 60,
      "bitrate": 15000000,
      "authInfo": {
        "cat": "%cat-token%"
      }
    },
    {
      "name": "standard-720p-video",
      "namespace": "streaming.example.com/live/sports",
      "packaging": "loc",
      "isLive": true,
      "targetLatency": 2000,
      "role": "video",
      "renderGroup": 2,
      "codec": "av01.0.05M.10.0.110.09",
      "width": 1280,
      "height": 720,
      "framerate": 30,
      "bitrate": 2500000,
      "authInfo": {
        "privacy-pass": "%pp-token%"
      }
    },
    {
      "name": "audio",
      "namespace": "streaming.example.com/live/sports",
      "packaging": "loc",
      "isLive": true,
      "targetLatency": 2000,
      "role": "audio",
      "renderGroup": 1,
      "codec": "opus",
      "samplerate": 48000,
      "channelConfig": "2",
      "bitrate": 128000
    }
  ]
}

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.

This is one section of MOQT Streaming Format, rendered per-section for quick reference and citation. The authoritative text is draft-ietf-moq-msf-01 at the IETF.