Streaming error reference
98 write-ups covering every check the tools run: what the finding means, why it matters, and how to fix it. Each result links straight to the relevant page.
HLS
- AVERAGE-BANDWIDTH is greater than BANDWIDTH
A variant claims its average bitrate is higher than its peak, which cannot be true and misleads ABR.
- EXT-X-INDEPENDENT-SEGMENTS is not declared
Without this tag players must assume segments depend on each other, so seeking and switching are more conservative.
- EXT-X-TARGETDURATION is missing
This tag is required on every media playlist, and players use it to size buffers and set the reload interval.
- EXT-X-VERSION is too low for the tags in use
The playlist uses tags that require a higher version than it declares, and compliant players may reject it.
- HLS encryption key has no URI
A segment declares an encryption method but no key location, so it cannot be decrypted.
- HLS ladder has a bitrate inversion
A lower-resolution variant is allocated more bandwidth than a higher-resolution one, so adaptive switching picks the wrong rendition.
- HLS ladder has a duplicated rung
Two variants are indistinguishable — same resolution, codec, dynamic range and bitrate — so one is wasted.
- HLS ladder has an oversized bitrate gap
Adjacent renditions are too far apart, so switching between them is a visible jump in quality.
- HLS live edge has drifted from wall-clock time
The newest segment’s program date-time is far from the current time, meaning the playlist is stale or the clocks disagree.
- HLS live window is shorter than three target durations
The playlist holds too little content, so any player that falls slightly behind runs off the end of the window.
- HLS master playlist has only one rendition
With a single variant there is nothing to adapt to, so viewers on poor connections rebuffer instead of dropping quality.
- HLS media playlist contains no segments
The playlist parsed correctly but lists nothing to play.
- HLS playlist contains EXT-X-GAP segments
A segment is declared missing, so playback will skip that period.
- HLS playlist has many discontinuities
Frequent EXT-X-DISCONTINUITY tags mean the timeline resets constantly, which many players handle poorly.
- HLS playlist has no EXT-X-PROGRAM-DATE-TIME
Without program date-time the stream cannot be mapped to wall-clock time, which breaks DVR seeking and multi-stream alignment.
- HLS playlist mixes encryption methods
More than one encryption method appears in a single playlist, which many players do not handle.
- HLS program date-times move backwards
A segment claims an earlier wall-clock time than the one before it, which corrupts seeking and subtitle alignment.
- HLS rendition group has an ambiguous default
A group has no DEFAULT rendition, or more than one, so which track plays at start-up is left to the player.
- HLS rendition is missing LANGUAGE
Without a language tag, players cannot honour the viewer’s language preference.
- HLS segment durations vary widely
Inconsistent segment lengths make buffer estimation and ABR switching erratic.
- HLS segment is longer than EXT-X-TARGETDURATION
A segment rounds to more than the declared target duration, which violates the HLS specification.
- HLS variant is missing FRAME-RATE
Devices that cannot handle high frame rates need this attribute to rule a rendition out before downloading it.
- HLS variant is missing the CODECS attribute
Without CODECS, players must download a segment before they can tell whether they can play the rendition at all.
- HLS variant is missing the RESOLUTION attribute
Without RESOLUTION a player cannot avoid downloading a rendition larger than the screen can show.
- HLS variant references an undeclared rendition group
A variant points at an AUDIO or SUBTITLES group that has no matching EXT-X-MEDIA entry, which breaks playback on strict players.
- LL-HLS PART-HOLD-BACK is below three part durations
The declared PART-HOLD-BACK is smaller than three times PART-TARGET, so players chase a live edge they cannot reach.
- LL-HLS PART-TARGET is not smaller than the target duration
Partial segments are not meaningfully smaller than whole segments, so low latency achieves nothing.
- LL-HLS playlist does not advertise CAN-BLOCK-RELOAD
Without blocking reload, players must poll for updates and the latency benefit is lost.
- The response is not an HLS playlist
The document does not begin with #EXTM3U, so it is not a playlist at all.
- VOD playlist has no EXT-X-ENDLIST
The playlist says it is VOD but never says it has finished, so players keep polling for updates that never come.
DASH
- A DASH period contains no adaptation sets
A period declares no media, so playback stalls when the timeline reaches it.
- Adaptation set declares no segment addressing
Without SegmentTemplate, SegmentList, SegmentBase or BaseURL, players cannot construct segment URLs.
- Adaptation set does not declare segment alignment
Players cannot assume segments line up across representations, so bitrate switching is not clean.
- Adaptation set mixes codec families
Representations in one set must be seamlessly switchable, so different codecs belong in separate sets.
- Audio adaptation set declares no language
Without @lang, players cannot honour the viewer’s language preference.
- Content protection uses an unrecognised scheme
A ContentProtection element names a scheme we do not recognise, so the required DRM system cannot be confirmed.
- DASH availabilityStartTime is in the future
The manifest claims the presentation starts later than the current time, so no segment is available yet and playback cannot begin.
- DASH manifest has no UTCTiming element
A live MPD without UTCTiming forces players to trust the device clock, so any skew on the viewer’s machine becomes stalls or missing segments.
- DASH video bandwidth does not rise with resolution
A lower-resolution representation is given more bandwidth than a higher-resolution one, so ABR picks wrongly.
- DRM system supplies no inline initialization data
Without a <cenc:pssh> in the manifest, playback depends on init data some players will not look for.
- Live MPD declares no availabilityStartTime
Without this anchor a player cannot work out which segments exist yet.
- Live MPD declares no minimumUpdatePeriod
Players are told the manifest never changes, so they never discover new segments.
- Live MPD declares no timeShiftBufferDepth
Players cannot tell how far back the DVR window reaches, so they may seek to segments that no longer exist.
- MPD contains no periods
There is no <Period>, so the manifest describes no content at all.
- MPD declares no minBufferTime
Players use this required attribute to size the initial buffer before starting playback.
- MPD declares no profile
Without @profiles a player cannot tell which DASH feature set the manifest expects.
- On-demand MPD asks to be refreshed
A static manifest declares minimumUpdatePeriod, which contradicts type="static".
- On-demand MPD declares no mediaPresentationDuration
A static manifest must say how long it is, or players cannot build a seek bar.
- Representation declares no bandwidth
@bandwidth is required, and adaptive bitrate selection depends entirely on it.
- Segment template declares no initialization segment
Players have no codec configuration before the first media segment arrives.
- Segment template omits @timescale with large durations
Durations too large to be seconds are being read as seconds, so segment timing is wrong by orders of magnitude.
- Segment template variables are used incorrectly
The template cannot resolve to a distinct URL per segment, so playback cannot advance.
- suggestedPresentationDelay is missing or too small
Players start too close to the live edge and have no room to absorb a slow segment.
- The DASH manifest is not well-formed XML
The document could not be parsed as XML, so nothing else could be checked.
- The document has no MPD root element
The XML parsed, but its root is not <MPD>, so it is not a DASH manifest.
IPTV playlists
- A channel has no display name
Channels with no name appear blank in the subscriber’s list.
- Channel URL uses a scheme browsers cannot open
Schemes such as rtmp or udp work in VLC but cannot be played by any web client.
- Channels are missing a logo
Channels without tvg-logo leave gaps in the channel grid.
- Channels have no group-title
Ungrouped channels fall into an unnamed catch-all category.
- DRM channel declares no license key
A channel names a DRM system but gives no licence server, so it cannot be decrypted.
- IPTV channels are missing tvg-id
Channels without a tvg-id cannot be matched to any programme guide, so they show no schedule information.
- Logo URL is relative or uses a non-HTTP scheme
Clients cannot resolve a relative logo path, so the image never loads.
- M3U playlist contains no channels
The header is present but there are no channel entries.
- Playlist declares no EPG source
Without url-tvg in the header, clients have no guide to load and viewers see no programme information.
- Some M3U lines could not be parsed
Lines that do not parse are skipped, so those channels are silently missing from the playlist.
- The file does not start with #EXTM3U
Without the header line this is not an M3U playlist, and most clients will reject it outright.
- Two channels share the same name
Identical names make the channel list ambiguous for viewers.
- Two channels share the same URL
The same stream appears more than once, usually from a duplicated entry.
- Two IPTV channels share a tvg-id
Duplicate tvg-ids make several channels display the same programme guide.
Programme guides
- Channel declares no icon
The guide falls back to the playlist logo or a placeholder.
- Channel is declared but has no programmes
The channel appears in the guide with an empty schedule.
- Guide contains no programmes
Channels are declared but there is no schedule, so viewers see an empty guide.
- Guide declares no channels
Without <channel> elements there is nothing for a playlist to match against.
- Most programmes have no category
Without <category>, genre filtering and recommendations cannot work.
- Most programmes have no description
Without <desc>, guide entries show a title and nothing else.
- Only part of the guide was analysed
The guide is larger than the per-run limit, so the figures cover only the programmes we read.
- Programme has no title
Programmes without a <title> appear as blank rows in the guide.
- Programme references an undeclared channel
A programme points at a channel id with no <channel> element, so it appears in no guide.
- Programme stops before it starts
A programme has a stop time at or before its start, producing a zero-length or negative entry.
- Programme timestamp could not be read
A start or stop attribute is not in XMLTV format, so the programme cannot be placed on the timeline.
- Programmes on one channel overlap
Two programmes claim the same air time, so the guide shows two things at once.
- The document has no <tv> root element
The XML parsed, but its root is not <tv>, so it is not an XMLTV guide.
- The guide is not well-formed XML
The document could not be parsed as XML, so nothing else could be checked.
- Two channels share the same id
Duplicate ids make programme assignment ambiguous.
- XMLTV guide does not extend far enough ahead
The guide runs out within hours, so viewers lose programme information partway through the day.
- XMLTV guide has holes in a channel schedule
Consecutive programmes do not join up, leaving blank stretches in the guide.
- XMLTV timestamps have no UTC offset
Timestamps without an explicit offset are ambiguous, and are the usual cause of a guide that appears shifted by whole hours.
Fetching and delivery
- That address cannot be reached from our servers
The URL resolves to a private or reserved address, so we will not connect to it from the server. Local mode tests it from your own browser instead.
- That is not a valid URL
The address could not be parsed, so no request was attempted.
- That monitor type is not recognised
A monitor must be one of hls, dash, m3u or epg.
- That URL scheme is not supported
Only http and https can be fetched; schemes such as rtmp, rtsp and file cannot.
- The browser blocked the request (CORS)
Your browser refused to read the response because the origin did not send an Access-Control-Allow-Origin header.
- The origin returned an error status
The server answered with a 4xx or 5xx status instead of the manifest, so there was nothing to analyze.
- The request could not be completed
The connection failed before a response arrived.
- The request was not valid
The API received a body it could not accept.
- The response was too large
The document exceeded the size limit for a single analysis.
- The URL redirected too many times
We follow up to three redirects; this URL exceeded that.
- There is no session to save this to
Saving needs either an account or a working session cookie.