You posted that just as I was replying. Here's the AI's response:
The end user is half right — level 0 is the problem, but not because of
?x?. Unknown dimensions are cosmetic; HLS.js loads segments fine without them.The actual reason level 0 is problematic: it is the remux stream. When "Prefer remux" is on, the level selection logic at VideoPlayer.tsx:618-627 picks level 0 because it has the highest bitrate (2.75 Mbps > 2.35 Mbps for level 5). The remux stream serves the original recording bytes directly, which means it depends heavily on the Channels DVR video index to locate segments. Corrupt index → no segments → buffer stays at 0.
Levels 1–5 are transcoded on-the-fly from the source, so they're more tolerant of a broken index — they don't rely on it the same way.
The
?x?just happens to be visible because remux streams typically don't advertise their resolution in the HLS master playlist. It's a side effect of being on the remux stream, not a cause of anything.What this suggests for the app: when a remux-level stall is detected (buffer stuck at 0 for several seconds), automatically fall back to the best transcoded level and surface a message like "Switched to transcoded stream — recording index may be corrupt." That would let users keep watching without needing to know about CDVR internals.
Want me to implement that fallback?
So, I'll release this fallback solution for you to test momentarily...

)