hls.js icon indicating copy to clipboard operation
hls.js copied to clipboard

LL-HLS quality level switching in Safari

Open Shaienn opened this issue 10 months ago • 18 comments

What version of Hls.js are you using?

1.6.1

What browser (including version) are you using?

Safari Version 17.6 (19618.3.11.11.5)

What OS (including version) are you using?

MacOS Version 14.7.4 (23H420)

Test stream

https://hlsjs.video-dev.org/demo/?src=https%3A%2F%2Fv-shevchenko.erlyvideo.ru%2Frick-mbr-1%2Findex.ll.m3u8%3Fmultitrack%3Dtrue&demoConfig=eyJlbmFibGVTdHJlYW1pbmciOnRydWUsImF1dG9SZWNvdmVyRXJyb3IiOnRydWUsInN0b3BPblN0YWxsIjpmYWxzZSwiZHVtcGZNUDQiOmZhbHNlLCJsZXZlbENhcHBpbmciOi0xLCJsaW1pdE1ldHJpY3MiOi0xfQ==

Configuration

{
  "debug": true,
  "enableWorker": true,
  "lowLatencyMode": true,
  "backBufferLength": 90
}

Additional player setup steps

No response

Checklist

  • [x] The issue observed is not already reported by searching on Github under https://github.com/video-dev/hls.js/issues
  • [x] The issue occurs in the stable client (latest release) on https://hlsjs.video-dev.org/demo and not just on my page
  • [x] The issue occurs in the latest client (main branch) on https://hlsjs-dev.video-dev.org/demo and not just on my page
  • [x] The stream has correct Access-Control-Allow-Origin headers (CORS)
  • [x] There are no network errors such as 404s in the browser console when trying to play the stream

Steps to reproduce

  1. Put test stream URL in https://hlsjs.video-dev.org/demo/ opened in Safari browser.
  2. Press apply and observe that video is started playing.
  3. Open Quality-levels tab and switch Currently played level to another level manually.

Expected behaviour

Video will be switched to selected level and continue playing.

What actually happened?

Video stops playing and has never been recovered. There is no problem in Chrome and video from the same stream is switching and playing.

What i see:

  • Fragments from new selected level are fetched but not appended into source buffer:
[log] >"[stream-controller]:""Buffered main sn: 1900 part: 4 of level 0 (part:[25.600-26.000]INDEPENDENT=NO > buffer:)"
  • currentTime is stalled and kicked forward with synchronizeToLiveEdge
"Playback: 46.543 is located too far from the end of live sliding playlist: 54.03999996185303, reset currentTime to : 52.541"
  • In Safari i hear audio only 1 second after start. In Chrome - audio works well during all video.

I have started hlsjs from source and did some debug actions. There is: sb.appendBuffer(data); in buffer-controller.ts. I ensured that a data is a new fragment content. But source buffer remains empty after append.
Also i checked that sb.updating is false and onSBUpdateEnd callback is called before sb.appendBuffer execution.

Need some help to figure out what is wrong. I have added full console output as file below.

Full console output: Console.txt

Console output

[Log] [log] > – "set currentLevel:0" (hls.js, line 35747)
[Log] [log] > – "[level-controller]:" – "Switching to level 0 (480p SDR avc1,mp4a @1590000) from level 2" (hls.js, line 32991)
[Log] [log] > – "[level-controller]:" – "Loading level index 0 age 6.8 https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true" (hls.js, line 32868)
[Log] [log] > – "[playlist-loader]: aborting previous loader for type: level" (hls.js, line 34833)
[Log] [log] > – "[stream-controller]:" – "IDLE->WAITING_LEVEL" (hls.js, line 10615)
[Info] [info] > – "[abr]:" – "switch candidate:2->2 adjustedbw(16466681)-bitrate=9566681 ttfb:0.1 avgDuration:0.4 maxFetchDuration:2.4 fetchDuration:0.…" (hls.js, line 4602)
"switch candidate:2->2 adjustedbw(16466681)-bitrate=9566681 ttfb:0.1 avgDuration:0.4 maxFetchDuration:2.4 fetchDuration:0.3 firstSelection:false codecSet:avc1,mp4a videoRange:SDR hls.loadLevel:0"
[Log] [log] > – "[buffer-controller]:" – "queuing \"audiovideo\" remove 0-Infinity" (hls.js, line 19450)
[Log] [log] > – "[buffer-controller]:" – "Removing [0,13.76] from the audiovideo SourceBuffer" (hls.js, line 19984)
[Log] [log] > – "[stream-controller]:" – "WAITING_LEVEL->IDLE" (hls.js, line 10615)
[Log] [log] > – "[stream-controller]:" – "IDLE->WAITING_LEVEL" (hls.js, line 10615)
[Log] [log] > – "[level-controller]:" – "live playlist 0 REFRESHED 12-4" (hls.js, line 18042)
[Log] [log] > – "[level-controller]:" – "Loading level index 0 at sn 13 part 0 age 6.9 https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_ms…" (hls.js, line 32868)
"Loading level index 0 at sn 13 part 0 age 6.9 https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=13&_HLS_part=0"
[Info] [info] > – "[abr]:" – "switch candidate:2->2 adjustedbw(16466681)-bitrate=9566681 ttfb:0.1 avgDuration:0.4 maxFetchDuration:0.4 fetchDuration:0.…" (hls.js, line 4602)
"switch candidate:2->2 adjustedbw(16466681)-bitrate=9566681 ttfb:0.1 avgDuration:0.4 maxFetchDuration:0.4 fetchDuration:0.3 firstSelection:false codecSet:avc1,mp4a videoRange:SDR hls.loadLevel:0"
[Info] [info] > – "[abr]:" – "buffer is empty, optimal quality level 2" (hls.js, line 4444)
[Log] [log] > – "[stream-controller]:" – "Level 0 loaded [10,12][part-12-4], cc [1, 1] duration:6" (hls.js, line 33617)
[Log] [log] > – "[stream-controller]:" – "Setting startPosition to -1 to start at live edge 12.501" (hls.js, line 10279)
[Log] [log] > – "[buffer-controller]:" – "Updating MediaSource duration to 14.000" (hls.js, line 19764)
[Log] [log] > – "[stream-controller]:" – "WAITING_LEVEL->IDLE" (hls.js, line 10615)
[Log] [log] > – "[stream-controller]:" – "Live playlist, switching playlist, load frag with same PDT: 1744127691480" (hls.js, line 10145)
[Log] [log] > – "[stream-controller]:" – "Setting startPosition to 12.501 to match start frag at live edge. mainStart: 12.501 liveSyncPosition: 12.501 frag.start: 12" (hls.js, line 10013)
[Log] [log] > – "[stream-controller]:" – "Loading main sn: 12 part: 0 (5/9) of level 0 (part:[12.000-12.400]INDEPENDENT=YES) cc: 1 [10-12], target: 12" (hls.js, line 9674)
[Log] [log] > – "[stream-controller]:" – "IDLE->FRAG_LOADING" (hls.js, line 10615)
[Log] [log] > – "[transmuxer-interface]: Starting new transmux session for main sn: 12 part: 0 level: 0 id: 1↵        discontinuity: false↵      …" (hls.js, line 17002)
"[transmuxer-interface]: Starting new transmux session for main sn: 12 part: 0 level: 0 id: 1
        discontinuity: false
        trackSwitch: true
        contiguous: false
        accurateTimeOffset: false
        timeOffset: 12
        initSegmentChange: true"
[Log] [log] > – "[stream-controller]:" – "FRAG_LOADING->PARSING" (hls.js, line 10615)
[Log] [log] > – "[stream-controller]:" – "Init audiovideo buffer, container:video/mp4, codecs[level/parsed]=[avc1.4d401f,mp4a.40.2/mp4a.40.2,avc1.4D401F]" (hls.js, line 34226)
[Log] [log] > – "[buffer-controller]:" – "BUFFER_CODECS: \"audiovideo\" (current SB count 1)" (hls.js, line 19155)
[Warning] [warn] > – "[stream-controller]:" – "Media segment with muxed audiovideo where only video expected: https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/seg-0-12.llhls.cmfv" (hls.js, line 34143, x3)
[Log] [log] > – "[level-controller]:" – "live playlist 0 REFRESHED 13-0" (hls.js, line 18042)
[Log] [log] > – "[level-controller]:" – "Loading level index 0 at sn 13 part 1 age 0.4 https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_ms…" (hls.js, line 32868)
"Loading level index 0 at sn 13 part 1 age 0.4 https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=13&_HLS_part=1"
[Info] [info] > – "[abr]:" – "switch candidate:0->2 adjustedbw(12133344)-bitrate=5233344 ttfb:0.1 avgDuration:0.4 maxFetchDuration:0.4 fetchDuration:0.…" (hls.js, line 4602)
"switch candidate:0->2 adjustedbw(12133344)-bitrate=5233344 ttfb:0.1 avgDuration:0.4 maxFetchDuration:0.4 fetchDuration:0.3 firstSelection:false codecSet:avc1,mp4a videoRange:SDR hls.loadLevel:0"
[Log] [log] > – "[stream-controller]:" – "Level 0 loaded [10,12][part-13-0], cc [1, 1] duration:6.4" (hls.js, line 33617)
[Log] [log] > – "[buffer-controller]:" – "Updating MediaSource duration to 14.400" (hls.js, line 19764)
[Warning] [warn] > – "[stream-controller]:" – "Media segment with muxed audiovideo where only video expected: https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/seg-0-12.llhls.cmfv" (hls.js, line 34143, x2)
[Log] [log] > – "[transmuxer.ts]: Flushed main sn: 12 part: 4 of level 0" (hls.js, line 16838)
[Log] [log] > – "[stream-controller]:" – "PARSING->PARSED" (hls.js, line 10615)
[Log] [log] > – "[stream-controller]:" – "Parsed main sn: 12 part: 4 of level 0 (part:[13.600-14.000]INDEPENDENT=NO)" (hls.js, line 10522)
[Log] [log] > – "[stream-controller]:" – "Buffered main sn: 12 part: 4 of level 0 (part:[13.600-14.000]INDEPENDENT=NO > buffer:)" (hls.js, line 9584)
[Log] [log] > – "[stream-controller]:" – "PARSED->IDLE" (hls.js, line 10615)
[Log] [log] > – "[stream-controller]:" – "Loading main sn: 11 part: 0 (0/10) of level 0 (part:[10.000-10.400]INDEPENDENT=YES) cc: 1 [10-12], target: 11.372" (hls.js, line 9674)
[Log] [log] > – "[stream-controller]:" – "IDLE->FRAG_LOADING" (hls.js, line 10615)
[Log] [log] > – "[transmuxer-interface]: Starting new transmux session for main sn: 11 part: 0 level: 0 id: 1↵        discontinuity: false↵      …" (hls.js, line 17002)
"[transmuxer-interface]: Starting new transmux session for main sn: 11 part: 0 level: 0 id: 1
        discontinuity: false
        trackSwitch: false
        contiguous: false
        accurateTimeOffset: false
        timeOffset: 10
        initSegmentChange: false"
[Log] [log] > – "[stream-controller]:" – "FRAG_LOADING->PARSING" (hls.js, line 10615)
[Warning] [warn] > – "[stream-controller]:" – "Media segment with muxed audiovideo where only video expected: https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/seg-0-11.llhls.cmfv" (hls.js, line 34143, x3)
[Log] [log] > – "[level-controller]:" – "live playlist 0 REFRESHED 13-1" (hls.js, line 18042)
[Log] [log] > – "[level-controller]:" – "Loading level index 0 at sn 13 part 2 age 0.4 https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_ms…" (hls.js, line 32868)
"Loading level index 0 at sn 13 part 2 age 0.4 https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=13&_HLS_part=2"
[Info] [info] > – "[abr]:" – "switch candidate:0->2 adjustedbw(11971524)-bitrate=5071524 ttfb:0.1 avgDuration:0.4 maxFetchDuration:0.4 fetchDuration:0.…" (hls.js, line 4602)
"switch candidate:0->2 adjustedbw(11971524)-bitrate=5071524 ttfb:0.1 avgDuration:0.4 maxFetchDuration:0.4 fetchDuration:0.3 firstSelection:false codecSet:avc1,mp4a videoRange:SDR hls.loadLevel:0"
[Log] [log] > – "[stream-controller]:" – "Level 0 loaded [10,12][part-13-1], cc [1, 1] duration:6.800000000000001" (hls.js, line 33617)
[Log] [log] > – "[buffer-controller]:" – "Updating MediaSource duration to 14.800" (hls.js, line 19764)
[Warning] [warn] > – "[stream-controller]:" – "Media segment with muxed audiovideo where only video expected: https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/seg-0-11.llhls.cmfv" (hls.js, line 34143, x2)
[Log] [log] > – "[transmuxer.ts]: Flushed main sn: 11 part: 4 of level 0" (hls.js, line 16838)
[Log] [log] > – "[stream-controller]:" – "PARSING->PARSED" (hls.js, line 10615)
[Log] [log] > – "[stream-controller]:" – "Parsed main sn: 11 part: 4 of level 0 (part:[11.600-12.000]INDEPENDENT=NO)" (hls.js, line 10522)
[Log] [log] > – "[stream-controller]:" – "Buffered main sn: 11 part: 4 of level 0 (part:[11.600-12.000]INDEPENDENT=NO > buffer:)" (hls.js, line 9584)

Chrome media internals output


Shaienn avatar Apr 08 '25 16:04 Shaienn

So, there two issues here:

  1. Audio drops out in Safari: Seems like an issue with WebKit and/or the muxed AV fmp4 content. Even with low-latency part loading disabled ("lowLatencyMode": false,) the audio drops after playback passes over the first playable segment boundary.
  2. Quality Switching...

For Quality Switching, "Currently played level" or setting hls.currentLevel will always cause a stall because it flushes all content from the buffer before switching playlists. Only "Currently loaded level" (setting hls.loadLevel) should be used to switch in Low-latency playback or any context that requires non-destructive switching.

As for why playback may stall on switch, it appears that there are intermittent issues with playlist alignment with this stream. I think I see some pretty big jumps in #EXT-X-PROGRAM-DATE-TIME which hls.js uses for playlist alignment. Sometimes this is corrected by media timestamps. If the media timestamps also don't align between variants then that explains it. If this is at a point where the source VOD is being looped we would expect an accompanying DISCONTINUITY and DISCONTINUITY-SEQUENCE increase.

robwalch avatar Apr 08 '25 17:04 robwalch

Hello @robwalch

Do you mean than PROGRAM-DATE-TIME in different level playlists should be the same for same fragments? Looks like they are:

curl 'https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=375&_HLS_part=7' ; curl 'https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v3a1/index.ll.m3u8?multitrack=true&_HLS_msn=375&_HLS_part=7'

tracks-v1a1:

#EXTM3U
#EXT-X-TARGETDURATION:5
#EXT-X-VERSION:6
#EXT-X-SERVER-CONTROL:CAN-BLOCK-RELOAD=YES,PART-HOLD-BACK=1.5
#EXT-X-PART-INF:PART-TARGET=0.44
#EXT-X-MEDIA-SEQUENCE:369
#EXT-X-DISCONTINUITY-SEQUENCE:1
#EXT-X-MAP:URI="init-0-1.llhls.cmfv"
#EXT-X-PROGRAM-DATE-TIME:2025-04-08T18:11:29.759Z
#EXTINF:4.0,
seg-0-369.llhls.cmfv
#EXT-X-PROGRAM-DATE-TIME:2025-04-08T18:11:33.759Z
#EXTINF:4.04,
seg-0-370.llhls.cmfv
#EXT-X-PROGRAM-DATE-TIME:2025-04-08T18:11:37.799Z
#EXTINF:4.0,
seg-0-371.llhls.cmfv
#EXT-X-PROGRAM-DATE-TIME:2025-04-08T18:11:41.799Z
#EXTINF:4.0,
seg-0-372.llhls.cmfv
#EXT-X-PART:DURATION=0.4,INDEPENDENT=YES,URI="seg-0-373-0.llhls.cmfv"
#EXT-X-PART:DURATION=0.4,URI="seg-0-373-1.llhls.cmfv"
#EXT-X-PART:DURATION=0.4,URI="seg-0-373-2.llhls.cmfv"
#EXT-X-PART:DURATION=0.4,URI="seg-0-373-3.llhls.cmfv"
#EXT-X-PART:DURATION=0.4,URI="seg-0-373-4.llhls.cmfv"
#EXT-X-PART:DURATION=0.4,INDEPENDENT=YES,URI="seg-0-373-5.llhls.cmfv"
#EXT-X-PART:DURATION=0.4,URI="seg-0-373-6.llhls.cmfv"
#EXT-X-PART:DURATION=0.4,URI="seg-0-373-7.llhls.cmfv"
#EXT-X-PART:DURATION=0.4,URI="seg-0-373-8.llhls.cmfv"
#EXT-X-PART:DURATION=0.4,URI="seg-0-373-9.llhls.cmfv"
#EXT-X-PROGRAM-DATE-TIME:2025-04-08T18:11:45.799Z
#EXTINF:4.0,
seg-0-373.llhls.cmfv
#EXT-X-PART:DURATION=0.4,INDEPENDENT=YES,URI="seg-0-374-0.llhls.cmfv"
#EXT-X-PART:DURATION=0.4,URI="seg-0-374-1.llhls.cmfv"
#EXT-X-PART:DURATION=0.4,URI="seg-0-374-2.llhls.cmfv"
#EXT-X-PART:DURATION=0.4,URI="seg-0-374-3.llhls.cmfv"
#EXT-X-PART:DURATION=0.4,URI="seg-0-374-4.llhls.cmfv"
#EXT-X-PART:DURATION=0.4,INDEPENDENT=YES,URI="seg-0-374-5.llhls.cmfv"
#EXT-X-PART:DURATION=0.4,URI="seg-0-374-6.llhls.cmfv"
#EXT-X-PART:DURATION=0.4,URI="seg-0-374-7.llhls.cmfv"
#EXT-X-PART:DURATION=0.4,URI="seg-0-374-8.llhls.cmfv"
#EXT-X-PART:DURATION=0.4,URI="seg-0-374-9.llhls.cmfv"
#EXT-X-PROGRAM-DATE-TIME:2025-04-08T18:11:49.799Z
#EXTINF:4.0,
seg-0-374.llhls.cmfv
#EXT-X-PART:DURATION=0.4,INDEPENDENT=YES,URI="seg-0-375-0.llhls.cmfv"
#EXT-X-PART:DURATION=0.4,URI="seg-0-375-1.llhls.cmfv"
#EXT-X-PART:DURATION=0.4,URI="seg-0-375-2.llhls.cmfv"
#EXT-X-PART:DURATION=0.4,URI="seg-0-375-3.llhls.cmfv"
#EXT-X-PART:DURATION=0.4,URI="seg-0-375-4.llhls.cmfv"
#EXT-X-PART:DURATION=0.4,INDEPENDENT=YES,URI="seg-0-375-5.llhls.cmfv"
#EXT-X-PART:DURATION=0.4,URI="seg-0-375-6.llhls.cmfv"
#EXT-X-PART:DURATION=0.4,URI="seg-0-375-7.llhls.cmfv"
#EXT-X-PRELOAD-HINT:TYPE=PART,URI="seg-0-375-8.llhls.cmfv"
#EXT-X-RENDITION-REPORT:URI="/rick-mbr-1/tracks-v3a1/index.ll.m3u8",LAST-MSN=375,LAST-PART=8
#EXT-X-RENDITION-REPORT:URI="/rick-mbr-1/tracks-v2a1/index.ll.m3u8",LAST-MSN=375,LAST-PART=8

tracks-v3a1

#EXTM3U
#EXT-X-TARGETDURATION:5
#EXT-X-VERSION:6
#EXT-X-SERVER-CONTROL:CAN-BLOCK-RELOAD=YES,PART-HOLD-BACK=1.5
#EXT-X-PART-INF:PART-TARGET=0.44
#EXT-X-MEDIA-SEQUENCE:369
#EXT-X-DISCONTINUITY-SEQUENCE:1
#EXT-X-MAP:URI="init-0-1.llhls.cmfv"
#EXT-X-PROGRAM-DATE-TIME:2025-04-08T18:11:29.759Z
#EXTINF:4.0,
seg-0-369.llhls.cmfv
#EXT-X-PROGRAM-DATE-TIME:2025-04-08T18:11:33.759Z
#EXTINF:4.04,
seg-0-370.llhls.cmfv
#EXT-X-PROGRAM-DATE-TIME:2025-04-08T18:11:37.799Z
#EXTINF:4.0,
seg-0-371.llhls.cmfv
#EXT-X-PROGRAM-DATE-TIME:2025-04-08T18:11:41.799Z
#EXTINF:4.0,
seg-0-372.llhls.cmfv
#EXT-X-PART:DURATION=0.4,INDEPENDENT=YES,URI="seg-0-373-0.llhls.cmfv"
#EXT-X-PART:DURATION=0.4,URI="seg-0-373-1.llhls.cmfv"
#EXT-X-PART:DURATION=0.4,URI="seg-0-373-2.llhls.cmfv"
#EXT-X-PART:DURATION=0.4,URI="seg-0-373-3.llhls.cmfv"
#EXT-X-PART:DURATION=0.4,URI="seg-0-373-4.llhls.cmfv"
#EXT-X-PART:DURATION=0.4,INDEPENDENT=YES,URI="seg-0-373-5.llhls.cmfv"
#EXT-X-PART:DURATION=0.4,URI="seg-0-373-6.llhls.cmfv"
#EXT-X-PART:DURATION=0.4,URI="seg-0-373-7.llhls.cmfv"
#EXT-X-PART:DURATION=0.4,URI="seg-0-373-8.llhls.cmfv"
#EXT-X-PART:DURATION=0.4,URI="seg-0-373-9.llhls.cmfv"
#EXT-X-PROGRAM-DATE-TIME:2025-04-08T18:11:45.799Z
#EXTINF:4.0,
seg-0-373.llhls.cmfv
#EXT-X-PART:DURATION=0.4,INDEPENDENT=YES,URI="seg-0-374-0.llhls.cmfv"
#EXT-X-PART:DURATION=0.4,URI="seg-0-374-1.llhls.cmfv"
#EXT-X-PART:DURATION=0.4,URI="seg-0-374-2.llhls.cmfv"
#EXT-X-PART:DURATION=0.4,URI="seg-0-374-3.llhls.cmfv"
#EXT-X-PART:DURATION=0.4,URI="seg-0-374-4.llhls.cmfv"
#EXT-X-PART:DURATION=0.4,INDEPENDENT=YES,URI="seg-0-374-5.llhls.cmfv"
#EXT-X-PART:DURATION=0.4,URI="seg-0-374-6.llhls.cmfv"
#EXT-X-PART:DURATION=0.4,URI="seg-0-374-7.llhls.cmfv"
#EXT-X-PART:DURATION=0.4,URI="seg-0-374-8.llhls.cmfv"
#EXT-X-PART:DURATION=0.4,URI="seg-0-374-9.llhls.cmfv"
#EXT-X-PROGRAM-DATE-TIME:2025-04-08T18:11:49.799Z
#EXTINF:4.0,
seg-0-374.llhls.cmfv
#EXT-X-PART:DURATION=0.4,INDEPENDENT=YES,URI="seg-0-375-0.llhls.cmfv"
#EXT-X-PART:DURATION=0.4,URI="seg-0-375-1.llhls.cmfv"
#EXT-X-PART:DURATION=0.4,URI="seg-0-375-2.llhls.cmfv"
#EXT-X-PART:DURATION=0.4,URI="seg-0-375-3.llhls.cmfv"
#EXT-X-PART:DURATION=0.4,URI="seg-0-375-4.llhls.cmfv"
#EXT-X-PART:DURATION=0.4,INDEPENDENT=YES,URI="seg-0-375-5.llhls.cmfv"
#EXT-X-PART:DURATION=0.4,URI="seg-0-375-6.llhls.cmfv"
#EXT-X-PART:DURATION=0.4,URI="seg-0-375-7.llhls.cmfv"
#EXT-X-PRELOAD-HINT:TYPE=PART,URI="seg-0-375-8.llhls.cmfv"
#EXT-X-RENDITION-REPORT:URI="/rick-mbr-1/tracks-v2a1/index.ll.m3u8",LAST-MSN=375,LAST-PART=8
#EXT-X-RENDITION-REPORT:URI="/rick-mbr-1/tracks-v1a1/index.ll.m3u8",LAST-MSN=375,LAST-PART=8

I also check same numbered segments from different tracks and they timestamps also the same:

cat init-0-1.llhls.cmfv.24 seg-0-5-0.llhls.cmfv.2 | ffprobe -show_frames - | grep -w pts_time
ffprobe version 6.1.2 Copyright (c) 2007-2024 the FFmpeg developers
  built with Apple clang version 16.0.0 (clang-1600.0.26.4)
  configuration: --prefix='/opt/homebrew/Cellar/ffmpeg@6/6.1.2_7' --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags='-Wl,-ld_classic' --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libaribb24 --enable-libbluray --enable-libdav1d --enable-libharfbuzz --enable-libjxl --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-videotoolbox --enable-audiotoolbox --enable-neon
  libavutil      58. 29.100 / 58. 29.100
  libavcodec     60. 31.102 / 60. 31.102
  libavformat    60. 16.100 / 60. 16.100
  libavdevice    60.  3.100 / 60.  3.100
  libavfilter     9. 12.100 /  9. 12.100
  libswscale      7.  5.100 /  7.  5.100
  libswresample   4. 12.100 /  4. 12.100
  libpostproc    57.  3.100 / 57.  3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'fd:':
  Metadata:
    major_brand     : iso5
    minor_version   : 200
    compatible_brands: iso5iso6mp41
    creation_time   : 2025-04-08T09:08:54.000000Z
  Duration: 484473:06:58.75, start: 1744103218.286667, bitrate: N/A
  Stream #0:0[0x3](und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(progressive), 1280x720 [SAR 1:1 DAR 16:9], 25 fps, 25 tbr, 90k tbn (default)
    Metadata:
      creation_time   : 2025-04-08T09:08:54.000000Z
      handler_name    : vide_handler
      vendor_id       : [0][0][0][0]
  Stream #0:1[0x1](und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, mono, fltp (default)
    Metadata:
      creation_time   : 2025-04-08T09:08:54.000000Z
      handler_name    : soun_handler
      vendor_id       : [0][0][0][0]
pts_time=1744103218.360000
pts_time=1744103218.400000
pts_time=1744103218.440000
pts_time=1744103218.480000
pts_time=1744103218.520000
pts_time=1744103218.560000
pts_time=1744103218.600000
pts_time=1744103218.640000
pts_time=1744103218.286667
pts_time=1744103218.308005
pts_time=1744103218.329342
pts_time=1744103218.350680
pts_time=1744103218.372018
pts_time=1744103218.393356
pts_time=1744103218.414694
pts_time=1744103218.436032
pts_time=1744103218.457370
pts_time=1744103218.478708
pts_time=1744103218.500045
pts_time=1744103218.521383
pts_time=1744103218.542721
pts_time=1744103218.564059
pts_time=1744103218.585397
pts_time=1744103218.606735
pts_time=1744103218.628073
pts_time=1744103218.649410
pts_time=1744103218.670748
pts_time=1744103218.680000
pts_time=1744103218.840000


cat init-0-1.llhls.cmfv.23 seg-0-5-0.llhls.cmfv.3 | ffprobe -show_frames - | grep -w pts_time
ffprobe version 6.1.2 Copyright (c) 2007-2024 the FFmpeg developers
  built with Apple clang version 16.0.0 (clang-1600.0.26.4)
  configuration: --prefix='/opt/homebrew/Cellar/ffmpeg@6/6.1.2_7' --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags='-Wl,-ld_classic' --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libaribb24 --enable-libbluray --enable-libdav1d --enable-libharfbuzz --enable-libjxl --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-videotoolbox --enable-audiotoolbox --enable-neon
  libavutil      58. 29.100 / 58. 29.100
  libavcodec     60. 31.102 / 60. 31.102
  libavformat    60. 16.100 / 60. 16.100
  libavdevice    60.  3.100 / 60.  3.100
  libavfilter     9. 12.100 /  9. 12.100
  libswscale      7.  5.100 /  7.  5.100
  libswresample   4. 12.100 /  4. 12.100
  libpostproc    57.  3.100 / 57.  3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'fd:':
  Metadata:
    major_brand     : iso5
    minor_version   : 200
    compatible_brands: iso5iso6mp41
    creation_time   : 2025-04-08T09:08:54.000000Z
  Duration: 484473:06:58.75, start: 1744103218.286667, bitrate: N/A
  Stream #0:0[0x2](und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(progressive), 852x480 [SAR 1:1 DAR 71:40], 25 fps, 25 tbr, 90k tbn (default)
    Metadata:
      creation_time   : 2025-04-08T09:08:54.000000Z
      handler_name    : vide_handler
      vendor_id       : [0][0][0][0]
  Stream #0:1[0x1](und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, mono, fltp (default)
    Metadata:
      creation_time   : 2025-04-08T09:08:54.000000Z
      handler_name    : soun_handler
      vendor_id       : [0][0][0][0]
pts_time=1744103218.360000
pts_time=1744103218.400000
pts_time=1744103218.440000
pts_time=1744103218.480000
pts_time=1744103218.520000
pts_time=1744103218.560000
pts_time=1744103218.600000
pts_time=1744103218.640000
pts_time=1744103218.286667
pts_time=1744103218.308005
pts_time=1744103218.329342
pts_time=1744103218.350680
pts_time=1744103218.372018
pts_time=1744103218.393356
pts_time=1744103218.414694
pts_time=1744103218.436032
pts_time=1744103218.457370
pts_time=1744103218.478708
pts_time=1744103218.500045
pts_time=1744103218.521383
pts_time=1744103218.542721
pts_time=1744103218.564059
pts_time=1744103218.585397
pts_time=1744103218.606735
pts_time=1744103218.628073
pts_time=1744103218.649410
pts_time=1744103218.670748
pts_time=1744103218.680000
pts_time=1744103218.840000

Regarding VOD, there is a looped file passed through transcoder to make different levels, therefore there are monotonic increased timestamps.

Shaienn avatar Apr 08 '25 18:04 Shaienn

Do you mean than PROGRAM-DATE-TIME in different level playlists should be the same for same fragments? Looks like they are:

They are until they are not. I observed an update where all the dates jumped ahead 3 minutes.

robwalch avatar Apr 08 '25 18:04 robwalch

I do not see such jump. I did few reconfiguration on server, probably jumps which you observer are result of that action.

I have added some debug in hlsjs and see that PROGRAM-DATE-TIME does not jump at least around of switch moment. I print it like: [Warning] [warn] > – "2025-04-08T19:46:36.200Z" (hls.js, line 8134) - value from m3u8-parser.ts

[Warning] [warn] > – "2025-04-08T19:46:36.200Z" (hls.js, line 8134)
[Warning] [warn] > – "2025-04-08T19:46:40.200Z" (hls.js, line 8134)
[Warning] [warn] > – "2025-04-08T19:46:44.200Z" (hls.js, line 8134)
[Warning] [warn] > – "2025-04-08T19:46:48.200Z" (hls.js, line 8134)
[Warning] [warn] > – "2025-04-08T19:46:52.200Z" (hls.js, line 8134)
[Warning] [warn] > – "2025-04-08T19:46:56.200Z" (hls.js, line 8134)
[Log] [log] > – "[level-controller]:" – "live playlist 2 REFRESHED 402-4" (hls.js, line 18043)
[Log] [log] > – "[level-controller]:" – "Loading level index 2 at sn 402 part 5 age 0.3 https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v3a1/index.ll.m3u8?multitrack=true&_HLS_m…" (hls.js, line 32873)
"Loading level index 2 at sn 402 part 5 age 0.3 https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v3a1/index.ll.m3u8?multitrack=true&_HLS_msn=402&_HLS_part=5"
[Log] [log] > – "[stream-controller]:" – "Level 2 loaded [396,401][part-402-4], cc [1, 1] duration:26" (hls.js, line 33626)
[Log] [log] > – "[buffer-controller]:" – "Updating MediaSource duration to 30.000" (hls.js, line 19767)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 29.72, currentTime: 26.82435718510109, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ2: buffer: {\"len\":2.8956562315319196,\"start\":24.08,\"end\":29.72,\"buffered\":[{\"start\":24.08,\"end\":29.72}],\"bufferedIndex\":0}" (hls.js, line 33402)
[Log] [log] > – "[stream-controller]:" – "Loading main sn: 402 part: 4 (24/24) of level 2 (part:[29.600-30.000]INDEPENDENT=NO) cc: 1 [396-401], target: 29.72" (hls.js, line 9675)
[Log] [log] > – "[stream-controller]:" – "IDLE->FRAG_LOADING" (hls.js, line 10616)
[Log] [log] > – "[stream-controller]:" – "FRAG_LOADING->PARSING" (hls.js, line 10616)
[Warning] [warn] > – "[stream-controller]:" – "Media segment with muxed audiovideo where only video expected: " (hls.js, line 34152)
[Log] [log] > – "[buffer-controller]:" – "XXX: appendExecutor: buffer appending https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v3a1/index.ll.m3u8?multitrack=true&_HLS_msn=402&_H…" (hls.js, line 19369)
"XXX: appendExecutor: buffer appending https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v3a1/index.ll.m3u8?multitrack=true&_HLS_msn=402&_HLS_part=4, sn: 402, sz: 60065"
[Log] [log] > – "[buffer-controller]:" – "Source audiovideo is updating: false, SWindow: 0, EWindow: Infinity" (hls.js, line 20006)
[Log] [log] > – "[transmuxer.ts]: Flushed main sn: 402 part: 4 of level 2" (hls.js, line 16839)
[Log] [log] > – "[stream-controller]:" – "PARSING->PARSED" (hls.js, line 10616)
[Log] [log] > – "[stream-controller]:" – "Parsed main sn: 402 part: 4 of level 2 (part:[29.600-30.000]INDEPENDENT=NO)" (hls.js, line 10523)
[Log] [log] > – "[buffer-controller]:" – "YYY: onSBUpdateEnd: audiovideo" (hls.js, line 19938)
[Log] [log] > – "[buffer-controller]:" – "RRR: BUFFER_APPENDED https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v3a1/index.ll.m3u8?multitrack=true&_HLS_msn=402&_HLS_part=4, sn…" (hls.js, line 19400)
"RRR: BUFFER_APPENDED https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v3a1/index.ll.m3u8?multitrack=true&_HLS_msn=402&_HLS_part=4, sn: 402"
[Log] [log] > – "[stream-controller]:" – "Buffered main sn: 402 part: 4 of level 2 (part:[29.600-30.000]INDEPENDENT=NO > buffer:[24.080-30.080])" (hls.js, line 9585)
[Log] [log] > – "[stream-controller]:" – "PARSED->IDLE" (hls.js, line 10616)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 26.90384860155913, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ2: buffer: {\"len\":3.176164856517733,\"start\":24.08,\"end\":30.08,\"buffered\":[{\"start\":24.08,\"end\":30.08}],\"bufferedIndex\":0}" (hls.js, line 33402)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 26.93345747539784, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ2: buffer: {\"len\":3.1465597326493686,\"start\":24.08,\"end\":30.08,\"buffered\":[{\"start\":24.08,\"end\":30.08}],\"bufferedIndex\":0}" (hls.js, line 33402)
[Log] [log] > – "set loadLevel:0" (hls.js, line 35798)
[Log] [log] > – "[level-controller]:" – "Switching to level 0 (480p SDR avc1,mp4a @850000) from level 2" (hls.js, line 32996)
[Log] [log] > – "[level-controller]:" – "Loading level index 0 at sn 402 part 5 age 2.2 https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_m…" (hls.js, line 32873)
"Loading level index 0 at sn 402 part 5 age 2.2 https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=402&_HLS_part=5"
[Log] [log] > – "[playlist-loader]: aborting previous loader for type: level" (hls.js, line 34842)
[Log] [log] > – "[stream-controller]:" – "IDLE->WAITING_LEVEL" (hls.js, line 10616)
[Info] [info] > – "[abr]:" – "switch candidate:2->2 adjustedbw(10422061)-bitrate=8202061 ttfb:0.1 avgDuration:0.4 maxFetchDuration:3.1 fetchDuration:0.…" (hls.js, line 4602)
"switch candidate:2->2 adjustedbw(10422061)-bitrate=8202061 ttfb:0.1 avgDuration:0.4 maxFetchDuration:3.1 fetchDuration:0.2 firstSelection:false codecSet:avc1,mp4a videoRange:SDR hls.loadLevel:0"
[Log] [log] > – "[stream-controller]:" – "WAITING_LEVEL->IDLE" (hls.js, line 10616)
[Log] [log] > – "[stream-controller]:" – "IDLE->WAITING_LEVEL" (hls.js, line 10616)
[Warning] [warn] > – "2025-04-08T19:46:36.200Z" (hls.js, line 8134)
[Warning] [warn] > – "2025-04-08T19:46:40.200Z" (hls.js, line 8134)
[Warning] [warn] > – "2025-04-08T19:46:44.200Z" (hls.js, line 8134)
[Warning] [warn] > – "2025-04-08T19:46:48.200Z" (hls.js, line 8134)
[Warning] [warn] > – "2025-04-08T19:46:52.200Z" (hls.js, line 8134)
[Warning] [warn] > – "2025-04-08T19:46:56.200Z" (hls.js, line 8134)
[Log] [log] > – "[level-controller]:" – "live playlist 0 REFRESHED 402-5" (hls.js, line 18043)
[Log] [log] > – "[level-controller]:" – "Loading level index 0 at sn 402 part 6 age 2.4 https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_m…" (hls.js, line 32873)
"Loading level index 0 at sn 402 part 6 age 2.4 https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=402&_HLS_part=6"
[Info] [info] > – "[abr]:" – "switch candidate:2->2 adjustedbw(10422061)-bitrate=8202061 ttfb:0.1 avgDuration:0.4 maxFetchDuration:3.0 fetchDuration:0.…" (hls.js, line 4602)
"switch candidate:2->2 adjustedbw(10422061)-bitrate=8202061 ttfb:0.1 avgDuration:0.4 maxFetchDuration:3.0 fetchDuration:0.2 firstSelection:false codecSet:avc1,mp4a videoRange:SDR hls.loadLevel:0"
[Log] [log] > – "[stream-controller]:" – "Level 0 loaded [396,401][part-402-5], cc [1, 1] duration:26.4" (hls.js, line 33626)
[Log] [log] > – "[buffer-controller]:" – "Updating MediaSource duration to 30.400" (hls.js, line 19767)
[Log] [log] > – "[stream-controller]:" – "WAITING_LEVEL->IDLE" (hls.js, line 10616)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 27.122213850505755, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ2: buffer: {\"len\":2.957797732818765,\"start\":24.08,\"end\":30.08,\"buffered\":[{\"start\":24.08,\"end\":30.08}],\"bufferedIndex\":0}" (hls.js, line 33402)
[Log] [log] > – "[stream-controller]:" – "Loading main sn: 402 part: 5 (25/25) of level 0 (part:[30.000-30.400]INDEPENDENT=YES) cc: 1 [396-401], target: 30.08" (hls.js, line 9675)
[Log] [log] > – "[stream-controller]:" – "IDLE->FRAG_LOADING" (hls.js, line 10616)
[Log] [log] > – "[transmuxer-interface]: Starting new transmux session for main sn: 402 part: 5 level: 0 id: 1↵        discontinuity: false↵      …" (hls.js, line 17003)
"[transmuxer-interface]: Starting new transmux session for main sn: 402 part: 5 level: 0 id: 1
        discontinuity: false
        trackSwitch: true
        contiguous: false
        accurateTimeOffset: true
        timeOffset: 30
        initSegmentChange: true"
[Log] [log] > – "[stream-controller]:" – "FRAG_LOADING->PARSING" (hls.js, line 10616)
[Log] [log] > – "[stream-controller]:" – "Init audiovideo buffer, container:video/mp4, codecs[level/parsed]=[avc1.4d401f,mp4a.40.2/mp4a.40.2,avc1.4D401F]" (hls.js, line 34235)
[Log] [log] > – "[buffer-controller]:" – "BUFFER_CODECS: \"audiovideo\" (current SB count 1)" (hls.js, line 19156)
[Log] [log] > – "[buffer-controller]:" – "XXX: appendExecutor: buffer appending https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true, sn…" (hls.js, line 19369)
"XXX: appendExecutor: buffer appending https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true, sn: initSegment, sz: 1121"
[Log] [log] > – "[buffer-controller]:" – "Source audiovideo is updating: false, SWindow: 0, EWindow: Infinity" (hls.js, line 20006)
[Warning] [warn] > – "[stream-controller]:" – "Media segment with muxed audiovideo where only video expected: " (hls.js, line 34152)
[Log] [log] > – "[transmuxer.ts]: Flushed main sn: 402 part: 5 of level 0" (hls.js, line 16839)
[Log] [log] > – "[stream-controller]:" – "PARSING->PARSED" (hls.js, line 10616)
[Log] [log] > – "[stream-controller]:" – "Parsed main sn: 402 part: 5 of level 0 (part:[30.000-30.400]INDEPENDENT=YES)" (hls.js, line 10523)
[Log] [log] > – "[buffer-controller]:" – "YYY: onSBUpdateEnd: audiovideo" (hls.js, line 19938)
[Log] [log] > – "[buffer-controller]:" – "RRR: BUFFER_APPENDED https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true, sn: initSegment" (hls.js, line 19400)
[Log] [log] > – "[buffer-controller]:" – "XXX: appendExecutor: buffer appending https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=402&_H…" (hls.js, line 19369)
"XXX: appendExecutor: buffer appending https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=402&_HLS_part=5, sn: 402, sz: 45080"
[Log] [log] > – "[buffer-controller]:" – "Source audiovideo is updating: false, SWindow: 0, EWindow: Infinity" (hls.js, line 20006)
[Log] [log] > – "[buffer-controller]:" – "YYY: onSBUpdateEnd: audiovideo" (hls.js, line 19938)
[Log] [log] > – "[buffer-controller]:" – "RRR: BUFFER_APPENDED https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=402&_HLS_part=5, sn…" (hls.js, line 19400)
"RRR: BUFFER_APPENDED https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=402&_HLS_part=5, sn: 402"
[Log] [log] > – "[stream-controller]:" – "Buffered main sn: 402 part: 5 of level 0 (part:[30.000-30.400]INDEPENDENT=YES > buffer:[24.080-30.080])" (hls.js, line 9585)
[Log] [log] > – "[stream-controller]:" – "PARSED->IDLE" (hls.js, line 10616)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 27.201713100824424, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ2: buffer: {\"len\":2.878303732365449,\"start\":24.08,\"end\":30.08,\"buffered\":[{\"start\":24.08,\"end\":30.08}],\"bufferedIndex\":0}" (hls.js, line 33402)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 27.23542080894477, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ2: buffer: {\"len\":2.8446063577347296,\"start\":24.08,\"end\":30.08,\"buffered\":[{\"start\":24.08,\"end\":30.08}],\"bufferedIndex\":0}" (hls.js, line 33402)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 27.3364291416706, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ2: buffer: {\"len\":2.7436005246786905,\"start\":24.08,\"end\":30.08,\"buffered\":[{\"start\":24.08,\"end\":30.08}],\"bufferedIndex\":0}" (hls.js, line 33402)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 27.43662339190407, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ2: buffer: {\"len\":2.6434042329861356,\"start\":24.08,\"end\":30.08,\"buffered\":[{\"start\":24.08,\"end\":30.08}],\"bufferedIndex\":0}" (hls.js, line 33402)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 27.537457142467606, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ2: buffer: {\"len\":2.542580899265598,\"start\":24.08,\"end\":30.08,\"buffered\":[{\"start\":24.08,\"end\":30.08}],\"bufferedIndex\":0}" (hls.js, line 33402)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 27.638521392340767, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ2: buffer: {\"len\":2.4415052742185104,\"start\":24.08,\"end\":30.08,\"buffered\":[{\"start\":24.08,\"end\":30.08}],\"bufferedIndex\":0}" (hls.js, line 33402)
[Warning] [warn] > – "2025-04-08T19:46:36.200Z" (hls.js, line 8134)
[Warning] [warn] > – "2025-04-08T19:46:40.200Z" (hls.js, line 8134)
[Warning] [warn] > – "2025-04-08T19:46:44.200Z" (hls.js, line 8134)
[Warning] [warn] > – "2025-04-08T19:46:48.200Z" (hls.js, line 8134)
[Warning] [warn] > – "2025-04-08T19:46:52.200Z" (hls.js, line 8134)
[Warning] [warn] > – "2025-04-08T19:46:56.200Z" (hls.js, line 8134)
[Log] [log] > – "[level-controller]:" – "live playlist 0 REFRESHED 402-6" (hls.js, line 18043)
[Log] [log] > – "[level-controller]:" – "Loading level index 0 at sn 402 part 7 age 0.6 https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_m…" (hls.js, line 32873)
"Loading level index 0 at sn 402 part 7 age 0.6 https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=402&_HLS_part=7"
[Info] [info] > – "[abr]:" – "switch candidate:0->2 adjustedbw(7345503)-bitrate=5125503 ttfb:0.1 avgDuration:0.4 maxFetchDuration:2.4 fetchDuration:0.…" (hls.js, line 4602)
"switch candidate:0->2 adjustedbw(7345503)-bitrate=5125503 ttfb:0.1 avgDuration:0.4 maxFetchDuration:2.4 fetchDuration:0.2 firstSelection:false codecSet:avc1,mp4a videoRange:SDR hls.loadLevel:0"
[Log] [log] > – "[stream-controller]:" – "Level 0 loaded [396,401][part-402-6], cc [1, 1] duration:26.799999999999997" (hls.js, line 33626)
[Log] [log] > – "[buffer-controller]:" – "Updating MediaSource duration to 30.800" (hls.js, line 19767)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 27.673265309049743, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ2: buffer: {\"len\":2.4067481075832653,\"start\":24.08,\"end\":30.08,\"buffered\":[{\"start\":24.08,\"end\":30.08}],\"bufferedIndex\":0}" (hls.js, line 33402)
[Log] [log] > – "[stream-controller]:" – "Loading main sn: 402 part: 6 (26/26) of level 0 (part:[30.400-30.800]INDEPENDENT=NO) cc: 1 [396-401], target: 30.08" (hls.js, line 9675)
[Log] [log] > – "[stream-controller]:" – "IDLE->FRAG_LOADING" (hls.js, line 10616)
[Log] [log] > – "[stream-controller]:" – "FRAG_LOADING->PARSING" (hls.js, line 10616)
[Warning] [warn] > – "[stream-controller]:" – "Media segment with muxed audiovideo where only video expected: " (hls.js, line 34152)
[Log] [log] > – "[buffer-controller]:" – "XXX: appendExecutor: buffer appending https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=402&_H…" (hls.js, line 19369)
"XXX: appendExecutor: buffer appending https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=402&_HLS_part=6, sn: 402, sz: 28457"
[Log] [log] > – "[buffer-controller]:" – "Source audiovideo is updating: false, SWindow: 0, EWindow: Infinity" (hls.js, line 20006)
[Log] [log] > – "[transmuxer.ts]: Flushed main sn: 402 part: 6 of level 0" (hls.js, line 16839)
[Log] [log] > – "[stream-controller]:" – "PARSING->PARSED" (hls.js, line 10616)
[Log] [log] > – "[stream-controller]:" – "Parsed main sn: 402 part: 6 of level 0 (part:[30.400-30.800]INDEPENDENT=NO)" (hls.js, line 10523)
[Log] [log] > – "[buffer-controller]:" – "YYY: onSBUpdateEnd: audiovideo" (hls.js, line 19938)
[Log] [log] > – "[buffer-controller]:" – "RRR: BUFFER_APPENDED https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=402&_HLS_part=6, sn…" (hls.js, line 19400)
"RRR: BUFFER_APPENDED https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=402&_HLS_part=6, sn: 402"
[Log] [log] > – "[stream-controller]:" – "Buffered main sn: 402 part: 6 of level 0 (part:[30.400-30.800]INDEPENDENT=NO > buffer:[24.080-30.080])" (hls.js, line 9585)
[Log] [log] > – "[stream-controller]:" – "PARSED->IDLE" (hls.js, line 10616)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 27.751318892442928, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ2: buffer: {\"len\":2.328695274370414,\"start\":24.08,\"end\":30.08,\"buffered\":[{\"start\":24.08,\"end\":30.08}],\"bufferedIndex\":0}" (hls.js, line 33402)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 27.839734808986382, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ2: buffer: {\"len\":2.240290774444741,\"start\":24.08,\"end\":30.08,\"buffered\":[{\"start\":24.08,\"end\":30.08}],\"bufferedIndex\":0}" (hls.js, line 33402)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 27.94052564233048, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ2: buffer: {\"len\":2.1395076496575918,\"start\":24.08,\"end\":30.08,\"buffered\":[{\"start\":24.08,\"end\":30.08}],\"bufferedIndex\":0}" (hls.js, line 33402)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 28.041571267149134, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ2: buffer: {\"len\":2.0384624830496456,\"start\":24.08,\"end\":30.08,\"buffered\":[{\"start\":24.08,\"end\":30.08}],\"bufferedIndex\":0}" (hls.js, line 33402)
[Warning] [warn] > – "2025-04-08T19:46:36.200Z" (hls.js, line 8134)
[Warning] [warn] > – "2025-04-08T19:46:40.200Z" (hls.js, line 8134)
[Warning] [warn] > – "2025-04-08T19:46:44.200Z" (hls.js, line 8134)
[Warning] [warn] > – "2025-04-08T19:46:48.200Z" (hls.js, line 8134)
[Warning] [warn] > – "2025-04-08T19:46:52.200Z" (hls.js, line 8134)
[Warning] [warn] > – "2025-04-08T19:46:56.200Z" (hls.js, line 8134)

Also i see that targetBufferTime does not changed after switch:

// Start playing:
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 25.301999999999996, currentTime: 0, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 25.301999999999996, currentTime: 0, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 27.615079365079364, currentTime: 25.39164829146862, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 27.615079365079364, currentTime: 25.377664833188057, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 28.08, currentTime: 25.584303559667248, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 28.6, currentTime: 25.666111142567654, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 28.6, currentTime: 25.72571501743876, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 28.6, currentTime: 25.82644480972838, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 28.6, currentTime: 25.83506497641381, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 28.92, currentTime: 25.91402818429284, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 28.92, currentTime: 25.926693684225903, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 28.92, currentTime: 26.02706610065885, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 28.92, currentTime: 26.12780343350051, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 28.92, currentTime: 26.15886976690991, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 29.4, currentTime: 26.246468350105268, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 29.4, currentTime: 26.32945572529537, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 29.4, currentTime: 26.43048797492487, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 29.4, currentTime: 26.480848850129075, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 29.72, currentTime: 26.56048943459892, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 29.72, currentTime: 26.63143355989733, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 29.72, currentTime: 26.732518018277315, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 29.72, currentTime: 26.82435718510109, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 26.90384860155913, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 26.93345747539784, bt: null" (hls.js, line 33401)

[Log] [log] > – "set loadLevel:0" (hls.js, line 35798)
[Log] [log] > – "[level-controller]:" – "Switching to level 0 (480p SDR avc1,mp4a @850000) from level 2" (hls.js, line 32996)
[

[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 27.122213850505755, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 27.201713100824424, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 27.23542080894477, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 27.3364291416706, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 27.43662339190407, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 27.537457142467606, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 27.638521392340767, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 27.673265309049743, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 27.751318892442928, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 27.839734808986382, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 27.94052564233048, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 28.041571267149134, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 28.06720905864118, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 28.147161685171184, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 28.242806393428353, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 28.34308747642361, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 28.443335768046456, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 28.521222393239515, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 28.60258235191735, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 28.64467131035211, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 28.74537414368004, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 28.845343976837995, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 28.94643451884031, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 29.04698097711071, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 29.050126477196958, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 29.14314451865494, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 29.37122147551744, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 29.613921434833998, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 29.69264376836955, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 29.927286434357484, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 30.001056102, bt: null" (hls.js, line 33401)

[Warning] [warn] > – "[gap-controller]:" – "Playback stalling at @30.006514602 due to low buffer ({\"len\":0.07348539799999898,\"start\":24.08,\"end\":30.08,\"buffered\":[{\"start\":24.08,\"end\":…" (hls.js, line 31725)
"Playback stalling at @30.006514602 due to low buffer ({\"len\":0.07348539799999898,\"start\":24.08,\"end\":30.08,\"buffered\":[{\"start\":24.08,\"end\":30.08}],\"bufferedIndex\":0})"
[Warning] [warn] > – "[latency-controller]: Stall detected, adjusting target latency" (hls.js, line 32375)

buffer: 0.07348539799999898

bufferInfo: {len: 0.07348539799999898, start: 24.08, end: 30.08, nextStart: undefined, buffered: [{start: 24.08, end: 30.08}], …}

details: "bufferStalledError"

error: Error: Playback stalling at @30.006514602 due to low buffer ({"len":0.07348539799999898,"start":24.08,"end":30.08,"buffered":[{"start":24.08,"end":30.08}],"bufferedIndex":0})

errorAction: {action: 0, flags: 0}

fatal: false

stalled: {start: 6393}

[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 30.006514602, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 30.006514602, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 30.006514602, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 30.006514602, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 30.006514602, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 30.006514602, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 30.006514602, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 30.006514602, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 30.006514602, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 30.006514602, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 30.006514602, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 30.006514602, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 30.006514602, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 30.006514602, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 30.006514602, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 30.006514602, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 30.006514602, bt: null" (hls.js, line 33401)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 30.08, currentTime: 30.006514602, bt: null" (hls.js, line 33401)

currentTime ticks until there is something actual in the buffer. When currentTime reaches targetBufferTime hlsjs detects stall and video stops.

Main question is why new fragments after switch have not been added into buffer? Any ideas what else could i check?

Shaienn avatar Apr 08 '25 20:04 Shaienn

Main question is why new fragments after switch have not been added into buffer? Any ideas what else could i check?

Log the range of available segments from LevelDetails.fragmentStart to edge (partEnd or fragmentEnd). In the stream-controller, get the latest details with getLevelDetails(), or from the player instance hls.latestLevelDetails.edge.

If the playlist is not aligned with playback after switching, then the stream controller cannot find anything to load that would fill the target buffer position.

These times would be useful to log as part of the line: [stream-controller]:" – "Level 0 loaded [396,401][part-402-6], cc [1, 1] duration:26

robwalch avatar Apr 09 '25 19:04 robwalch

If you look at only the Buffered main log lines, there is a pattern:

Loading main sn: 402 part: 4 (24/24) of level 2 (part:[29.600-30.000]INDEPENDENT=NO) cc: 1 [396-401], target: 29.72
Buffered main sn: 402 part: 4 of level 2 (part:[29.600-30.000]INDEPENDENT=NO > buffer:[24.080-30.080])

Loading main sn: 402 part: 5 (25/25) of level 0 (part:[30.000-30.400]INDEPENDENT=YES) cc: 1 [396-401], target: 30.08
Buffered main sn: 402 part: 5 of level 0 (part:[30.000-30.400]INDEPENDENT=YES > buffer:[24.080-30.080])

Loading main sn: 402 part: 6 (26/26) of level 0 (part:[30.400-30.800]INDEPENDENT=NO) cc: 1 [396-401], target: 30.08
Buffered main sn: 402 part: 6 of level 0 (part:[30.400-30.800]INDEPENDENT=NO > buffer:[24.080-30.080])

After the switch, the appended parts do not change the buffered range; it still ends at 30.080 rather than growing by the part duration. So why is that? Does "main sn: 402 part: 5" contain a keyframe or not? If it is marked as INDEPENDENT, then it should and appending the init segment and this part should grow the buffer.

robwalch avatar Apr 09 '25 19:04 robwalch

I did notice that parts are not reloaded after quickly switching variants from and then back to a level. #7167 fixes part loaded tracking so that previously loaded parts can be reloaded. I'm not sure if that is related at all to what you are experiencing because you only describe a single level switch.

Are you testing in other browsers besides Safari? Playback of audio stops in Safari on auto switch (1) and ALL playback is halted on buffer flush with a manual switch (2 - reproduced by setting currentLevel). This appears to be a bug in Safari - please report the issue via Feedback Assistant. It may be relative to your content. A single HLS VOD playlist of MAP and media segments may be useful in isolating the issue.

robwalch avatar Apr 09 '25 23:04 robwalch

I add the following:

    const details = this.getLevelDetails();
    this.log(
      `Level ${newLevelId} loaded [${newDetails.startSN},${newDetails.endSN}]${
        newDetails.lastPartSn
          ? `[part-${newDetails.lastPartSn}-${newDetails.lastPartIndex}]`
          : ''
      }, cc [${newDetails.startCC}, ${newDetails.endCC}] duration:${duration} || fragments: [${details?.fragmentStart}, (${details?.partEnd}/${details?.fragmentEnd})]`,
    );

Switching moment log:

[Log] [log] > – "[level-controller]:" – "live playlist 2 REFRESHED 488-3" (hls.js, line 18045)
[Log] [log] > – "[level-controller]:" – "Loading level index 2 at sn 488 part 4 age 0.4 https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v3a1/index.ll.m3u8?multitrack=true&_HLS_m…" (hls.js, line 32881)
"Loading level index 2 at sn 488 part 4 age 0.4 https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v3a1/index.ll.m3u8?multitrack=true&_HLS_msn=488&_HLS_part=4"

[Log] [log] > – "[stream-controller]:" – "Level 2 loaded [486,487][part-488-3], cc [1, 1] duration:5.600000000000001 || fragments: [7.714, (12.914000000000001/11.714)]" (hls.js, line 33642)

[Log] [log] > – "[buffer-controller]:" – "Updating MediaSource duration to 13.314" (hls.js, line 19769)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 13.2, this.media.currentTime: 10.928462291245602, this.media.readyState: 4" (hls.js, line 33409)
[Log] [log] > – "[stream-controller]:" – "this.media.played.start: 4.102, this.media.played.end: 10.928483457879416" (hls.js, line 33413)
[Log] [log] > – "[stream-controller]:" – "Loading main sn: 488 part: 3 (13/13) of level 2 (part:[12.914-13.314]INDEPENDENT=NO) cc: 1 [486-487], target: 13.2" (hls.js, line 9675)
[Log] [log] > – "[stream-controller]:" – "IDLE->FRAG_LOADING" (hls.js, line 10616)
[Log] [log] > – "[stream-controller]:" – "FRAG_LOADING->PARSING" (hls.js, line 10616)
[Warning] [warn] > – "[stream-controller]:" – "Media segment with muxed audiovideo where only video expected: " (hls.js, line 34170)
[Log] [log] > – "[buffer-controller]:" – "XXX: appendExecutor: buffer appending https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v3a1/index.ll.m3u8?multitrack=true&_HLS_msn=488&_H…" (hls.js, line 19371)
"XXX: appendExecutor: buffer appending https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v3a1/index.ll.m3u8?multitrack=true&_HLS_msn=488&_HLS_part=3, sn: 488, sz: 131814"
[Log] [log] > – "[buffer-controller]:" – "Source audiovideo is updating: false, SWindow: 0, EWindow: Infinity" (hls.js, line 20008)
[Log] [log] > – "[buffer-controller]:" – "sb.buffered: [4 - 13.2]" (hls.js, line 20011)
[Log] [log] > – "[transmuxer.ts]: Flushed main sn: 488 part: 3 of level 2" (hls.js, line 16841)
[Log] [log] > – "[stream-controller]:" – "PARSING->PARSED" (hls.js, line 10616)
[Log] [log] > – "[stream-controller]:" – "Parsed main sn: 488 part: 3 of level 2 (part:[12.914-13.314]INDEPENDENT=NO)" (hls.js, line 10523)
[Log] [log] > – "[buffer-controller]:" – "YYY: onSBUpdateEnd" (hls.js, line 19940)
[Log] [log] > – "[buffer-controller]:" – "RRR: BUFFER_APPENDED https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v3a1/index.ll.m3u8?multitrack=true&_HLS_msn=488&_HLS_part=3, sn…" (hls.js, line 19402)
"RRR: BUFFER_APPENDED https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v3a1/index.ll.m3u8?multitrack=true&_HLS_msn=488&_HLS_part=3, sn: 488"
[Log] [log] > – "[stream-controller]:" – "Buffered main sn: 488 part: 3 of level 2 (part:[12.914-13.314]INDEPENDENT=NO > buffer:[4.000-13.600])" (hls.js, line 9585)
[Log] [log] > – "[stream-controller]:" – "PARSED->IDLE" (hls.js, line 10616)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 13.6, this.media.currentTime: 11.003665250197589, this.media.readyState: 4" (hls.js, line 33409)
[Log] [log] > – "[stream-controller]:" – "this.media.played.start: 4.102, this.media.played.end: 11.003683958605468" (hls.js, line 33413
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 13.6, this.media.currentTime: 11.044908625010937, this.media.readyState: 4" (hls.js, line 33409)
[Log] [log] > – "[stream-controller]:" – "this.media.played.start: 4.102, this.media.played.end: 11.044946375240176" (hls.js, line 33413)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 13.6, this.media.currentTime: 11.145715292014717, this.media.readyState: 4" (hls.js, line 33409)
[Log] [log] > – "[stream-controller]:" – "this.media.played.start: 4.102, this.media.played.end: 11.145774583735108" (hls.js, line 33413)


[Log] [log] > – "set currentLevel:0" (hls.js, line 35775)


[Log] [log] > – "[level-controller]:" – "Switching to level 0 (480p SDR avc1,mp4a @890000) from level 2" (hls.js, line 33004)
[Log] [log] > – "[level-controller]:" – "Loading level index 0 at sn 488 part 4 age 7.9 https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_m…" (hls.js, line 32881)
"Loading level index 0 at sn 488 part 4 age 7.9 https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=488&_HLS_part=4"
[Log] [log] > – "[playlist-loader]: aborting previous loader for type: level" (hls.js, line 34861)
[Log] [log] > – "[stream-controller]:" – "IDLE->WAITING_LEVEL" (hls.js, line 10616)
[Log] [log] > – "[buffer-controller]:" – "queuing \"audiovideo\" remove 0-Infinity" (hls.js, line 19455)
[Log] [log] > – "[buffer-controller]:" – "Removing [0,13.6] from the audiovideo SourceBuffer" (hls.js, line 19990)
[Log] [log] > – "[stream-controller]:" – "WAITING_LEVEL->IDLE" (hls.js, line 10616)
[Log] [log] > – "[stream-controller]:" – "IDLE->WAITING_LEVEL" (hls.js, line 10616)
[Log] [log] > – "[buffer-controller]:" – "YYY: onSBUpdateEnd" (hls.js, line 19940)
[Log] [log] > – "[level-controller]:" – "live playlist 0 REFRESHED 488-4" (hls.js, line 18045)
[Log] [log] > – "[level-controller]:" – "Loading level index 0 at sn 489 part 0 age 8.0 https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_m…" (hls.js, line 32881)
"Loading level index 0 at sn 489 part 0 age 8.0 https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=489&_HLS_part=0"

[Log] [log] > – "[stream-controller]:" – "Level 0 loaded [487,488][part-488-4], cc [1, 1] duration:4 || fragments: [7.714, (13.314000000000002/11.714)]" (hls.js, line 33642)

[Log] [log] > – "[stream-controller]:" – "Setting startPosition to -1 to start at live edge 12.501" (hls.js, line 10280)
[Log] [log] > – "[buffer-controller]:" – "Updating MediaSource duration to 14.000" (hls.js, line 19769)
[Log] [log] > – "[stream-controller]:" – "WAITING_LEVEL->IDLE" (hls.js, line 10616)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 11.18880875, this.media.currentTime: 11.18880875, this.media.readyState: 1" (hls.js, line 33409)
[Log] [log] > – "[stream-controller]:" – "this.media.played.start: 4.102, this.media.played.end: 11.18880875" (hls.js, line 33413)
[Log] [log] > – "[stream-controller]:" – "Live playlist, switching playlist, load frag with same PDT: 1744270144069" (hls.js, line 10146)
[Log] [log] > – "[stream-controller]:" – "Setting startPosition to 12.501 to match start frag at live edge. mainStart: 12.501 liveSyncPosition: 12.501 frag.start: 12" (hls.js, line 10014)
[Log] [log] > – "[stream-controller]:" – "Loading main sn: 488 part: 0 (5/9) of level 0 (part:[12.000-12.400]INDEPENDENT=YES) cc: 1 [487-488], target: 12" (hls.js, line 9675)
[Log] [log] > – "[stream-controller]:" – "IDLE->FRAG_LOADING" (hls.js, line 10616)
[Log] [log] > – "[transmuxer-interface]: Starting new transmux session for main sn: 488 part: 0 level: 0 id: 1↵        discontinuity: false↵      …" (hls.js, line 17005)
"[transmuxer-interface]: Starting new transmux session for main sn: 488 part: 0 level: 0 id: 1
        discontinuity: false
        trackSwitch: true
        contiguous: false
        accurateTimeOffset: false
        timeOffset: 12
        initSegmentChange: true"
[Log] [log] > – "[transmuxer] YYY configureTransmuxer" (hls.js, line 16841)
[Log] [log] > – "[transmuxer] ZZZ resetInitSegment" (hls.js, line 16841)
[Log] [log] > – "[stream-controller]:" – "FRAG_LOADING->PARSING" (hls.js, line 10616)
[Log] [log] > – "[stream-controller]:" – "Init audiovideo buffer, container:video/mp4, codecs[level/parsed]=[avc1.4d401f,mp4a.40.2/mp4a.40.2,avc1.4D401F]" (hls.js, line 34253)
[Log] [log] > – "[buffer-controller]:" – "BUFFER_CODECS: \"audiovideo\" (current SB count 1)" (hls.js, line 19158)
[Log] {audiovideo: Object, tracks: Object} (hls.js, line 34265)
[Log] [log] > – "[buffer-controller]:" – "XXX: appendExecutor: buffer appending https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true, sn…" (hls.js, line 19371)
"XXX: appendExecutor: buffer appending https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true, sn: initSegment, sz: 1122"
[Log] [log] > – "[buffer-controller]:" – "Source audiovideo is updating: false, SWindow: 0, EWindow: Infinity" (hls.js, line 20008)
[Log] [log] > – "[buffer-controller]:" – "sb.buffered.length: 0, sourceBufferCount: 1" (hls.js, line 20013)
[Warning] [warn] > – "[stream-controller]:" – "Media segment with muxed audiovideo where only video expected: https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/seg-0-488.llhls.cmfv" (hls.js, line 34170)
[Log] [log] > – "[buffer-controller]:" – "YYY: onSBUpdateEnd" (hls.js, line 19940)
[Log] [log] > – "[buffer-controller]:" – "RRR: BUFFER_APPENDED https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true, sn: initSegment" (hls.js, line 19402)
[Log] [log] > – "[buffer-controller]:" – "XXX: appendExecutor: buffer appending https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=488&_H…" (hls.js, line 19371)
"XXX: appendExecutor: buffer appending https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=488&_HLS_part=4, sn: 488, sz: 35565"
[Log] [log] > – "[buffer-controller]:" – "Source audiovideo is updating: false, SWindow: 0, EWindow: Infinity" (hls.js, line 20008)
[Log] [log] > – "[buffer-controller]:" – "sb.buffered.length: 0, sourceBufferCount: 1" (hls.js, line 20013)
[Log] [log] > – "[buffer-controller]:" – "YYY: onSBUpdateEnd" (hls.js, line 19940)
[Log] [log] > – "[buffer-controller]:" (hls.js, line 19402)
"RRR: BUFFER_APPENDED https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=488&_HLS_part=4, sn: 488"
[Log] [log] > – "[buffer-controller]:" (hls.js, line 19371)
"XXX: appendExecutor: buffer appending https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=488&_HLS_part=4, sn: 488, sz: 31868"
[Log] [log] > – "[buffer-controller]:" – "Source audiovideo is updating: false, SWindow: 0, EWindow: Infinity" (hls.js, line 20008)
[Log] [log] > – "[buffer-controller]:" – "sb.buffered.length: 0, sourceBufferCount: 1" (hls.js, line 20013)
[Log] [log] > – "[buffer-controller]:" – "YYY: onSBUpdateEnd" (hls.js, line 19940)
[Warning] [warn] > – "[stream-controller]:" – "Media segment with muxed audiovideo where only video expected: https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/seg-0-488.llhls.cmfv" (hls.js, line 34170)
[Log] [log] > – "[buffer-controller]:" – "XXX: appendExecutor: buffer appending https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=488&_H…" (hls.js, line 19371)
"XXX: appendExecutor: buffer appending https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=488&_HLS_part=4, sn: 488, sz: 30350"
[Log] [log] > – "[buffer-controller]:" – "Source audiovideo is updating: false, SWindow: 0, EWindow: Infinity" (hls.js, line 20008)
[Log] [log] > – "[buffer-controller]:" – "sb.buffered.length: 0, sourceBufferCount: 1" (hls.js, line 20013)
[Log] [log] > – "[buffer-controller]:" – "YYY: onSBUpdateEnd" (hls.js, line 19940)
[Log] [log] > – "[buffer-controller]:" (hls.js, line 19402)
"RRR: BUFFER_APPENDED https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=488&_HLS_part=4, sn: 488"
[Warning] [warn] > – "[stream-controller]:" – "Media segment with muxed audiovideo where only video expected: https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/seg-0-488.llhls.cmfv" (hls.js, line 34170)
[Log] [log] > – "[buffer-controller]:" – "XXX: appendExecutor: buffer appending https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=488&_H…" (hls.js, line 19371)
"XXX: appendExecutor: buffer appending https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=488&_HLS_part=4, sn: 488, sz: 32030"
[Log] [log] > – "[buffer-controller]:" – "Source audiovideo is updating: false, SWindow: 0, EWindow: Infinity" (hls.js, line 20008)
[Log] [log] > – "[buffer-controller]:" – "sb.buffered.length: 0, sourceBufferCount: 1" (hls.js, line 20013)
[Log] [log] > – "[buffer-controller]:" – "YYY: onSBUpdateEnd" (hls.js, line 19940)
[Log] [log] > – "[buffer-controller]:" – "RRR: BUFFER_APPENDED https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=488&_HLS_part=4, sn…" (hls.js, line 19402)
"RRR: BUFFER_APPENDED https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=488&_HLS_part=4, sn: 488"
[Warning] [warn] > – "[stream-controller]:" – "Media segment with muxed audiovideo where only video expected: https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/seg-0-488.llhls.cmfv" (hls.js, line 34170)
[Log] [log] > – "[buffer-controller]:" – "XXX: appendExecutor: buffer appending https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=488&_H…" (hls.js, line 19371)
"XXX: appendExecutor: buffer appending https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=488&_HLS_part=4, sn: 488, sz: 30598"
[Log] [log] > – "[buffer-controller]:" – "Source audiovideo is updating: false, SWindow: 0, EWindow: Infinity" (hls.js, line 20008)
[Log] [log] > – "[buffer-controller]:" – "sb.buffered.length: 0, sourceBufferCount: 1" (hls.js, line 20013)
[Log] [log] > – "[transmuxer.ts]: Flushed main sn: 488 part: 4 of level 0" (hls.js, line 16841)
[Log] [log] > – "[stream-controller]:" – "PARSING->PARSED" (hls.js, line 10616)
[Log] [log] > – "[stream-controller]:" – "Parsed main sn: 488 part: 4 of level 0 (part:[13.600-14.000]INDEPENDENT=NO)" (hls.js, line 10523)
[Log] [log] > – "[buffer-controller]:" – "YYY: onSBUpdateEnd" (hls.js, line 19940)
[Log] [log] > – "[buffer-controller]:" – "RRR: BUFFER_APPENDED https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=488&_HLS_part=4, sn…" (hls.js, line 19402)
"RRR: BUFFER_APPENDED https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=488&_HLS_part=4, sn: 488"
[Log] [log] > – "[stream-controller]:" – "Buffered main sn: 488 part: 4 of level 0 (part:[13.600-14.000]INDEPENDENT=NO > buffer:)" (hls.js, line 9585)
[Log] [log] > – "[stream-controller]:" – "PARSED->IDLE" (hls.js, line 10616)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 11.18880875, this.media.currentTime: 11.18880875, this.media.readyState: 1" (hls.js, line 33409)
[Log] [log] > – "[stream-controller]:" – "this.media.played.start: 4.102, this.media.played.end: 11.18880875" (hls.js, line 33413)
[Log] [log] > – "[stream-controller]:" – "Loading main sn: 487 part: 0 (0/9) of level 0 (part:[10.000-10.400]INDEPENDENT=YES) cc: 1 [487-488], target: 11.189" (hls.js, line 9675)
[Log] [log] > – "[stream-controller]:" – "IDLE->FRAG_LOADING" (hls.js, line 10616)
[Log] [log] > – "[level-controller]:" – "live playlist 0 REFRESHED 489-0" (hls.js, line 18045)
[Log] [log] > – "[level-controller]:" – "Loading level index 0 at sn 489 part 1 age 0.4 https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_m…" (hls.js, line 32881)
"Loading level index 0 at sn 489 part 1 age 0.4 https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=489&_HLS_part=1"
[Info] [info] > – "[abr]:" – "switch candidate:0->2 adjustedbw(10902879)-bitrate=7402879 ttfb:0.1 avgDuration:0.4 maxFetchDuration:0.4 fetchDuration:0.…" (hls.js, line 4602)
"switch candidate:0->2 adjustedbw(10902879)-bitrate=7402879 ttfb:0.1 avgDuration:0.4 maxFetchDuration:0.4 fetchDuration:0.2 firstSelection:false codecSet:avc1,mp4a videoRange:SDR hls.loadLevel:0"
[Log] [log] > – "[stream-controller]:" – "Level 0 loaded [487,488][part-489-0], cc [1, 1] duration:4.4 || fragments: [10, (14/14)]" (hls.js, line 33642)
[Log] [log] > – "[buffer-controller]:" – "Updating MediaSource duration to 14.400" (hls.js, line 19769)
[Log] [log] > – "[transmuxer-interface]: Starting new transmux session for main sn: 487 part: 0 level: 0 id: 1↵        discontinuity: false↵      …" (hls.js, line 17005)
"[transmuxer-interface]: Starting new transmux session for main sn: 487 part: 0 level: 0 id: 1
        discontinuity: false
        trackSwitch: false
        contiguous: false
        accurateTimeOffset: false
        timeOffset: 10
        initSegmentChange: false"
[Log] [log] > – "[stream-controller]:" – "FRAG_LOADING->PARSING" (hls.js, line 10616)
[Warning] [warn] > – "[stream-controller]:" – "Media segment with muxed audiovideo where only video expected: https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/seg-0-487.llhls.cmfv" (hls.js, line 34170)
[Log] [log] > – "[buffer-controller]:" – "XXX: appendExecutor: buffer appending https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=489&_H…" (hls.js, line 19371)
"XXX: appendExecutor: buffer appending https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=489&_HLS_part=0, sn: 487, sz: 25212"
[Log] [log] > – "[buffer-controller]:" – "Source audiovideo is updating: false, SWindow: 0, EWindow: Infinity" (hls.js, line 20008)
[Log] [log] > – "[buffer-controller]:" – "sb.buffered.length: 0, sourceBufferCount: 1" (hls.js, line 20013)
[Log] [log] > – "[buffer-controller]:" – "YYY: onSBUpdateEnd" (hls.js, line 19940)
[Log] [log] > – "[buffer-controller]:" (hls.js, line 19402)
"RRR: BUFFER_APPENDED https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=489&_HLS_part=0, sn: 487"
[Warning] [warn] > – "[stream-controller]:" – "Media segment with muxed audiovideo where only video expected: https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/seg-0-487.llhls.cmfv" (hls.js, line 34170)
[Log] [log] > – "[buffer-controller]:" – "XXX: appendExecutor: buffer appending https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=489&_H…" (hls.js, line 19371)
"XXX: appendExecutor: buffer appending https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=489&_HLS_part=0, sn: 487, sz: 29092"
[Log] [log] > – "[buffer-controller]:" – "Source audiovideo is updating: false, SWindow: 0, EWindow: Infinity" (hls.js, line 20008)
[Log] [log] > – "[buffer-controller]:" – "sb.buffered.length: 0, sourceBufferCount: 1" (hls.js, line 20013)
[Log] [log] > – "[buffer-controller]:" – "YYY: onSBUpdateEnd" (hls.js, line 19940)
[Log] [log] > – "[buffer-controller]:" (hls.js, line 19402)
"RRR: BUFFER_APPENDED https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=489&_HLS_part=0, sn: 487"
[Warning] [warn] > – "[stream-controller]:" – "Media segment with muxed audiovideo where only video expected: https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/seg-0-487.llhls.cmfv" (hls.js, line 34170)
[Log] [log] > – "[buffer-controller]:" – "XXX: appendExecutor: buffer appending https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=489&_H…" (hls.js, line 19371)
"XXX: appendExecutor: buffer appending https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=489&_HLS_part=0, sn: 487, sz: 28401"
[Log] [log] > – "[buffer-controller]:" – "Source audiovideo is updating: false, SWindow: 0, EWindow: Infinity" (hls.js, line 20008)
[Log] [log] > – "[buffer-controller]:" – "sb.buffered.length: 0, sourceBufferCount: 1" (hls.js, line 20013)
[Log] [log] > – "[buffer-controller]:" – "YYY: onSBUpdateEnd" (hls.js, line 19940)
[Log] [log] > – "[buffer-controller]:" (hls.js, line 19402)
"RRR: BUFFER_APPENDED https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=489&_HLS_part=0, sn: 487"
[Warning] [warn] > – "[stream-controller]:" – "Media segment with muxed audiovideo where only video expected: https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/seg-0-487.llhls.cmfv" (hls.js, line 34170)
[Log] [log] > – "[buffer-controller]:" – "XXX: appendExecutor: buffer appending https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=489&_H…" (hls.js, line 19371)
"XXX: appendExecutor: buffer appending https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=489&_HLS_part=0, sn: 487, sz: 30501"
[Log] [log] > – "[buffer-controller]:" – "Source audiovideo is updating: false, SWindow: 0, EWindow: Infinity" (hls.js, line 20008)
[Log] [log] > – "[buffer-controller]:" – "sb.buffered.length: 0, sourceBufferCount: 1" (hls.js, line 20013)
[Log] [log] > – "[buffer-controller]:" – "YYY: onSBUpdateEnd" (hls.js, line 19940)
[Log] [log] > – "[buffer-controller]:" – "RRR: BUFFER_APPENDED https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=489&_HLS_part=0, sn…" (hls.js, line 19402)
"RRR: BUFFER_APPENDED https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=489&_HLS_part=0, sn: 487"
[Warning] [warn] > – "[stream-controller]:" – "Media segment with muxed audiovideo where only video expected: https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/seg-0-487.llhls.cmfv" (hls.js, line 34170)
[Log] [log] > – "[buffer-controller]:" – "XXX: appendExecutor: buffer appending https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=489&_H…" (hls.js, line 19371)
"XXX: appendExecutor: buffer appending https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=489&_HLS_part=0, sn: 487, sz: 28738"
[Log] [log] > – "[buffer-controller]:" – "Source audiovideo is updating: false, SWindow: 0, EWindow: Infinity" (hls.js, line 20008)
[Log] [log] > – "[buffer-controller]:" – "sb.buffered.length: 0, sourceBufferCount: 1" (hls.js, line 20013)
[Log] [log] > – "[transmuxer.ts]: Flushed main sn: 487 part: 4 of level 0" (hls.js, line 16841)
[Log] [log] > – "[stream-controller]:" – "PARSING->PARSED" (hls.js, line 10616)
[Log] [log] > – "[stream-controller]:" – "Parsed main sn: 487 part: 4 of level 0 (part:[11.600-12.000]INDEPENDENT=NO)" (hls.js, line 10523)
[Log] [log] > – "[buffer-controller]:" – "YYY: onSBUpdateEnd" (hls.js, line 19940)
[Log] [log] > – "[buffer-controller]:" – "RRR: BUFFER_APPENDED https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=489&_HLS_part=0, sn…" (hls.js, line 19402)
"RRR: BUFFER_APPENDED https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=489&_HLS_part=0, sn: 487"
[Log] [log] > – "[stream-controller]:" – "Buffered main sn: 487 part: 4 of level 0 (part:[11.600-12.000]INDEPENDENT=NO > buffer:)" (hls.js, line 9585)
[Log] [log] > – "[stream-controller]:" – "PARSED->IDLE" (hls.js, line 10616)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 11.18880875, this.media.currentTime: 11.18880875, this.media.readyState: 1" (hls.js, line 33409)
[Log] [log] > – "[stream-controller]:" – "this.media.played.start: 4.102, this.media.played.end: 11.18880875" (hls.js, line 33413)
[Log] [log] > – "[stream-controller]:" – "LL-Part loading OFF after next part miss @12.00" (hls.js, line 9709)
[Log] [log] > – "[stream-controller]:" – "Loading main sn: 488 of level 0 (frag:[12.000-14.000]) cc: 1 [487-488], target: 12" (hls.js, line 9715)
[Log] [log] > – "[stream-controller]:" – "IDLE->FRAG_LOADING" (hls.js, line 10616)

A bit later it reached INDEPENDENT fragment but nothing is changed.

[Log] [log] > – "[stream-controller]:" – "Level 0 loaded [488,489][part-489-4], cc [1, 1] duration:4 || fragments: [10, (15.6/14)]" (hls.js, line 33642)
[Log] [log] > – "[buffer-controller]:" – "Updating MediaSource duration to 16.000" (hls.js, line 19769)
[Warning] [warn] > – "[stream-controller]:" – "Playback: 11.189 is located too far from the end of live sliding playlist: 16, reset currentTime to : 14.502" (hls.js, line 33706)
[Log] [log] > – "[stream-controller]:" – "FRAG_LOADING->PARSING" (hls.js, line 10616)
[Warning] [warn] > – "[stream-controller]:" – "Media segment with muxed audiovideo where only video expected: https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/seg-0-488.llhls.cmfv" (hls.js, line 34170)
[Log] [log] > – "[buffer-controller]:" – "XXX: appendExecutor: buffer appending https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=489&_H…" (hls.js, line 19371)
"XXX: appendExecutor: buffer appending https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=489&_HLS_part=4, sn: 488, sz: 160411"
[Log] [log] > – "[buffer-controller]:" – "Source audiovideo is updating: false, SWindow: 0, EWindow: Infinity" (hls.js, line 20008)
[Log] [log] > – "[buffer-controller]:" – "sb.buffered.length: 0, sourceBufferCount: 1" (hls.js, line 20013)
[Log] [log] > – "[transmuxer.ts]: Flushed main sn: 488 of level 0" (hls.js, line 16841)
[Log] [log] > – "[stream-controller]:" – "LL-Part loading ON after parsing segment ending @14.00" (hls.js, line 9822)
[Log] [log] > – "[stream-controller]:" – "PARSING->PARSED" (hls.js, line 10616)
[Log] [log] > – "[stream-controller]:" – "Parsed main sn: 488 of level 0 (frag:[12.000-14.000])" (hls.js, line 10523)
[Log] [log] > – "[stream-controller]:" – "media seeking to 14.502, state: PARSED" (hls.js, line 9176)
[Log] [log] > – "[audio-stream-controller]:" – "media seeking to 14.502, state: STOPPED" (hls.js, line 9176)
[Log] [log] > – "[subtitle-stream-controller]:" – "media seeking to 14.502, state: IDLE" (hls.js, line 9176)
[Log] [log] > – "[buffer-controller]:" – "YYY: onSBUpdateEnd" (hls.js, line 19940)
[Log] [log] > – "[buffer-controller]:" – "RRR: BUFFER_APPENDED https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=489&_HLS_part=4, sn…" (hls.js, line 19402)
"RRR: BUFFER_APPENDED https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=489&_HLS_part=4, sn: 488"
[Log] [log] > – "[stream-controller]:" – "Buffered main sn: 488 of level 0 (frag:[12.000-14.000] > buffer:)" (hls.js, line 9585)
[Log] [log] > – "[stream-controller]:" – "PARSED->IDLE" (hls.js, line 10616)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 14.501999999999999, this.media.currentTime: 14.501999999999999, this.media.readyState: 1" (hls.js, line 33409)
[Log] [log] > – "[stream-controller]:" – "this.media.played.start: 4.102, this.media.played.end: 11.18880875" (hls.js, line 33413)

[Log] [log] > – "[stream-controller]:" – "Loading main sn: 489 part: 0 (5/9) of level 0 (part:[14.000-14.400]INDEPENDENT=YES) cc: 1 [488-489], target: 14.502" (hls.js, line 9675)

[Log] [log] > – "[stream-controller]:" – "IDLE->FRAG_LOADING" (hls.js, line 10616)
[Log] [log] > – "[stream-controller]:" – "FRAG_LOADING->PARSING" (hls.js, line 10616)
[Log] {initPTS: undefined, timescale: 1} (hls.js, line 34049)
[Warning] [warn] > – "[stream-controller]:" – "Media segment with muxed audiovideo where only video expected: https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/seg-0-489.llhls.cmfv" (hls.js, line 34170)
[Log] [log] > – "[buffer-controller]:" – "XXX: appendExecutor: buffer appending https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=489&_H…" (hls.js, line 19371)
"XXX: appendExecutor: buffer appending https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=489&_HLS_part=4, sn: 489, sz: 36971"
[Log] [log] > – "[buffer-controller]:" – "Source audiovideo is updating: false, SWindow: 0, EWindow: Infinity" (hls.js, line 20008)
[Log] [log] > – "[buffer-controller]:" – "sb.buffered.length: 0, sourceBufferCount: 1" (hls.js, line 20013)
[Log] [log] > – "[buffer-controller]:" – "YYY: onSBUpdateEnd" (hls.js, line 19940)
[Log] [log] > – "[buffer-controller]:" – "RRR: BUFFER_APPENDED https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=489&_HLS_part=4, sn…" (hls.js, line 19402)
"RRR: BUFFER_APPENDED https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=489&_HLS_part=4, sn: 489"
[Warning] [warn] > – "[stream-controller]:" – "Media segment with muxed audiovideo where only video expected: https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/seg-0-489.llhls.cmfv" (hls.js, line 34170)
[Log] [log] > – "[buffer-controller]:" – "XXX: appendExecutor: buffer appending https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=489&_H…" (hls.js, line 19371)
"XXX: appendExecutor: buffer appending https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=489&_HLS_part=4, sn: 489, sz: 32853"
[Log] [log] > – "[buffer-controller]:" – "Source audiovideo is updating: false, SWindow: 0, EWindow: Infinity" (hls.js, line 20008)
[Log] [log] > – "[buffer-controller]:" – "sb.buffered.length: 0, sourceBufferCount: 1" (hls.js, line 20013)
[Log] [log] > – "[buffer-controller]:" – "YYY: onSBUpdateEnd" (hls.js, line 19940)
[Log] [log] > – "[buffer-controller]:" – "RRR: BUFFER_APPENDED https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=489&_HLS_part=4, sn…" (hls.js, line 19402)
"RRR: BUFFER_APPENDED https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=489&_HLS_part=4, sn: 489"
[Warning] [warn] > – "[stream-controller]:" – "Media segment with muxed audiovideo where only video expected: https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/seg-0-489.llhls.cmfv" (hls.js, line 34170)
[Log] [log] > – "[buffer-controller]:" – "XXX: appendExecutor: buffer appending https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=489&_H…" (hls.js, line 19371)
"XXX: appendExecutor: buffer appending https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=489&_HLS_part=4, sn: 489, sz: 30129"
[Log] [log] > – "[buffer-controller]:" – "Source audiovideo is updating: false, SWindow: 0, EWindow: Infinity" (hls.js, line 20008)
[Log] [log] > – "[buffer-controller]:" – "sb.buffered.length: 0, sourceBufferCount: 1" (hls.js, line 20013)
[Log] [log] > – "[buffer-controller]:" – "YYY: onSBUpdateEnd" (hls.js, line 19940)
[Log] [log] > – "[buffer-controller]:" (hls.js, line 19402)
"RRR: BUFFER_APPENDED https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=489&_HLS_part=4, sn: 489"
[Warning] [warn] > – "[stream-controller]:" – "Media segment with muxed audiovideo where only video expected: https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/seg-0-489.llhls.cmfv" (hls.js, line 34170)
[Log] [log] > – "[buffer-controller]:" – "XXX: appendExecutor: buffer appending https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=489&_H…" (hls.js, line 19371)
"XXX: appendExecutor: buffer appending https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=489&_HLS_part=4, sn: 489, sz: 30994"
[Log] [log] > – "[buffer-controller]:" – "Source audiovideo is updating: false, SWindow: 0, EWindow: Infinity" (hls.js, line 20008)
[Log] [log] > – "[buffer-controller]:" – "sb.buffered.length: 0, sourceBufferCount: 1" (hls.js, line 20013)
[Log] [log] > – "[buffer-controller]:" – "YYY: onSBUpdateEnd" (hls.js, line 19940)
[Log] [log] > – "[buffer-controller]:" – "RRR: BUFFER_APPENDED https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=489&_HLS_part=4, sn…" (hls.js, line 19402)
"RRR: BUFFER_APPENDED https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=489&_HLS_part=4, sn: 489"
[Warning] [warn] > – "[stream-controller]:" – "Media segment with muxed audiovideo where only video expected: https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/seg-0-489.llhls.cmfv" (hls.js, line 34170)
[Log] [log] > – "[buffer-controller]:" – "XXX: appendExecutor: buffer appending https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=489&_H…" (hls.js, line 19371)
"XXX: appendExecutor: buffer appending https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=489&_HLS_part=4, sn: 489, sz: 32768"
[Log] [log] > – "[buffer-controller]:" – "Source audiovideo is updating: false, SWindow: 0, EWindow: Infinity" (hls.js, line 20008)
[Log] [log] > – "[buffer-controller]:" – "sb.buffered.length: 0, sourceBufferCount: 1" (hls.js, line 20013)
[Log] [log] > – "[transmuxer.ts]: Flushed main sn: 489 part: 4 of level 0" (hls.js, line 16841)
[Log] [log] > – "[stream-controller]:" – "PARSING->PARSED" (hls.js, line 10616)
[Log] [log] > – "[stream-controller]:" – "Parsed main sn: 489 part: 4 of level 0 (part:[15.600-16.000]INDEPENDENT=NO)" (hls.js, line 10523)
[Log] [log] > – "[buffer-controller]:" – "YYY: onSBUpdateEnd" (hls.js, line 19940)
[Log] [log] > – "[buffer-controller]:" – "RRR: BUFFER_APPENDED https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=489&_HLS_part=4, sn…" (hls.js, line 19402)
"RRR: BUFFER_APPENDED https://v-shevchenko.erlyvideo.ru/rick-mbr-1/tracks-v1a1/index.ll.m3u8?multitrack=true&_HLS_msn=489&_HLS_part=4, sn: 489"
[Log] [log] > – "[stream-controller]:" – "Buffered main sn: 489 part: 4 of level 0 (part:[15.600-16.000]INDEPENDENT=NO > buffer:)" (hls.js, line 9585)
[Log] [log] > – "[stream-controller]:" – "PARSED->IDLE" (hls.js, line 10616)
[Log] [log] > – "[stream-controller]:" – "QQ1: targetBufferTime: 14.501999999999999, this.media.currentTime: 14.501999999999999, this.media.readyState: 1" (hls.js, line 33409)
[Log] [log] > – "[stream-controller]:" – "this.media.played.start: 4.102, this.media.played.end: 11.18880875" (hls.js, line 33413)

If the playlist is not aligned with playback after switching, then the stream controller cannot find anything to load that would fill the target buffer position.

What exactly aligned with playback mean? Does it mean that this.media.currentTime should point inside of playlist fragments range?

Regarding INDEPENDENT=YES on 5th part. Yes it contained keyframe. Now I have reduced segment duration to 2 seconds and now only part0 has keyframe.

Shaienn avatar Apr 10 '25 08:04 Shaienn

Are you testing in other browsers besides Safari? Playback of audio stops in Safari on auto switch (1) and ALL playback is halted on buffer flush with a manual switch (2 - reproduced by setting currentLevel). This appears to be a bug in Safari - please report the issue via Feedback Assistant. It may be relative to your content. A single HLS VOD playlist of MAP and media segments may be useful in isolating the issue.

I have tested on Chrome. There is no problem with audio. I will report it.

Shaienn avatar Apr 10 '25 09:04 Shaienn

What exactly aligned with playback mean? Does it mean that this.media.currentTime should point inside of playlist fragments range?

Exactly. When the stream was reset and the dates changed, that range moved.

I have tested on Chrome. There is no problem with audio. I will report it.

Got it. The date shifting I saw confused me. Then the only issues are related to Safari either dropping audio with smooth switch (setting load level or auto switch) or playback stopping (setting current level) and perhaps the appends no longer filling the buffer (may depend on version of Safari).

robwalch avatar Apr 10 '25 15:04 robwalch

There are Low-Latency HLS assets with h264 video and AAC audio that play without issue in Safari. Can you provide more information around how this content is encoded and packaged (especially with respect to any differences in audio configuration or timing between variants)?

robwalch avatar Apr 10 '25 15:04 robwalch

FFMpeg output:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'v3.mp4':
  Metadata:
    major_brand     : iso5
    minor_version   : 512
    compatible_brands: iso5iso6mp41
    creation_time   : 2025-04-11T08:33:55.000000Z
  Duration: 484544:35:06.29, start: 1744360505.466667, bitrate: N/A
  Stream #0:0[0x4](eng): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], 30 fps, 30 tbr, 90k tbn (default)
    Metadata:
      creation_time   : 2025-04-11T08:33:55.000000Z
      handler_name    : vide_handler
      vendor_id       : [0][0][0][0]
  Stream #0:1[0x1](eng): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp (default)
    Metadata:
      creation_time   : 2025-04-11T08:33:55.000000Z
      handler_name    : soun_handler
      vendor_id       : [0][0][0][0]

H264 Encoding

mp4ff-pslister -v -i v3.mp4
Video avc track ID=4
SPS 1 len 25B: 674d401fda01e0089f970110000003001000000303c0f1832a
{
  "Profile": 77,
  "ProfileCompatibility": 64,
  "Level": 31,
  "ParameterID": 0,
  "ChromaFormatIDC": 1,
  "SeparateColourPlaneFlag": false,
  "BitDepthLumaMinus8": 0,
  "BitDepthChromaMinus8": 0,
  "QPPrimeYZeroTransformBypassFlag": false,
  "SeqScalingMatrixPresentFlag": false,
  "SeqScalingLists": null,
  "Log2MaxFrameNumMinus4": 0,
  "PicOrderCntType": 2,
  "Log2MaxPicOrderCntLsbMinus4": 0,
  "DeltaPicOrderAlwaysZeroFlag": false,
  "OffsetForNonRefPic": 0,
  "OffsetForTopToBottomField": 0,
  "RefFramesInPicOrderCntCycle": null,
  "NumRefFrames": 1,
  "GapsInFrameNumValueAllowedFlag": false,
  "FrameMbsOnlyFlag": true,
  "MbAdaptiveFrameFieldFlag": false,
  "Direct8x8InferenceFlag": true,
  "FrameCroppingFlag": true,
  "FrameCropLeftOffset": 0,
  "FrameCropRightOffset": 0,
  "FrameCropTopOffset": 0,
  "FrameCropBottomOffset": 4,
  "Width": 1920,
  "Height": 1080,
  "NrBytesBeforeVUI": 10,
  "NrBytesRead": 25,
  "VUI": {
    "SampleAspectRatioWidth": 1,
    "SampleAspectRatioHeight": 1,
    "OverscanInfoPresentFlag": false,
    "OverscanAppropriateFlag": false,
    "VideoSignalTypePresentFlag": false,
    "VideoFormat": 0,
    "VideoFullRangeFlag": false,
    "ColourDescriptionFlag": false,
    "ColourPrimaries": 0,
    "TransferCharacteristics": 0,
    "MatrixCoefficients": 0,
    "ChromaLocInfoPresentFlag": false,
    "ChromaSampleLocTypeTopField": 0,
    "ChromaSampleLocTypeBottomField": 0,
    "TimingInfoPresentFlag": true,
    "NumUnitsInTick": 1,
    "TimeScale": 60,
    "FixedFrameRateFlag": false,
    "NalHrdParametersPresentFlag": false,
    "NalHrdParameters": null,
    "VclHrdParametersPresentFlag": false,
    "VclHrdParameters": null,
    "LowDelayHrdFlag": false,
    "PicStructPresentFlag": false,
    "BitstreamRestrictionFlag": true,
    "MotionVectorsOverPicBoundariesFlag": true,
    "MaxBytesPerPicDenom": 0,
    "MaxBitsPerMbDenom": 0,
    "Log2MaxMvLengthHorizontal": 11,
    "Log2MaxMvLengthVertical": 11,
    "MaxNumReorderFrames": 0,
    "MaxDecFrameBuffering": 1
  }
}
PPS 1 len 4B: 68ef3c80
{
  "PicParameterSetID": 0,
  "SeqParameterSetID": 0,
  "EntropyCodingModeFlag": true,
  "BottomFieldPicOrderInFramePresentFlag": false,
  "NumSliceGroupsMinus1": 0,
  "SliceGroupMapType": 0,
  "RunLengthMinus1": null,
  "TopLeft": null,
  "BottomRight": null,
  "SliceGroupChangeDirectionFlag": false,
  "SliceGroupChangeRateMinus1": 0,
  "PicSizeInMapUnitsMinus1": 0,
  "SliceGroupID": null,
  "NumRefIdxI0DefaultActiveMinus1": 0,
  "NumRefIdxI1DefaultActiveMinus1": 0,
  "WeightedPredFlag": true,
  "WeightedBipredIDC": 0,
  "PicInitQpMinus26": 0,
  "PicInitQsMinus26": 0,
  "ChromaQpIndexOffset": 0,
  "DeblockingFilterControlPresentFlag": true,
  "ConstrainedIntraPredFlag": false,
  "RedundantPicCntPresentFlag": false,
  "Transform8x8ModeFlag": false,
  "PicScalingMatrixPresentFlag": false,
  "PicScalingLists": null,
  "SecondChromaQpIndexOffset": 0
}
Codecs parameter (assuming avc1) from SPS id 0: avc1.4D401F

Shaienn avatar Apr 11 '25 09:04 Shaienn

Here the same numbered segments from different levels. There are init fragment and two fragment parts (moof) for each level. As you see, timings and sequences are aligned. Regarding audio. Transcoder just puts the same audio chunks into each level fragments without changes or time shifting.

V2

mp4ff-info -l all:4 v2.mp4
[ftyp] size=28
 - majorBrand: iso5
 - minorVersion: 512
 - compatibleBrand: iso5
 - compatibleBrand: iso6
 - compatibleBrand: mp41
[moov] size=1092
  [mvhd] size=108 version=0 flags=000000
   - timeScale: 1000
   - duration: 0
   - creation time: 2025-04-12T08:33:55Z
   - modification time: 2025-04-12T08:33:55Z
  [trak] size=489
    [tkhd] size=92 version=0 flags=000007
     - trackID: 3
     - duration: 0
     - creation time: 2025-04-12T08:33:55Z
     - modification time: 2025-04-12T08:33:55Z
     - Width: 1280.0, Height: 720.0
    [mdia] size=389
      [mdhd] size=32 version=0 flags=000000
       - timeScale: 90000
       - creation time: 2025-04-12T08:33:55Z
       - modification time: 2025-04-12T08:33:55Z
       - language: ```
      [hdlr] size=45 version=0 flags=000000
       - handlerType: vide
       - handlerName: "vide_handler"
      [minf] size=304
        [vmhd] size=20 version=0 flags=000000
        [dinf] size=36
          [dref] size=28 version=0 flags=000000
            [url ] size=12
             - location: ""
        [stbl] size=240
          [stsd] size=148 version=0 flags=000000
            [avc1] size=132
             - width: 1280
             - height: 720
             - compressorName: ""
              [avcC] size=46
               - AVCProfileIndication: 77
               - profileCompatibility: 40
               - AVCLevelIndication: 22
               - SPS: 674d4016da014016ec0440000003004000000f03c58ba8
               - PPS: 68ef3c80
          [stts] size=16 version=0 flags=000000
          [stsc] size=16 version=0 flags=000000
          [stsz] size=20 version=0 flags=000000
          [stco] size=16 version=0 flags=000000
          [stss] size=16 version=0 flags=000000
  [trak] size=415
    [tkhd] size=92 version=0 flags=000007
     - trackID: 1
     - duration: 0
     - creation time: 2025-04-12T08:33:55Z
     - modification time: 2025-04-12T08:33:55Z
    [mdia] size=315
      [mdhd] size=32 version=0 flags=000000
       - timeScale: 44100
       - creation time: 2025-04-12T08:33:55Z
       - modification time: 2025-04-12T08:33:55Z
       - language: ```
      [hdlr] size=45 version=0 flags=000000
       - handlerType: soun
       - handlerName: "soun_handler"
      [minf] size=230
        [smhd] size=16 version=0 flags=000000
        [dinf] size=36
          [dref] size=28 version=0 flags=000000
            [url ] size=12
             - location: ""
        [stbl] size=170
          [stsd] size=94 version=0 flags=000000
            [mp4a] size=78
              [esds] size=42 version=0 flags=000000
               - maxBitrate: 126035
               - avgBitrate: 0
               - decConfig: 121056e500
          [stts] size=16 version=0 flags=000000
          [stsc] size=16 version=0 flags=000000
          [stsz] size=20 version=0 flags=000000
          [stco] size=16 version=0 flags=000000
  [mvex] size=72
    [trex] size=32 version=0 flags=000000
     - trackID: 3
     - defaultSampleDescriptionIndex: 1
     - defaultSampleDuration: 0
     - defaultSampleSize: 0
     - defaultSampleFlags: 00000000 (isLeading=0 dependsOn=0 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=false degradationPriority=0)
    [trex] size=32 version=0 flags=000000
     - trackID: 1
     - defaultSampleDescriptionIndex: 1
     - defaultSampleDuration: 0
     - defaultSampleSize: 0
     - defaultSampleFlags: 00000000 (isLeading=0 dependsOn=0 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=false degradationPriority=0)
[moof] size=480
  [mfhd] size=16 version=0 flags=000000
   - sequenceNumber: 201
  [traf] size=256
    [tfhd] size=16 version=0 flags=020000
     - trackID: 3
     - defaultBaseIsMoof: true
    [tfdt] size=20 version=1 flags=000000
     - baseMediaDecodeTime: 156992445492000
    [trun] size=212 version=1 flags=000f01
     - sampleCount: 12
     - DataOffset: 488
     - sample[1]: dur=3000 size=13597 flags=02000000 (isLeading=0 dependsOn=2 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=false degradationPriority=0) compositionTimeOffset=0
     - sample[2]: dur=3000 size=5932 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[3]: dur=3000 size=8195 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[4]: dur=3000 size=88 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[5]: dur=3000 size=6059 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[6]: dur=3000 size=6229 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[7]: dur=3000 size=6889 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[8]: dur=3000 size=4897 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[9]: dur=3000 size=5953 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[10]: dur=3000 size=70 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[11]: dur=3000 size=5162 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[12]: dur=3000 size=5681 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
  [traf] size=200
    [tfhd] size=16 version=0 flags=020000
     - trackID: 1
     - defaultBaseIsMoof: true
    [tfdt] size=20 version=1 flags=000000
     - baseMediaDecodeTime: 76926298291367
    [trun] size=156 version=1 flags=000301
     - sampleCount: 17
     - DataOffset: 69240
     - sample[1]: dur=1024 size=330
     - sample[2]: dur=1023 size=358
     - sample[3]: dur=1024 size=336
     - sample[4]: dur=1025 size=360
     - sample[5]: dur=1024 size=438
     - sample[6]: dur=1023 size=366
     - sample[7]: dur=1024 size=370
     - sample[8]: dur=1024 size=416
     - sample[9]: dur=1025 size=386
     - sample[10]: dur=1024 size=344
     - sample[11]: dur=1023 size=373
     - sample[12]: dur=1024 size=359
     - sample[13]: dur=1024 size=349
     - sample[14]: dur=1025 size=429
     - sample[15]: dur=1024 size=540
     - sample[16]: dur=1023 size=407
     - sample[17]: dur=1024 size=327
[mdat] size=75248
[moof] size=488
  [mfhd] size=16 version=0 flags=000000
   - sequenceNumber: 202
  [traf] size=256
    [tfhd] size=16 version=0 flags=020000
     - trackID: 3
     - defaultBaseIsMoof: true
    [tfdt] size=20 version=1 flags=000000
     - baseMediaDecodeTime: 156992445528000
    [trun] size=212 version=1 flags=000f01
     - sampleCount: 12
     - DataOffset: 496
     - sample[1]: dur=3000 size=6198 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[2]: dur=3000 size=7101 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[3]: dur=3000 size=6618 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[4]: dur=3000 size=104 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[5]: dur=3000 size=4739 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[6]: dur=3000 size=7054 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[7]: dur=3000 size=6265 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[8]: dur=3000 size=6118 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[9]: dur=3000 size=7317 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[10]: dur=3000 size=108 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[11]: dur=3000 size=4128 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[12]: dur=3000 size=4483 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
  [traf] size=208
    [tfhd] size=16 version=0 flags=020000
     - trackID: 1
     - defaultBaseIsMoof: true
    [tfdt] size=20 version=1 flags=000000
     - baseMediaDecodeTime: 76926298308774
    [trun] size=164 version=1 flags=000301
     - sampleCount: 18
     - DataOffset: 60729
     - sample[1]: dur=1024 size=351
     - sample[2]: dur=1025 size=361
     - sample[3]: dur=1024 size=367
     - sample[4]: dur=1023 size=402
     - sample[5]: dur=1024 size=373
     - sample[6]: dur=1025 size=372
     - sample[7]: dur=1024 size=353
     - sample[8]: dur=1024 size=374
     - sample[9]: dur=1023 size=295
     - sample[10]: dur=1024 size=300
     - sample[11]: dur=1025 size=381
     - sample[12]: dur=1024 size=394
     - sample[13]: dur=1024 size=401
     - sample[14]: dur=1023 size=386
     - sample[15]: dur=1024 size=335
     - sample[16]: dur=1025 size=425
     - sample[17]: dur=1024 size=383
     - sample[18]: dur=1024 size=354
[mdat] size=66848
mp4ff-info -l all:4 ~/proj/flussonic/flu_v2-3.mp4
[ftyp] size=28
 - majorBrand: iso5
 - minorVersion: 512
 - compatibleBrand: iso5
 - compatibleBrand: iso6
 - compatibleBrand: mp41
[moov] size=1092
  [mvhd] size=108 version=0 flags=000000
   - timeScale: 1000
   - duration: 0
   - creation time: 2025-04-12T08:33:55Z
   - modification time: 2025-04-12T08:33:55Z
  [trak] size=489
    [tkhd] size=92 version=0 flags=000007
     - trackID: 3
     - duration: 0
     - creation time: 2025-04-12T08:33:55Z
     - modification time: 2025-04-12T08:33:55Z
     - Width: 1280.0, Height: 720.0
    [mdia] size=389
      [mdhd] size=32 version=0 flags=000000
       - timeScale: 90000
       - creation time: 2025-04-12T08:33:55Z
       - modification time: 2025-04-12T08:33:55Z
       - language: ```
      [hdlr] size=45 version=0 flags=000000
       - handlerType: vide
       - handlerName: "vide_handler"
      [minf] size=304
        [vmhd] size=20 version=0 flags=000000
        [dinf] size=36
          [dref] size=28 version=0 flags=000000
            [url ] size=12
             - location: ""
        [stbl] size=240
          [stsd] size=148 version=0 flags=000000
            [avc1] size=132
             - width: 1280
             - height: 720
             - compressorName: ""
              [avcC] size=46
               - AVCProfileIndication: 77
               - profileCompatibility: 40
               - AVCLevelIndication: 22
               - SPS: 674d4016da014016ec0440000003004000000f03c58ba8
               - PPS: 68ef3c80
          [stts] size=16 version=0 flags=000000
          [stsc] size=16 version=0 flags=000000
          [stsz] size=20 version=0 flags=000000
          [stco] size=16 version=0 flags=000000
          [stss] size=16 version=0 flags=000000
  [trak] size=415
    [tkhd] size=92 version=0 flags=000007
     - trackID: 1
     - duration: 0
     - creation time: 2025-04-12T08:33:55Z
     - modification time: 2025-04-12T08:33:55Z
    [mdia] size=315
      [mdhd] size=32 version=0 flags=000000
       - timeScale: 44100
       - creation time: 2025-04-12T08:33:55Z
       - modification time: 2025-04-12T08:33:55Z
       - language: ```
      [hdlr] size=45 version=0 flags=000000
       - handlerType: soun
       - handlerName: "soun_handler"
      [minf] size=230
        [smhd] size=16 version=0 flags=000000
        [dinf] size=36
          [dref] size=28 version=0 flags=000000
            [url ] size=12
             - location: ""
        [stbl] size=170
          [stsd] size=94 version=0 flags=000000
            [mp4a] size=78
              [esds] size=42 version=0 flags=000000
               - maxBitrate: 126035
               - avgBitrate: 0
               - decConfig: 121056e500
          [stts] size=16 version=0 flags=000000
          [stsc] size=16 version=0 flags=000000
          [stsz] size=20 version=0 flags=000000
          [stco] size=16 version=0 flags=000000
  [mvex] size=72
    [trex] size=32 version=0 flags=000000
     - trackID: 3
     - defaultSampleDescriptionIndex: 1
     - defaultSampleDuration: 0
     - defaultSampleSize: 0
     - defaultSampleFlags: 00000000 (isLeading=0 dependsOn=0 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=false degradationPriority=0)
    [trex] size=32 version=0 flags=000000
     - trackID: 1
     - defaultSampleDescriptionIndex: 1
     - defaultSampleDuration: 0
     - defaultSampleSize: 0
     - defaultSampleFlags: 00000000 (isLeading=0 dependsOn=0 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=false degradationPriority=0)
[moof] size=480
  [mfhd] size=16 version=0 flags=000000
   - sequenceNumber: 201
  [traf] size=256
    [tfhd] size=16 version=0 flags=020000
     - trackID: 3
     - defaultBaseIsMoof: true
    [tfdt] size=20 version=1 flags=000000
     - baseMediaDecodeTime: 156992445492000
    [trun] size=212 version=1 flags=000f01
     - sampleCount: 12
     - DataOffset: 488
     - sample[1]: dur=3000 size=13597 flags=02000000 (isLeading=0 dependsOn=2 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=false degradationPriority=0) compositionTimeOffset=0
     - sample[2]: dur=3000 size=5932 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[3]: dur=3000 size=8195 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[4]: dur=3000 size=88 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[5]: dur=3000 size=6059 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[6]: dur=3000 size=6229 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[7]: dur=3000 size=6889 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[8]: dur=3000 size=4897 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[9]: dur=3000 size=5953 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[10]: dur=3000 size=70 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[11]: dur=3000 size=5162 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[12]: dur=3000 size=5681 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
  [traf] size=200
    [tfhd] size=16 version=0 flags=020000
     - trackID: 1
     - defaultBaseIsMoof: true
    [tfdt] size=20 version=1 flags=000000
     - baseMediaDecodeTime: 76926298291367
    [trun] size=156 version=1 flags=000301
     - sampleCount: 17
     - DataOffset: 69240
     - sample[1]: dur=1024 size=330
     - sample[2]: dur=1023 size=358
     - sample[3]: dur=1024 size=336
     - sample[4]: dur=1025 size=360
     - sample[5]: dur=1024 size=438
     - sample[6]: dur=1023 size=366
     - sample[7]: dur=1024 size=370
     - sample[8]: dur=1024 size=416
     - sample[9]: dur=1025 size=386
     - sample[10]: dur=1024 size=344
     - sample[11]: dur=1023 size=373
     - sample[12]: dur=1024 size=359
     - sample[13]: dur=1024 size=349
     - sample[14]: dur=1025 size=429
     - sample[15]: dur=1024 size=540
     - sample[16]: dur=1023 size=407
     - sample[17]: dur=1024 size=327
[mdat] size=75248
[moof] size=488
  [mfhd] size=16 version=0 flags=000000
   - sequenceNumber: 202
  [traf] size=256
    [tfhd] size=16 version=0 flags=020000
     - trackID: 3
     - defaultBaseIsMoof: true
    [tfdt] size=20 version=1 flags=000000
     - baseMediaDecodeTime: 156992445528000
    [trun] size=212 version=1 flags=000f01
     - sampleCount: 12
     - DataOffset: 496
     - sample[1]: dur=3000 size=6198 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[2]: dur=3000 size=7101 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[3]: dur=3000 size=6618 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[4]: dur=3000 size=104 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[5]: dur=3000 size=4739 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[6]: dur=3000 size=7054 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[7]: dur=3000 size=6265 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[8]: dur=3000 size=6118 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[9]: dur=3000 size=7317 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[10]: dur=3000 size=108 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[11]: dur=3000 size=4128 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[12]: dur=3000 size=4483 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
  [traf] size=208
    [tfhd] size=16 version=0 flags=020000
     - trackID: 1
     - defaultBaseIsMoof: true
    [tfdt] size=20 version=1 flags=000000
     - baseMediaDecodeTime: 76926298308774
    [trun] size=164 version=1 flags=000301
     - sampleCount: 18
     - DataOffset: 60729
     - sample[1]: dur=1024 size=351
     - sample[2]: dur=1025 size=361
     - sample[3]: dur=1024 size=367
     - sample[4]: dur=1023 size=402
     - sample[5]: dur=1024 size=373
     - sample[6]: dur=1025 size=372
     - sample[7]: dur=1024 size=353
     - sample[8]: dur=1024 size=374
     - sample[9]: dur=1023 size=295
     - sample[10]: dur=1024 size=300
     - sample[11]: dur=1025 size=381
     - sample[12]: dur=1024 size=394
     - sample[13]: dur=1024 size=401
     - sample[14]: dur=1023 size=386
     - sample[15]: dur=1024 size=335
     - sample[16]: dur=1025 size=425
     - sample[17]: dur=1024 size=383
     - sample[18]: dur=1024 size=354
[mdat] size=66848

V3

mp4ff-info -l all:4 v3.mp4
[ftyp] size=28
 - majorBrand: iso5
 - minorVersion: 512
 - compatibleBrand: iso5
 - compatibleBrand: iso6
 - compatibleBrand: mp41
[moov] size=1094
  [mvhd] size=108 version=0 flags=000000
   - timeScale: 1000
   - duration: 0
   - creation time: 2025-04-12T08:33:55Z
   - modification time: 2025-04-12T08:33:55Z
  [trak] size=491
    [tkhd] size=92 version=0 flags=000007
     - trackID: 4
     - duration: 0
     - creation time: 2025-04-12T08:33:55Z
     - modification time: 2025-04-12T08:33:55Z
     - Width: 1920.0, Height: 1080.0
    [mdia] size=391
      [mdhd] size=32 version=0 flags=000000
       - timeScale: 90000
       - creation time: 2025-04-12T08:33:55Z
       - modification time: 2025-04-12T08:33:55Z
       - language: ```
      [hdlr] size=45 version=0 flags=000000
       - handlerType: vide
       - handlerName: "vide_handler"
      [minf] size=306
        [vmhd] size=20 version=0 flags=000000
        [dinf] size=36
          [dref] size=28 version=0 flags=000000
            [url ] size=12
             - location: ""
        [stbl] size=242
          [stsd] size=150 version=0 flags=000000
            [avc1] size=134
             - width: 1920
             - height: 1080
             - compressorName: ""
              [avcC] size=48
               - AVCProfileIndication: 77
               - profileCompatibility: 40
               - AVCLevelIndication: 31
               - SPS: 674d401fda01e0089f970110000003001000000303c0f1832a
               - PPS: 68ef3c80
          [stts] size=16 version=0 flags=000000
          [stsc] size=16 version=0 flags=000000
          [stsz] size=20 version=0 flags=000000
          [stco] size=16 version=0 flags=000000
          [stss] size=16 version=0 flags=000000
  [trak] size=415
    [tkhd] size=92 version=0 flags=000007
     - trackID: 1
     - duration: 0
     - creation time: 2025-04-12T08:33:55Z
     - modification time: 2025-04-12T08:33:55Z
    [mdia] size=315
      [mdhd] size=32 version=0 flags=000000
       - timeScale: 44100
       - creation time: 2025-04-12T08:33:55Z
       - modification time: 2025-04-12T08:33:55Z
       - language: ```
      [hdlr] size=45 version=0 flags=000000
       - handlerType: soun
       - handlerName: "soun_handler"
      [minf] size=230
        [smhd] size=16 version=0 flags=000000
        [dinf] size=36
          [dref] size=28 version=0 flags=000000
            [url ] size=12
             - location: ""
        [stbl] size=170
          [stsd] size=94 version=0 flags=000000
            [mp4a] size=78
              [esds] size=42 version=0 flags=000000
               - maxBitrate: 126035
               - avgBitrate: 0
               - decConfig: 121056e500
          [stts] size=16 version=0 flags=000000
          [stsc] size=16 version=0 flags=000000
          [stsz] size=20 version=0 flags=000000
          [stco] size=16 version=0 flags=000000
  [mvex] size=72
    [trex] size=32 version=0 flags=000000
     - trackID: 4
     - defaultSampleDescriptionIndex: 1
     - defaultSampleDuration: 0
     - defaultSampleSize: 0
     - defaultSampleFlags: 00000000 (isLeading=0 dependsOn=0 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=false degradationPriority=0)
    [trex] size=32 version=0 flags=000000
     - trackID: 1
     - defaultSampleDescriptionIndex: 1
     - defaultSampleDuration: 0
     - defaultSampleSize: 0
     - defaultSampleFlags: 00000000 (isLeading=0 dependsOn=0 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=false degradationPriority=0)
[moof] size=480
  [mfhd] size=16 version=0 flags=000000
   - sequenceNumber: 201
  [traf] size=256
    [tfhd] size=16 version=0 flags=020000
     - trackID: 4
     - defaultBaseIsMoof: true
    [tfdt] size=20 version=1 flags=000000
     - baseMediaDecodeTime: 156992445492000
    [trun] size=212 version=1 flags=000f01
     - sampleCount: 12
     - DataOffset: 488
     - sample[1]: dur=3000 size=24101 flags=02000000 (isLeading=0 dependsOn=2 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=false degradationPriority=0) compositionTimeOffset=0
     - sample[2]: dur=3000 size=13337 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[3]: dur=3000 size=17734 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[4]: dur=3000 size=203 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[5]: dur=3000 size=13128 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[6]: dur=3000 size=12326 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[7]: dur=3000 size=14666 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[8]: dur=3000 size=11762 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[9]: dur=3000 size=12636 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[10]: dur=3000 size=121 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[11]: dur=3000 size=11285 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[12]: dur=3000 size=12777 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
  [traf] size=200
    [tfhd] size=16 version=0 flags=020000
     - trackID: 1
     - defaultBaseIsMoof: true
    [tfdt] size=20 version=1 flags=000000
     - baseMediaDecodeTime: 76926298291367
    [trun] size=156 version=1 flags=000301
     - sampleCount: 17
     - DataOffset: 144564
     - sample[1]: dur=1024 size=330
     - sample[2]: dur=1023 size=358
     - sample[3]: dur=1024 size=336
     - sample[4]: dur=1025 size=360
     - sample[5]: dur=1024 size=438
     - sample[6]: dur=1023 size=366
     - sample[7]: dur=1024 size=370
     - sample[8]: dur=1024 size=416
     - sample[9]: dur=1025 size=386
     - sample[10]: dur=1024 size=344
     - sample[11]: dur=1023 size=373
     - sample[12]: dur=1024 size=359
     - sample[13]: dur=1024 size=349
     - sample[14]: dur=1025 size=429
     - sample[15]: dur=1024 size=540
     - sample[16]: dur=1023 size=407
     - sample[17]: dur=1024 size=327
[mdat] size=150572
[moof] size=488
  [mfhd] size=16 version=0 flags=000000
   - sequenceNumber: 202
  [traf] size=256
    [tfhd] size=16 version=0 flags=020000
     - trackID: 4
     - defaultBaseIsMoof: true
    [tfdt] size=20 version=1 flags=000000
     - baseMediaDecodeTime: 156992445528000
    [trun] size=212 version=1 flags=000f01
     - sampleCount: 12
     - DataOffset: 496
     - sample[1]: dur=3000 size=12899 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[2]: dur=3000 size=15003 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[3]: dur=3000 size=14846 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[4]: dur=3000 size=202 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[5]: dur=3000 size=10510 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[6]: dur=3000 size=13572 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[7]: dur=3000 size=12597 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[8]: dur=3000 size=12892 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[9]: dur=3000 size=15190 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[10]: dur=3000 size=204 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[11]: dur=3000 size=9045 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
     - sample[12]: dur=3000 size=9781 flags=01010000 (isLeading=0 dependsOn=1 isDependedOn=0 hasRedundancy=0 padding=0 isNonSync=true degradationPriority=0) compositionTimeOffset=0
  [traf] size=208
    [tfhd] size=16 version=0 flags=020000
     - trackID: 1
     - defaultBaseIsMoof: true
    [tfdt] size=20 version=1 flags=000000
     - baseMediaDecodeTime: 76926298308774
    [trun] size=164 version=1 flags=000301
     - sampleCount: 18
     - DataOffset: 127237
     - sample[1]: dur=1024 size=351
     - sample[2]: dur=1025 size=361
     - sample[3]: dur=1024 size=367
     - sample[4]: dur=1023 size=402
     - sample[5]: dur=1024 size=373
     - sample[6]: dur=1025 size=372
     - sample[7]: dur=1024 size=353
     - sample[8]: dur=1024 size=374
     - sample[9]: dur=1023 size=295
     - sample[10]: dur=1024 size=300
     - sample[11]: dur=1025 size=381
     - sample[12]: dur=1024 size=394
     - sample[13]: dur=1024 size=401
     - sample[14]: dur=1023 size=386
     - sample[15]: dur=1024 size=335
     - sample[16]: dur=1025 size=425
     - sample[17]: dur=1024 size=383
     - sample[18]: dur=1024 size=354
[mdat] size=133356

Shaienn avatar Apr 11 '25 10:04 Shaienn

There are Low-Latency HLS assets with h264 video and AAC audio that play without issue in Safari.

Could you please share this stream? I will check how is it constructed.

Shaienn avatar Apr 11 '25 11:04 Shaienn

Not a Contribution

Could you please share this stream? I will check how is it constructed.

MUX's example: https://hlsjs.video-dev.org/demo/?src=https%3A%2F%2Fstream.mux.com%2Fv69RSHhFelSm4701snP22dYz2jICy4E4FUyk02rW4gxRM.m3u8&demoConfig=eyJlbmFibGVTdHJlYW1pbmciOnRydWUsImF1dG9SZWNvdmVyRXJyb3IiOmZhbHNlLCJzdG9wT25TdGFsbCI6ZmFsc2UsImR1bXBmTVA0IjpmYWxzZSwibGV2ZWxDYXBwaW5nIjotMSwibGltaXRNZXRyaWNzIjotMX0=

There are great examples at: https://www.theoplayer.com/test-your-stream-hls-dash-hesp

Example scripts in Apple HLS Tools: https://developer.apple.com/documentation/http-live-streaming/using-apple-s-http-live-streaming-hls-tools

robwalch avatar Apr 11 '25 16:04 robwalch

I need multivariant stream using fragmented mp4 with interleaved video and audio frames in same fragments.

Shaienn avatar Apr 11 '25 16:04 Shaienn

I need multivariant stream using fragmented mp4 with interleaved video and audio frames in same fragments.

And that may be the source of the issue. It seems that the init segments force a reset in the audio pipeline.

Please share the Feedback Assistant ID of the issue filed so that I can link it to my report and reproduction steps.

While the issue does not come up in Safari HLS playback with the multivariant playlist, if we make a playlist that matches the appends that an MSE player must make (init segments between each switch) then you will hear audio drop temporarily between each media segment. Ideally, audio would not drop at all. The issues we've found here are even more severe, with audio dropping permanently and after seek playback not advancing for the lifecycle of the opened MediaSource,

#EXTM3U
#EXT-X-TARGETDURATION:2
#EXT-X-VERSION:6
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-DISCONTINUITY-SEQUENCE:1
#EXT-X-MAP:URI="480p-init.cmfv"
#EXTINF:2.0,
480p-segment-0.cmfv
#EXT-X-MAP:URI="720p-init.cmfv"
#EXTINF:2.0,
720p-segment-1.cmfv
#EXT-X-MAP:URI="1080p-init.cmfv"
#EXTINF:2.0,
1080p-segment-2.cmfv
#EXT-X-ENDLIST

robwalch avatar Apr 11 '25 18:04 robwalch

I am trying to make isolate reproduction with safari's htmlmediaelement. Will keep you informed on the details.

Shaienn avatar Apr 17 '25 07:04 Shaienn

Closing with "cannot reproduce" / "Stream issue". If you are able to isolate reproduction steps using hls.js v1.6.9 or higher, please leave a comment.

robwalch avatar Aug 11 '25 22:08 robwalch