Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

“Frag Loop Loading Error” since HLS.js v0.7.9 and newer. 100% reproducible. #1440

Closed
1 task done
itecx opened this issue Nov 22, 2017 · 3 comments · Fixed by #1466
Closed
1 task done

“Frag Loop Loading Error” since HLS.js v0.7.9 and newer. 100% reproducible. #1440

itecx opened this issue Nov 22, 2017 · 3 comments · Fixed by #1466

Comments

@itecx
Copy link

itecx commented Nov 22, 2017

“Frag Loop Loading Error” since HLS.js v0.7.9 and newer. 100% reproducible on all our HLS Live & DVR streams

Environment
  • [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
  • [x ] The issue observed is not already reported by searching on Github under https://github.com/video-dev/hls.js/issues
  • The issue occurs in the latest reference client on http://video-dev.github.io/hls.js/demo and not just on my page

All my tests were run on Windows 10 v1709 and with the browser versions below:
• Chrome 62.0.3202.89 (Windows 10 v1709)
• Microsoft Edge 41.16299.15.0 (Windows 10 v1709)
• Internet Explorer 11.15.16299.0 (Windows 10 v1709)

Live Encoder:
• Elemental Live Encoder (Version 2.10.3.300262)
• Output: RTMP Multi-Bitrate
• H264, 30fps, GOP 90 frames

Stream Type / CDN services used:
• HLS LIVE with DVR window of 180 minutes
• HLS segment duration: 10 seconds
• Akamai Media Services Live (Stream Packaging)
• RTMP ingest repackaged by Akamai to HLS output

Master.m3u8 URL query string parameters explanation
• Bitrate Filtering: ?b=650-3200 (allows to remove certain bitrates from the multi-bitrate HLS stream)
• Playback Start Time: &start=1509912001 (EPOCH time in seconds)

Steps to reproduce

How to reproduce the Error in HLS.js:

  1. HLS.js LATEST v0.8.7 => BAD downloads fragments like crazy (Frag Loop Loading Error) but never starts playing!
    • Test M3U8 URL: //s2ra-lh.akamaihd.net/i/s2e20171105_1@114364/master.m3u8?b=650-3200&start=1509912001
    • Test PLAYER URL: http://streambox.fr/mse/hls.js-0.8.7/demo/?src=%2F%2Fs2ra-lh.akamaihd.net%2Fi%2Fs2e20171105_1%40114364%2Fmaster.m3u8%3Fb%3D650-3200%26start%3D1509912001&enableStreaming=true&autoRecoverError=true&enableWorker=true&dumpfMP4=false&levelCapping=-1&defaultAudioCodec=undefined

  2. HLS.js LATEST v0.8.7 => OK exact same stream as 1) above, but the start time is advanced by 1 second. The stream starts on a different segment and works in all HLS.js versions!
    • Test M3U8 URL: //s2ra-lh.akamaihd.net/i/s2e20171105_1@114364/master.m3u8?b=650-3200&start=1509912002
    • Test PLAYER URL: http://streambox.fr/mse/hls.js-0.8.7/demo/?src=%2F%2Fs2ra-lh.akamaihd.net%2Fi%2Fs2e20171105_1%40114364%2Fmaster.m3u8%3Fb%3D650-3200%26start%3D1509912002&enableStreaming=true&autoRecoverError=true&enableWorker=true&dumpfMP4=false&levelCapping=-1&defaultAudioCodec=undefined

  3. HLS.js OLD v0.7.8 => OK exact same stream as 1) above, starting on same start time as A few fixes in linting configuration #1, works in HLS.js v0.7.8 and OLDER! Only HLS.js v0.7.9 AND NEWER have this problem!
    • Test M3U8 URL: //s2ra-lh.akamaihd.net/i/s2e20171105_1@114364/master.m3u8?b=650-3200&start=1509912001
    • Test PLAYER URL: http://streambox.fr/mse/hls.js-0.7.8/demo/?src=%2F%2Fs2ra-lh.akamaihd.net%2Fi%2Fs2e20171105_1%40114364%2Fmaster.m3u8%3Fb%3D650-3200%26start%3D1509912001&enableStreaming=true&autoRecoverError=true&enableWorker=true&dumpfMP4=false&levelCapping=-1&defaultAudioCodec=undefined

Expected behavior

The HLS stream should start playing without “Frag Loop Loading Error” independent of what the first segment is that gets loaded. I noticed this problem in JW Player 8 which is using HLS.js v0.8.4. JW Player 7 is working and must be using a HLS.js version v0.7.8 or older.

Actual behavior

Problem Description:

  1. The video player goes into an endless buffering loop “Frag Loop Loading Error” and downloads video segments like crazy in the background, but never starts playing (toggle Metrics Display to watch)! This only happens when the HLS stream DVR start time parameter falls on a specific segment. These bad start time segments repeat in 3 second intervals. In different streams the bad segment start times are different but they all have the same 3 second interval (see list of test streams at the end of this email).
  2. When the start time parameter is advanced by 1 or 2 seconds any version of the HLS.js Player works fine.
  3. But every 3rd second the start time will land on a segment that causes this “Frag Loop Loading Error” with endless buffering.
  4. The error only happens with HLS.js version 0.7.9 and NEWER.
  5. HLS.js version 0.7.8 and OLDER versions do not have this problem.
  6. I found this error after upgrading from JW Player 7 to version JW Player 8 (JW Enterprise version).
  7. JW Player 8 is using HLS.js v0.8.4 and therefore has the same error.
  8. JW Player 7 must be using a HLS.js v0.7.8 or OLDER because it works fine.

Further test URL's:
I have tried every HLS.js version from http://streambox.fr/mse/hls.js-0.7.0/demo/ all the way up to http://streambox.fr/mse/hls.js-0.8.7/demo/.

All of the issues can also be reproduced with the JW Player Stream Tester here: https://developer.jwplayer.com/tools/stream-tester/

Use the m3u8 URL’s below and change the start time parameter by 1 second increments and see what happens. Have done this for every HLS.js versions to confirm my results. Have also tried on multiple computers with the same results.

Legend:
• BAD ENDLESS BUFFERING starting with HLS.JS v0.7.9 up to v0.8.7! But it WORKS FINE with HLS.JS v0.7.8 and older!
• OK WORKS FINE with all versions of HLS.JS.

M3U8 Test Stream #1 (HTTP or HTTPS):
• OK: //s2ra-lh.akamaihd.net/i/s2e20171105_1@114364/master.m3u8?b=650-3200&start=1509912000
• BAD: //s2ra-lh.akamaihd.net/i/s2e20171105_1@114364/master.m3u8?b=650-3200&start=1509912001 (used in examples above)
• OK: //s2ra-lh.akamaihd.net/i/s2e20171105_1@114364/master.m3u8?b=650-3200&start=1509912002 (used in examples above)
• OK: //s2ra-lh.akamaihd.net/i/s2e20171105_1@114364/master.m3u8?b=650-3200&start=1509912003
• BAD: //s2ra-lh.akamaihd.net/i/s2e20171105_1@114364/master.m3u8?b=650-3200&start=1509912004
• OK: //s2ra-lh.akamaihd.net/i/s2e20171105_1@114364/master.m3u8?b=650-3200&start=1509912005
• OK: //s2ra-lh.akamaihd.net/i/s2e20171105_1@114364/master.m3u8?b=650-3200&start=1509912006
• BAD: //s2ra-lh.akamaihd.net/i/s2e20171105_1@114364/master.m3u8?b=650-3200&start=1509912007
• OK: //s2ra-lh.akamaihd.net/i/s2e20171105_1@114364/master.m3u8?b=650-3200&start=1509912008
• OK: //s2ra-lh.akamaihd.net/i/s2e20171105_1@114364/master.m3u8?b=650-3200&start=1509912009
• BAD: //s2ra-lh.akamaihd.net/i/s2e20171105_1@114364/master.m3u8?b=650-3200&start=1509912010
• OK: //s2ra-lh.akamaihd.net/i/s2e20171105_1@114364/master.m3u8?b=650-3200&start=1509912011
• OK: //s2ra-lh.akamaihd.net/i/s2e20171105_1@114364/master.m3u8?b=650-3200&start=1509912012
• BAD: //s2ra-lh.akamaihd.net/i/s2e20171105_1@114364/master.m3u8?b=650-3200&start=1509912013
• OK: //s2ra-lh.akamaihd.net/i/s2e20171105_1@114364/master.m3u8?b=650-3200&start=1509912014
• OK: //s2ra-lh.akamaihd.net/i/s2e20171105_1@114364/master.m3u8?b=650-3200&start=1509912015
• BAD: //s2ra-lh.akamaihd.net/i/s2e20171105_1@114364/master.m3u8?b=650-3200&start=1509912016

M3U8 Test Stream #2 (HTTP or HTTPS):
• BAD: //s3ra-lh.akamaihd.net/i/s3e20171105_1@114366/master.m3u8?b=650-3200&start=1509922800
• OK: //s3ra-lh.akamaihd.net/i/s3e20171105_1@114366/master.m3u8?b=650-3200&start=1509922801
• OK: //s3ra-lh.akamaihd.net/i/s3e20171105_1@114366/master.m3u8?b=650-3200&start=1509922802
• BAD: //s3ra-lh.akamaihd.net/i/s3e20171105_1@114366/master.m3u8?b=650-3200&start=1509922803
• OK: //s3ra-lh.akamaihd.net/i/s3e20171105_1@114366/master.m3u8?b=650-3200&start=1509922804
• OK: //s3ra-lh.akamaihd.net/i/s3e20171105_1@114366/master.m3u8?b=650-3200&start=1509922805
• BAD: //s3ra-lh.akamaihd.net/i/s3e20171105_1@114366/master.m3u8?b=650-3200&start=1509922806
• OK: //s3ra-lh.akamaihd.net/i/s3e20171105_1@114366/master.m3u8?b=650-3200&start=1509922807
• OK: //s3ra-lh.akamaihd.net/i/s3e20171105_1@114366/master.m3u8?b=650-3200&start=1509922808
• BAD: //s3ra-lh.akamaihd.net/i/s3e20171105_1@114366/master.m3u8?b=650-3200&start=1509922809
• OK: //s3ra-lh.akamaihd.net/i/s3e20171105_1@114366/master.m3u8?b=650-3200&start=1509922810
• OK: //s3ra-lh.akamaihd.net/i/s3e20171105_1@114366/master.m3u8?b=650-3200&start=1509922811
• BAD: //s3ra-lh.akamaihd.net/i/s3e20171105_1@114366/master.m3u8?b=650-3200&start=1509922812

Console output
logger.js:37 [log] > loadSource:http://s2ra-lh.akamaihd.net/i/s2e20171105_1@114364/master.m3u8?b=650-3200&start=1509912001
logger.js:37 [log] > trigger BUFFER_RESET
logger.js:37 [log] > set autoLevelCapping:-1
logger.js:37 [log] > attachMedia
logger.js:37 [log] > media source opened
logger.js:37 [log] > manifest loaded,6 level(s) found, first bitrate:650000
logger.js:37 [log] > startLoad(-1)
logger.js:37 [log] > switching to level 0
logger.js:37 [log] > loading playlist for level 0
logger.js:37 [log] > main stream:STOPPED->IDLE
logger.js:37 [log] > audio tracks updated
logger.js:37 [log] > subtitle tracks updated
logger.js:37 [log] > level 0 loaded [150991202,150991980],duration:7786.855
logger.js:37 [log] > Loading 150991202 of [150991202 ,150991980],level 0, currentTime:0.000,bufferEnd:0.000
logger.js:37 [log] > demuxing in webworker
logger.js:37 [log] > main stream:IDLE->FRAG_LOADING
?src=%2F%2Fs2ra-lh.akamaihd.net%2Fi%2Fs2e20171105_1%40114364%2Fmaster.m3u8%3Fb%3D650-3200%26start%3D1509912001&enableStreaming=true&autoRecoverError=true&enableWorker=true&dumpfMP4=false&levelCapping=-1&defaultAudioCodec=undefined:370 parsing level duration :3525us,count:1
logger.js:37 [log] > Loaded  150991202 of [150991202 ,150991980],level 0
logger.js:37 [log] > main stream:FRAG_LOADING->PARSING
logger.js:37 [log] > Parsing 150991202 of [150991202 ,150991980],level 0, cc 0
logger.js:37 [log] > main:discontinuity detected
logger.js:37 [log] > main:switch detected
blob:http://streambox.fr/07fd3033-2ddb-4941-bc91-775aeb23f50b:516 [log] > manifest codec:mp4a.40.2,ADTS data:type:2,sampleingIndex:3[48000Hz],channelConfig:2
blob:http://streambox.fr/07fd3033-2ddb-4941-bc91-775aeb23f50b:516 [log] > parsed codec:mp4a.40.5,rate:48000,nb channel:2
blob:http://streambox.fr/07fd3033-2ddb-4941-bc91-775aeb23f50b:516 [log] > audio sampling rate : 48000
logger.js:37 [log] > InitPTS for cc:0 found from video track:-684245840
logger.js:37 [log] > creating sourceBuffer(audio/mp4;codecs=mp4a.40.2)
logger.js:37 [log] > creating sourceBuffer(video/mp4;codecs=avc1.64001f)
logger.js:37 [log] > main track:audio,container:audio/mp4,codecs[level/parsed]=[mp4a.40.2/mp4a.40.5]
logger.js:37 [log] > main track:video,container:video/mp4,codecs[level/parsed]=[avc1.64001f/avc1.640015]
logger.js:37 [log] > Parsed audio,PTS:[0.000,10.005],DTS:[0.000/10.005],nb:469,dropped:0
logger.js:37 [log] > Parsed video,PTS:[2.918,10.158],DTS:[2.852/10.025],nb:215,dropped:85
logger.js:37 [warn] > missing video frame(s) on first frag, appending with gap
(anonymous) @ logger.js:37
onFragParsingData @ stream-controller.js:1141
onEventGeneric @ event-handler.js:65
onEvent @ event-handler.js:53
EventEmitter.emit @ events.js:96
trigger @ hls.js:89
onWorkerMessage @ demuxer.js:142
logger.js:37 [log] > main stream:PARSING->PARSED
logger.js:37 [log] > main buffered : [2.852,10.005]
logger.js:37 [log] > latency/loading/parsing/append/kbps:22/142/53/4/32206
logger.js:37 [log] > main stream:PARSED->IDLE
logger.js:37 [log] > switching to level 5
logger.js:37 [log] > loading playlist for level 5
logger.js:37 [log] > main stream:IDLE->WAITING_LEVEL
logger.js:37 [log] > level 5 loaded [150991202,150991980],duration:7786.997
logger.js:37 [log] > Updating mediasource duration to 7786.997
logger.js:37 [log] > main stream:WAITING_LEVEL->IDLE
logger.js:37 [log] > Loading 150991202 of [150991202 ,150991980],level 5, currentTime:0.000,bufferEnd:0.000
logger.js:37 [log] > main stream:IDLE->FRAG_LOADING
?src=%2F%2Fs2ra-lh.akamaihd.net%2Fi%2Fs2e20171105_1%40114364%2Fmaster.m3u8%3Fb%3D650-3200%26start%3D1509912001&enableStreaming=true&autoRecoverError=true&enableWorker=true&dumpfMP4=false&levelCapping=-1&defaultAudioCodec=undefined:370 parsing level duration :3822us,count:2
logger.js:37 [log] > Loaded  150991202 of [150991202 ,150991980],level 5
logger.js:37 [log] > main stream:FRAG_LOADING->PARSING
logger.js:37 [log] > Parsing 150991202 of [150991202 ,150991980],level 5, cc 0
logger.js:37 [log] > main:switch detected
blob:http://streambox.fr/07fd3033-2ddb-4941-bc91-775aeb23f50b:516 [log] > manifest codec:mp4a.40.2,ADTS data:type:2,sampleingIndex:3[48000Hz],channelConfig:2
blob:http://streambox.fr/07fd3033-2ddb-4941-bc91-775aeb23f50b:516 [log] > parsed codec:mp4a.40.5,rate:48000,nb channel:2
blob:http://streambox.fr/07fd3033-2ddb-4941-bc91-775aeb23f50b:516 [log] > audio sampling rate : 48000
logger.js:37 [log] > main track:audio,container:audio/mp4,codecs[level/parsed]=[mp4a.40.2/mp4a.40.5]
logger.js:37 [log] > main track:video,container:video/mp4,codecs[level/parsed]=[avc1.64001f/avc1.64001f]
logger.js:37 [log] > Parsed audio,PTS:[0.000,10.005],DTS:[0.000/10.005],nb:469,dropped:0
logger.js:37 [log] > Parsed video,PTS:[2.918,10.158],DTS:[2.852/10.025],nb:215,dropped:85
logger.js:37 [warn] > missing video frame(s) on first frag, appending with gap
(anonymous) @ logger.js:37
onFragParsingData @ stream-controller.js:1141
onEventGeneric @ event-handler.js:65
onEvent @ event-handler.js:53
EventEmitter.emit @ events.js:96
trigger @ hls.js:89
onWorkerMessage @ demuxer.js:142
logger.js:37 [log] > main stream:PARSING->PARSED
logger.js:37 [log] > main buffered : [2.852,10.005]
logger.js:37 [log] > latency/loading/parsing/append/kbps:35/784/87/9/37548
logger.js:37 [log] > main stream:PARSED->IDLE
logger.js:37 [log] > SN just loaded, load next one: 150991203
logger.js:37 [log] > Loading 150991203 of [150991202 ,150991980],level 5, currentTime:0.000,bufferEnd:0.000
logger.js:37 [log] > main stream:IDLE->FRAG_LOADING
logger.js:37 [log] > Loaded  150991203 of [150991202 ,150991980],level 5
logger.js:37 [log] > main stream:FRAG_LOADING->PARSING
logger.js:37 [log] > Parsing 150991203 of [150991202 ,150991980],level 5, cc 0
logger.js:37 [log] > Parsed audio,PTS:[10.005,20.011],DTS:[10.005/20.011],nb:469,dropped:0
logger.js:37 [log] > Parsed video,PTS:[10.091,20.003],DTS:[10.025/20.003],nb:299,dropped:0
logger.js:37 [log] > main stream:PARSING->PARSED
logger.js:37 [log] > main buffered : [2.852,20.003]
logger.js:37 [log] > latency/loading/parsing/append/kbps:36/470/73/6/54513
logger.js:37 [log] > main stream:PARSED->IDLE
logger.js:37 [log] > Loading 150991202 of [150991202 ,150991980],level 5, currentTime:0.000,bufferEnd:0.000
logger.js:37 [log] > main stream:IDLE->FRAG_LOADING
logger.js:37 [log] > Loaded  150991202 of [150991202 ,150991980],level 5
logger.js:37 [log] > main stream:FRAG_LOADING->PARSING
logger.js:37 [log] > Parsing 150991202 of [150991202 ,150991980],level 5, cc 0
logger.js:37 [log] > Parsed audio,PTS:[0.000,10.005],DTS:[0.000/10.005],nb:469,dropped:0
logger.js:37 [log] > Parsed video,PTS:[2.918,10.158],DTS:[2.852/10.025],nb:215,dropped:85
logger.js:37 [warn] > missing video frame(s) on first frag, appending with gap
(anonymous) @ logger.js:37
onFragParsingData @ stream-controller.js:1141
onEventGeneric @ event-handler.js:65
onEvent @ event-handler.js:53
EventEmitter.emit @ events.js:96
trigger @ hls.js:89
onWorkerMessage @ demuxer.js:142
logger.js:37 [log] > main stream:PARSING->PARSED
logger.js:37 [log] > main buffered : [2.852,20.003]
logger.js:37 [log] > main stream:PARSED->IDLE
logger.js:37 [log] > SN just loaded, load next one: 150991203
logger.js:37 [log] > Loading 150991203 of [150991202 ,150991980],level 5, currentTime:0.000,bufferEnd:0.000
logger.js:37 [log] > main stream:IDLE->FRAG_LOADING
logger.js:37 [log] > Loaded  150991203 of [150991202 ,150991980],level 5
logger.js:37 [log] > main stream:FRAG_LOADING->PARSING
logger.js:37 [log] > Parsing 150991203 of [150991202 ,150991980],level 5, cc 0
logger.js:37 [log] > Parsed audio,PTS:[10.005,20.011],DTS:[10.005/20.011],nb:469,dropped:0
logger.js:37 [log] > Parsed video,PTS:[10.091,20.003],DTS:[10.025/20.003],nb:299,dropped:0
logger.js:37 [log] > main stream:PARSING->PARSED
logger.js:37 [log] > main buffered : [2.852,20.003]
logger.js:37 [log] > main stream:PARSED->IDLE
logger.js:37 [log] > Loading 150991202 of [150991202 ,150991980],level 5, currentTime:0.000,bufferEnd:0.000
logger.js:37 [log] > main stream:IDLE->FRAG_LOADING
logger.js:37 [log] > Loaded  150991202 of [150991202 ,150991980],level 5
logger.js:37 [log] > main stream:FRAG_LOADING->PARSING
logger.js:37 [log] > Parsing 150991202 of [150991202 ,150991980],level 5, cc 0
logger.js:37 [log] > Parsed audio,PTS:[0.000,10.005],DTS:[0.000/10.005],nb:469,dropped:0
logger.js:37 [log] > Parsed video,PTS:[2.918,10.158],DTS:[2.852/10.025],nb:215,dropped:85
logger.js:37 [warn] > missing video frame(s) on first frag, appending with gap
(anonymous) @ logger.js:37
onFragParsingData @ stream-controller.js:1141
onEventGeneric @ event-handler.js:65
onEvent @ event-handler.js:53
EventEmitter.emit @ events.js:96
trigger @ hls.js:89
onWorkerMessage @ demuxer.js:142
logger.js:37 [log] > main stream:PARSING->PARSED
logger.js:37 [log] > main buffered : [2.852,20.003]
logger.js:37 [log] > main stream:PARSED->IDLE
logger.js:37 [log] > SN just loaded, load next one: 150991203
logger.js:37 [log] > Loading 150991203 of [150991202 ,150991980],level 5, currentTime:0.000,bufferEnd:0.000
logger.js:37 [log] > main stream:IDLE->FRAG_LOADING
logger.js:37 [log] > Loaded  150991203 of [150991202 ,150991980],level 5
logger.js:37 [log] > main stream:FRAG_LOADING->PARSING
logger.js:37 [log] > Parsing 150991203 of [150991202 ,150991980],level 5, cc 0
logger.js:37 [log] > Parsed audio,PTS:[10.005,20.011],DTS:[10.005/20.011],nb:469,dropped:0
logger.js:37 [log] > Parsed video,PTS:[10.091,20.003],DTS:[10.025/20.003],nb:299,dropped:0
logger.js:37 [log] > main stream:PARSING->PARSED
logger.js:37 [log] > main buffered : [2.852,20.003]
logger.js:37 [log] > main stream:PARSED->IDLE
logger.js:37 [log] > Loading 150991202 of [150991202 ,150991980],level 5, currentTime:0.000,bufferEnd:0.000
logger.js:37 [warn] > level controller,fragLoopLoadingError for level 5: switching to redundant stream id 1
(anonymous) @ logger.js:37
onError @ level-controller.js:279
onEventGeneric @ event-handler.js:65
onEvent @ event-handler.js:53
EventEmitter.emit @ events.js:96
trigger @ hls.js:89
_loadFragmentOrKey @ stream-controller.js:514
_fetchPayloadOrEos @ stream-controller.js:319
_doTickIdle @ stream-controller.js:271
doTick @ stream-controller.js:143
tick @ stream-controller.js:125
_checkAppendedParsed @ stream-controller.js:1304
onBufferAppended @ stream-controller.js:1278
onEventGeneric @ event-handler.js:65
onEvent @ event-handler.js:53
EventEmitter.emit @ events.js:96
trigger @ hls.js:89
onSBUpdateEnd @ buffer-controller.js:209
?src=%2F%2Fs2ra-lh.akamaihd.net%2Fi%2Fs2e20171105_1%40114364%2Fmaster.m3u8%3Fb%3D650-3200%26start%3D1509912001&enableStreaming=true&autoRecoverError=true&enableWorker=true&dumpfMP4=false&levelCapping=-1&defaultAudioCodec=undefined:528 {type: "mediaError", details: "fragLoopLoadingError", fatal: false, frag: Fragment}
(anonymous) @ ?src=%2F%2Fs2ra-lh.akamaihd.net%2Fi%2Fs2e20171105_1%40114364%2Fmaster.m3u8%3Fb%3D650-3200%26start%3D1509912001&enableStreaming=true&autoRecoverError=true&enableWorker=true&dumpfMP4=false&levelCapping=-1&defaultAudioCodec=undefined:528
EventEmitter.emit @ events.js:96
trigger @ hls.js:89
_loadFragmentOrKey @ stream-controller.js:514
_fetchPayloadOrEos @ stream-controller.js:319
_doTickIdle @ stream-controller.js:271
doTick @ stream-controller.js:143
tick @ stream-controller.js:125
_checkAppendedParsed @ stream-controller.js:1304
onBufferAppended @ stream-controller.js:1278
onEventGeneric @ event-handler.js:65
onEvent @ event-handler.js:53
EventEmitter.emit @ events.js:96
trigger @ hls.js:89
onSBUpdateEnd @ buffer-controller.js:209
logger.js:37 [log] > loading playlist for level 5
logger.js:37 [log] > main stream:IDLE->WAITING_LEVEL
logger.js:37 [log] > level 5 loaded [150991202,150991980],duration:7786.994
logger.js:37 [log] > main stream:WAITING_LEVEL->IDLE
logger.js:37 [log] > Loading 150991202 of [150991202 ,150991980],level 5, currentTime:0.000,bufferEnd:0.000
logger.js:37 [log] > main stream:IDLE->FRAG_LOADING
?src=%2F%2Fs2ra-lh.akamaihd.net%2Fi%2Fs2e20171105_1%40114364%2Fmaster.m3u8%3Fb%3D650-3200%26start%3D1509912001&enableStreaming=true&autoRecoverError=true&enableWorker=true&dumpfMP4=false&levelCapping=-1&defaultAudioCodec=undefined:370 parsing level duration :3023us,count:3

@NicolasSiver
Copy link
Member

We have discovered this issue a bit more than a week ago. The issue with a shift in PTS, if PTS shift is bigger than maxSeekHole, library enters an endless loop where you can see the loading of first and second segments.

We are working on a solution where you don't need really hardcode a config value, but there is an understanding of bad fragments and more reliable skip logic (to skip "gaps").

As a temporal solution, you can try to increase maxSeekHole to 3-4 seconds.

@itecx
Copy link
Author

itecx commented Nov 23, 2017

How would I overwrite the Hls.defaultConfig in the HLS.js provider version 8.0.4 which is used by JW Player 8?
http://ssl.p.jwpcdn.com/player/v/8.0.4/provider.hlsjs.js
JW sets the maxBufferHole to only 0.5 seconds!

Here are all the HLS.defaultConfig parameters set by JW Player 8:
{
autoStartLoad: !0,
startPosition: -1,
defaultAudioCodec: void 0,
debug: !1,
capLevelOnFPSDrop: !1,
capLevelToPlayerSize: !1,
initialLiveManifestSize: 1,
maxBufferLength: 30,
maxBufferSize: 6e7,
maxBufferHole: .5,
maxSeekHole: 2,

lowBufferWatchdogPeriod: .5,
highBufferWatchdogPeriod: 3,
nudgeOffset: .1,
nudgeMaxRetry: 3,
maxFragLookUpTolerance: .2,
liveSyncDurationCount: 3,
liveMaxLatencyDurationCount: 1 / 0,
liveSyncDuration: void 0,
liveMaxLatencyDuration: void 0,
maxMaxBufferLength: 600,
enableWorker: !0,
enableSoftwareAES: !0,
manifestLoadingTimeOut: 1e4,
manifestLoadingMaxRetry: 1,
manifestLoadingRetryDelay: 1e3,
manifestLoadingMaxRetryTimeout: 64e3,
startLevel: void 0,
levelLoadingTimeOut: 1e4,
levelLoadingMaxRetry: 4,
levelLoadingRetryDelay: 1e3,
levelLoadingMaxRetryTimeout: 64e3,
fragLoadingTimeOut: 2e4,
fragLoadingMaxRetry: 6,
fragLoadingRetryDelay: 1e3,
fragLoadingMaxRetryTimeout: 64e3,
fragLoadingLoopThreshold: 3,
startFragPrefetch: !1,
fpsDroppedMonitoringPeriod: 5e3,
fpsDroppedMonitoringThreshold: .2,
appendErrorMaxRetry: 3,
loader: Ie,
fLoader: void 0,
pLoader: void 0,
xhrSetup: void 0,
fetchSetup: void 0,
abrController: Ee,
bufferController: Se,
capLevelController: ke,
fpsController: we,
stretchShortVideoTrack: !1,
maxAudioFramesDrift: 1,
forceKeyFrameOnDiscontinuity: !0,
abrEwmaFastLive: 3,
abrEwmaSlowLive: 9,
abrEwmaFastVoD: 3,
abrEwmaSlowVoD: 9,
abrEwmaDefaultEstimate: 5e5,
abrBandWidthFactor: .95,
abrBandWidthUpFactor: .7,
abrMaxWithRealBitrate: !1,
maxStarvationDelay: 4,
maxLoadingDelay: 4,
minAutoBitrate: 0
};

@NicolasSiver
Copy link
Member

Hello, @itecx

Can we re-upload (partially) this video?

s2ra-lh.akamaihd.net/i/s2e20171105_1@114364/master.m3u8?b=650-3200&start=1509912001

for functional tests?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants