The SDK that the inspector drives is the same
moqt.js bundle the latency
console and the player load. The records come from the SDK’s session trace,
so the fields shown are the fields the session acted on.
Connect to a relay and a namespace
Fill the form at the top of the screen and press Connect:
The relay URL and the namespace are written to the page URL (
?relay=&ns=),
so a working setup is a link you can share.
Catalog URL is optional and is for an asset. A VOD asset publishes no
catalog object on the relay: its catalog, with the init segment of each
rendition and the relay URL and token the player uses, is the asset’s
playback catalog endpoint
(https://streams.<brand>/api/streams/playback/<playback id>/catalog).
Paste it and press Load catalog: the Tracks panel fills, and the relay,
token and namespace fields are filled from the catalog when they are empty.
Press Disconnect to close every subscription and the session.
Session strip
Preview
A muted thumbnail plays one video track, so the picture confirms what the counters say without taking the screen. Press Play on a video track to subscribe it and feed its objects to the player; the init segment comes from the catalog (the catalog object of a live input, or a loaded catalog URL), or from the first object that carries one in band. With a track already playing, Switch on another track runs a measured rendition switch (see Track switch) and continues playback on the new track. The status line shows the fragments appended, where the init segment came from, the decoded size and the seconds buffered ahead. Stop releases the player.Tracks
The inspector subscribes the catalog track as soon as the session is up. The first catalog object fills the list: video tracks first, then audio and other tracks, each with its codec, resolution and bitrate when the catalog carries them. A loaded catalog URL fills the same list before you connect.- Play (video tracks) plays the track in the preview; Switch moves the preview to it.
- Subscribe opens a subscription from the live edge. Unsubscribe closes it.
- A track the catalog does not list can be subscribed by name with the field under the list.
- Filter sets where every new subscription starts: the largest object (the live edge), the next group, or the start of the track (group 0, object 0). A VOD asset is served from the relay’s retained window only from the start; the live edge of a VOD track whose replay is over is after its end. The catalog track is always subscribed from the largest object.
- The Subscribed list shows objects received and the last group id per subscription.
Messages
One row per control message: time, direction (an up arrow is sent, a down arrow is received), the message name, the request id of the stream it rode on, its wire size, and its decoded fields. Click a row to expand the fields. Filters:- Sent and Received toggle a direction.
- The type selector keeps one message type.
- The text filter matches the message name or any decoded field value.
- Follow keeps the newest message in view. Scrolling up turns it off.
Data
One card per track, keyed by the track alias the relay assigned and named from the SUBSCRIBE that opened it. The card’s header shows the object rate, the kbps, and a sparkline of the kbps over the last 60 seconds.
Timing per track (average, minimum, maximum):
- Interarrival: time between consecutive objects.
- Jitter: the RFC 3550 estimator against the objects’ capture timestamps when the publisher stamps them; otherwise how much consecutive intervals differ.
- Latency (capture → receive): from the capture timestamp to the receive time, when the publisher stamps a wall-clock capture time.
- Path: when the relays stamp hop timestamps on the objects, one line per segment of the path: publisher to the first relay (when the objects also carry a capture time), each relay’s dwell, each link between relays, and the last relay to this viewer. The clocks are the machines’ own, so a segment between two machines carries their clock offset.
- Stream open → first object: from a data stream’s header to its first object.
- Stream lifetime: from a stream’s header to its end, for streams that ended.
- Per group: the objects, the payload bytes, and the time from the first to the last object of a group, for groups whose stream ended.
Track switch
A viewer can change rendition three ways. The experiment runs one switch and measures it:- make-before-break subscribes the new track, waits for its first object, then closes the old one. There is no hole; the two tracks overlap.
- break-before-make closes the old track, then subscribes the new one. There is no overlap; the viewer sees a hole until the first object.
- switch-from sends one SUBSCRIBE that carries the
SWITCH_FROMparameter (soft mode) naming the old subscription. The relay drains the old track to the group before the new track’s first group, then ends it with PUBLISH_DONE. The viewer sends one request and closes nothing. The new track starts at the group after the old track’s last group, as the player does. This needs a relay that acceptsSWITCH_FROM; a relay that does not closes the session over the unknown parameter.
A switch that gets no object from the new track within 10 seconds is reported
as a timeout; the old subscription is left as the mode left it. A switch-from
that gets no PUBLISH_DONE for the old track within 3 seconds reports the old
track as not ended.
Limits
- The inspector observes a subscriber session. It does not publish.
- Jitter and latency need capture timestamps on the objects. A publisher that does not stamp them gets interarrival only, and jitter from interval variation.
- The send-rate estimate and RTT come from the browser’s WebTransport
statistics. Chrome has no
WebTransport.getStats(), so it shows “not exposed” in their place. - Path segments need hop timestamps on the objects, which the relays stamp only when their hop-latency extension is on.
- Switch-from needs a relay that accepts the
SWITCH_FROMparameter.