hls.js alternates 3 qualities on throttled connections

Created on 7 Nov 2016  路  17Comments  路  Source: video-dev/hls.js

Environment

Steps to reproduce
  1. play the livestream on the demo page and investigate network tab
  2. throttle down to "DSL (5ms, 2.0Mb/s)"
  3. hls.js now loads different qualities at the same time and switches quality levels very often.
Expected behavior

do not switch quality levels this fast.

Actual behavior

quality levels are changed very often. Also, some segments are loaded in more than one quality.
this causes video and audio lags.

Console output

logs.txt

Network output

bildschirmfoto 2016-11-07 um 17 41 04

the second number in the filename is the quality.

Bug

Most helpful comment

ok, there are 2 things:
most of your fragments do not start with a Key Frame.
=> as a consequence, when switching between renditions (to level L, SN N), hls.js needs also to load frag level L, SN N-1 to be able to decode the first frames of frag level L, SN N
as it adds extra latency, upfront buffer becomes short, and the changes i did in ABR (taking into account upfront buffer to choose rendition) triggers a switch down to avoid a rebuffering (although bw is enough)

=> you should try to have your fragment starting with KF
=> i will try to disable the upfront buffer check in ABR for live streams (it might not be appropriate)

All 17 comments

shit... our livestream is geo ip blocked, do you have a proxy to germany?

nope sorry

ok we will work on a solution tomorrow.

posting a metrics permalink would help in the meantime

http://dailymotion.github.io/hls.js/demo/metrics.html?data=dXJsfGh0dHA6Ly96ZGYxMzE0LWxoLmFrYW1haWhkLm5ldC9pL2RlMTRfdjFAMzkyODc4L21hc3Rlci5tM3U4fHQwfGxvYWR8dHlwZXxtYW5pZmVzdHxuYW1lfHN0YXJ0fGVuZHx0aW1lfGxhdGVuY3l8ZHVyYXRpb258bGV2ZWx8aWR8cGFyc2luZ3xtYWluK2ZyYWdtZW50fGlkMnxidWZmZXJ8Ynd8c2l6ZXxtYWluK2ZyYWdtZW50fG1haW4rZnJhZ21lbnR8bWFpbitmcmFnbWVudHxtYWluK2ZyYWdtZW50fG1haW4rZnJhZ21lbnR8bWFpbitmcmFnbWVudHxtYWluK2ZyYWdtZW50fHBvc3x2aWRlb3xNZWRpYSthdHRhY2hlZHxtYWluK2luaXQrc2VnbWVudHxkdXJhdGlvbmNoYW5nZXxyZXNpemV8MzEzLzE3Nnxsb2FkZWRtZXRhZGF0YXxzZWVraW5nfHNlZWtlZHxmcmFnK2NoYW5nZWR8MTQ3ODYwMTI0K0ArMHxsb2FkZWRkYXRhfGNhbnBsYXl8cGxheXxwbGF5aW5nfGNhbnBsYXl0aHJvdWdofG1haW4raW5pdCtzZWdtZW50fG1haW4raW5pdCtzZWdtZW50fG1haW4raW5pdCtzZWdtZW50fGZyYWcrY2hhbmdlZHwxNDc4NjAxMjQrQCswfGJ1ZmZlcmluZ3xmcmFnK2NoYW5nZWR8MTQ3ODYwMTI1K0ArMHxtYWluK2luaXQrc2VnbWVudHxtYWluK2luaXQrc2VnbWVudHxtYWluK2luaXQrc2VnbWVudHxmcmFnK2NoYW5nZWR8MTQ3ODYwMTI2K0ArMHxiaXRyYXRlfGlzTGl2ZV4wfDZ8MHwyRzE1R1R8MkcxNUxRfDB8MkcxNUxPfDFPNnw2NFM4fDF8MkcxNUdVfDJHMTVMUnwxfDJHMTVMUHwxTUh8Q043Q3wyfDJHMTVHVXwyRzE1TFJ8MnwyRzE1TFF8MUxTfExINkd8MHwyRzE1R1V8MkcxNUxSfDB8MkcxNUxQfDFNNHw2MDU0fDB8MkcxNUxPfDFMRXw2NFM4fDF8MkcxNUdWfDJHMTVMU3wxfDJHMTVMUXwxT098RDE0T3wyfDJHMTVHVnwyRzE1TFN8MnwyRzE1TFF8MU5PfExINkd8MHwyRzE1R1Z8MkcxNUxTfDB8MkcxNUxRfDFSSXw2NzNTfDF8MkcxNUdWfDJHMTVMU3wwfDB8MHw2Vzl8MTFKNTd8MUV8MTFRMDJ8NldVfDExUVVFfDZWRHwxMVFWVnw1fDExWFIzfDZXRHwxMVlLNHw2VVl8MTFZTEp8Nk1NfDExWVRWfDEyNUdHfDB8MTFKNEt8MTFKNEt8MTFKNEt8MTFKNEt8MTFKNEt8MTFKNEt8MTFKNEt8MTJENjh8MTFRVUN8MTFRVUN8MTFRVUN8MTFRVUN8MTFRVUN8MTJLV1J8MTFZSzR8MTFZSzR8MTFZSzR8MTFZSzR8MTFZSzR8MHw1OXwwfDU5fDB8NTl8MXxDNHwyfEtHfDB8NTl8MXxDNHwyfEtHfDB8NTl8MXxDNHwxTzZ8MHwxTUh8MXwxTFN8MnwxTTR8QXwwfDFMRXwwfDFPT3xBfDF8MU5PfDJ8MVJJfEF8MF4xMTY1Ljg0fDcuOTk1MDAwMDAwMDAwMzQ2fDQ5Ljc3NDk5OTk5OTk5OTg2NHw4LjE0MDAwMDAwMDAwMDF8NzMuODkwMDAwMDAwMDAwMXwzOS4xMjAwMDAwMDAwMDAxMnw2OC43NjQ5OTk5OTk5OTk4N3wzLjU5NTAwMDAwMDAwMDAyNzN8MTg5LjA0NTAwMDAwMDAwMDN8MTU4Ljg5NDk5OTk5OTk5OTk4fDk2OC4xMTk5OTk5OTk5OTk5fDgzLjQyNTAwMDAwMDAwMDE4fDUuNDcwMDAwMDAwMDAwMjU1fDEwNTcuMDE1MDAwMDAwMDAwM3wxNDA4LjY4NTAwMDAwMDAwMDZ8MjcuMDI5OTk5OTk5OTk5NzQ1fDc2LjU4NTAwMDAwMDAwMDA0fDEuNzg0OTk5OTk5OTk5ODU0NXwxNTE3LjMwMDAwMDAwMDAwMDR8MTA2LjczOTk5OTk5OTk5OTc4fDIyMDUuOTk1MDAwMDAwMDAxfDMzLjYxOTk5OTk5OTk5OTg5fDIuMzAwMDAwMDAwMDAwMTgyfDIyNDEuOTE1MDAwMDAwMDAxfDM4NzQuNDIwMDAwMDAwMDAxfDM1LjY1OTk5OTk5OTk5ODk0NXw2NS45MjUwMDAwMDAwMDAxOHwxLjc3MDAwMDAwMDAwMDQzNjZ8Mzk3OS43ODUwMDAwMDAwMDA4fDY1LjA5NDk5OTk5OTk5OTM1fDM4MTYuMjg1MDAwMDAwMDAwOHwzMy4yOTUwMDAwMDAwMDAwN3w1LjE3MDAwMDAwMDAwMDA3M3wzODU0Ljc1MDAwMDAwMDAwMXw3OTAzLjQxNDk5OTk5OTk5OXw4OS4xMzUwMDAwMDAwMDIwNHw2OS43MjUwMDAwMDAwMDAzNnw5Ljg0NDk5OTk5OTk5OTM0NXw4MDc0LjQzfDc5LjA4NTAwMDAwMDAwMDk1fDEwMjMuNzc0OTk5OTk5OTk5NnwzMC44MzQ5OTk5OTk5OTkxMjd8MTYuNDIwMDAwMDAwMDAwMDczfDEwNzEuMDI5OTk5OTk5OTk4OHw5MjI4LjMxMDAwMDAwMDAwMXwzOS45MzAwMDAwMDAwMDAyOXwxMDgxLjc3NDk5OTk5OTk5Nzh8MjEuODg1MDAwMDAwMDAyMDM3fDQuNTI0OTk5OTk5OTk5NjM2fDExMDguMTg0OTk5OTk5OTk5NXwxMDM4MC4xOTUwMDAwMDAwMDJ8MTA3LjA1OTk5OTk5OTk5OTQ5fDY5Ljk3NTAwMDAwMDAwMDM2fDEuMjk0OTk5OTk5OTk4MjUzOHwxMDU2Mi42MzAwMDAwMDAwMDF8NDgwLjMzNTAwMDAwMDAwMDk1fDIxOTEuMjc5OTk5OTk5OTk5fDMyLjYzNTAwMDAwMDAwMDIyfDMuNTA0OTk5OTk5OTk5MTk5NnwyMjI3LjQxOTk5OTk5OTk5ODN8MTMyNzUuNjg1fDUwLjg1MDAwMDAwMDAwMDM2NHw1Ni4zMTAwMDAwMDAwMDEzMXwxLjc1fDEzMzg3LjIzNXwxNjcuMDI0OTk5OTk5OTk5NjR8MzY5Ny41NzUwMDAwMDAwMDI1fDMwLjEyNDk5OTk5OTk5NjM2Mnw0LjUyOTk5OTk5OTk5ODgzNnwzNzMyLjIyOTk5OTk5OTk5Nzd8MTcyOTEuNDN8NTIuMjc1MDAwMDAwMDAxNDU1fDYxLjM0NTAwMDAwMDAwMTE2NHwxLjM0OTk5OTk5OTk5ODU0NDh8MTc0MDguMzIwMDAwMDAwMDAzfDE2My4xNTQ5OTk5OTk5OTg4NHw5NzkuMjA5OTk5OTk5OTk5MXwyOS42ODAwMDAwMDAwMDAyOXwyLjk0NDk5OTk5OTk5OTcwOXwxMDExLjgzNDk5OTk5OTk5OTF8MTg1OTAuODg1MDAwMDAwMDAyfDI3LjQ2OTk5OTk5OTk5NzUyNnw3NC43OTUwMDAwMDAwMDE4OXwxMC4xMjV8MTUxMC42NTAwMDAwMDAwMDAzfDEwNDA3LjM0NTAwMDAwMDAwMXwxMDUwNi4yODUwMDAwMDAwMDJ8MTA2MDguMzU1MDAwMDAwMDAxfDE5NTA4Ljc2NTAwMDAwMDAwM3wxOTYwNi44NnwxOTcwNi42MXwyMDAwNy4wNzUwMDAwMDAwMDR8OTQuMTA1MDAwMDAwMDAwMjV8MTM5NC44MjAwMDAwMDAwMDA0fDE0MDMuNDM1MDAwMDAwMDAwMnwxNDAzLjQ5MDAwMDAwMDAwMDV8MTQwMy41MjUwMDAwMDAwMDAzfDE0MTAuOTA1MDAwMDAwMDAwNHwyOS4wNTk5OTk5OTk5OTk5NDV8MTQzOS45NjUwMDAwMDAwMDA0fDE0NDAuNzc1MDAwMDAwMDAwM3wxNDQxLjc5MDAwMDAwMDAwMDJ8MTQ0MS44MDUwMDAwMDAwMDA1fDE0NDEuODQ1fDE0NDEuOTA1MDAwMDAwMDAwNHwxNDQxLjkyMDAwMDAwMDAwMDN8Mzg1Ny43NDAwMDAwMDAwMDA3fDc4NzkuMTEwMDAwMDAwMDAxfDgwNzcuNzY1MDAwMDAwMDAxfDkxOTAuNzcwMDAwMDAwMDAyfDEwMzY5LjE0NXwxMDQwNy4zMjV8OTguOTI0OTk5OTk5OTk5Mjd8MTA0NzUuNzc1MDAwMDAwMDAxfDE5Ljk4OTk5OTk5OTk5OTc4fDEwNDk1Ljc2NTAwMDAwMDAwMXwxMDQ5Ni4zMXwxMDQ5OS4wNTV8MTA0OTkuMDcwMDAwMDAwMDAyfDEwNDk5LjA4fDEwNTY3LjMwNXwxMzI1MS42ODAwMDAwMDAwMDJ8MTcyNjguMTl8MTg1NjMuNjI1fDE5NTA4Ljc0fDk4LjA4NDk5OTk5OTk5OTEzfDE5NTczLjE3MDAwMDAwMDAwMnwxOS4zODQ5OTk5OTk5OTg0fDE5NTkyLjU1NXwxOTU5Mi44N3wxOTU5NS45MjV8MTk1OTUuOTQwMDAwMDAwMDAyfDE5NTk1Ljk1fDcxLjY0MDAwMDAwMDAwMDMzfDkwLjI4NTAwMDAwMDAwMDMxfDkxLjUxMDAwMDAwMDAwMDIyfDE0MDcuNzc1MDAwMDAwMDAwM3wzODczLjgyMDAwMDAwMDAwMDZ8NzkwMi41NTV8MTAzNzkuMzN8MTMyNzUuMTF8MTcyOTAuODF8MTg1ODguMDc1MDAwMDAwMDA0fDE0MDUuODl8MTAuMDU5NjY2NjY2NjY2NzcyfDM4NjYuMzQ1MDAwMDAwMDAwM3wxMC4wMzMwMDAwMDAwMDAxM3w3ODk5Ljk0MDAwMDAwMDAwMDV8MTAuMDQ5MDAwMDAwMDAwMjA2fDkyMjQuODEwMDAwMDAwMDAxfDEwMzc2Ljc2fDEzMjcwLjY4NTAwMDAwMDAwMXwxNzI4Ni43NnwxODU4My41NjUwMDAwMDAwMDJeJDB8MXwyfDVHfDN8QCQ0fDV8NnwtNHw3fDFOfDh8MU98OXw1SHxBfDVJfDN8NUp8Qnw1Sl18JDR8Q3xEfDFQfDd8MVF8OHwxUnw5fDVLfEF8NUx8M3w1TXxFfDVOfEJ8NU1dfCQ0fEZ8RHwxU3xHfDFUfDl8NU98QXw1UHwzfDVRfEV8NVJ8SHw1U3xCfDVUfEl8MVV8SnwxVl18JDR8Q3xEfDFXfDd8MVh8OHwxWXw5fDVVfEF8NVZ8M3w1V3xFfDVYfEJ8NVddfCQ0fEt8RHwxWnxHfDIwfDl8NVl8QXw1WnwzfDYwfEV8NjF8SHw2MnxCfDYzfEl8MjF8SnwyMl18JDR8Q3xEfDIzfDd8MjR8OHwyNXw5fDY0fEF8NjV8M3w2NnxFfDY3fEJ8NjZdfCQ0fEx8RHwyNnxHfDI3fDl8Njh8QXw2OXwzfDZBfEV8NkJ8SHw2Q3xCfDZEfEl8Mjh8SnwyOV18JDR8Q3xEfDJBfDd8MkJ8OHwyQ3w5fDZFfEF8NkZ8M3w2R3xFfDZIfEJ8NkddfCQ0fE18RHwyRHxHfDJFfDl8Nkl8QXw2SnwzfDZLfEV8Nkx8SHw2TXxCfDZOfEl8MkZ8SnwyR118JDR8TnxEfDJIfEd8Mkl8OXw2T3xBfDZQfDN8NlF8RXw2UnxIfDZTfEJ8NlR8SXwySnxKfDJLXXwkNHxDfER8Mkx8N3wyTXw4fDJOfDl8NlV8QXw2VnwzfDZXfEV8Nlh8Qnw2V118JDR8T3xEfDJPfEd8MlB8OXw2WXxBfDZafDN8NzB8RXw3MXxIfDcyfEJ8NzN8SXwyUXxKfDJSXXwkNHxDfER8MlN8N3wyVHw4fDJVfDl8NzR8QXw3NXwzfDc2fEV8Nzd8Qnw3Nl18JDR8UHxEfDJWfEd8Mld8OXw3OHxBfDc5fDN8N0F8RXw3QnxIfDdDfEJ8N0R8SXwyWHxKfDJZXXwkNHxDfER8Mlp8N3wzMHw4fDMxfDl8N0V8QXw3RnwzfDdHfEV8N0h8Qnw3R118JDR8UXxEfDMyfEd8MzN8OXw3SXxBfDdKfDN8N0t8RXw3THxIfDdNfEJ8N058SXwzNHxKfDM1XXwkNHxDfER8MzZ8N3wzN3w4fDM4fDl8N098QXw3UHwzfDdRfEV8N1J8Qnw3UV1dfEh8QCQ5fDM5fEh8M0F8UnwzQl18JDl8N1N8SHwzQ3xSfDNEXXwkOXw3VHxIfDNFfFJ8M0ZdfCQ5fDdVfEh8M0d8UnwzSF18JDl8N1Z8SHwzSXxSfDNKXXwkOXw3V3xIfDNLfFJ8M0xdfCQ5fDdYfEh8M018UnwzTl18JDl8N1l8SHwzT3xSfDNQXXwkOXw3WnxIfDNRfFJ8M1JdXXxTfEAkOXw4MHw0fFRdfCQ5fDgxfDR8VV18JDl8ODJ8NHxWfDZ8M1NdfCQ5fDgzfDR8V3w2fFhdfCQ5fDg0fDR8WXw2fDNUXXwkOXw4NXw0fFp8NnwzVXxCfDg2XXwkOXw4N3w0fDEwfDZ8M1ZdfCQ5fDg4fDR8MTF8NnwxMl18JDl8ODl8NHwxM3w2fDNXXXwkOXw4QXw0fDE0fDZ8M1hdfCQ5fDhCfDR8MTV8NnwzWV18JDl8OEN8NHwxNnw2fDNaXXwkOXw4RHw0fDE3fDZ8NDBdfCQ5fDhFfDR8MThdfCQ5fDhGfDR8MTldfCQ5fDhHfDR8Vnw2fDQxXXwkOXw4SHw0fDFBXXwkOXw4SXw0fDFCfDZ8MUNdfCQ0fDFEfDl8OEp8Qnw4S3w2fDhLXXwkOXw4THw0fFp8Nnw0MnxCfDhNXXwkOXw4Tnw0fDEwfDZ8NDNdfCQ5fDhPfDR8MUV8NnwxRl18JDl8OFB8NHwxNHw2fDQ0XXwkOXw4UXw0fDE2fDZ8NDVdfCQ5fDhSfDR8MTd8Nnw0Nl18JDl8OFN8NHxWfDZ8NDddfCQ5fDhUfDR8MUddfCQ5fDhVfDR8MUhdfCQ5fDhWfDR8MUldfCQ0fDFEfDl8OFd8Qnw4WHw2fDhYXXwkOXw4WXw0fFp8Nnw0OHxCfDhaXXwkOXw5MHw0fDEwfDZ8NDldfCQ5fDkxfDR8MUp8NnwxS118JDl8OTJ8NHwxNHw2fDRBXXwkOXw5M3w0fDE2fDZ8NEJdfCQ5fDk0fDR8MTd8Nnw0Q11dfEN8QCQ5fDk1fER8NER8MUx8NEVdfCQ5fDk2fER8NEZ8MUx8NEddfCQ5fDk3fER8NEh8MUx8NEldfCQ5fDk4fER8NEp8MUx8NEtdfCQ5fDk5fER8NEx8MUx8NE1dfCQ5fDlBfER8NE58MUx8NE9dfCQ5fDlCfER8NFB8MUx8NFFdfCQ5fDlDfER8NFJ8MUx8NFNdfCQ5fDlEfER8NFR8MUx8NFVdfCQ5fDlFfER8NFZ8MUx8NFddXXwxTHxAJDl8OUZ8MUx8NFh8Qnw5R3xDfDRZXXwkOXw5SHwxTHw0WnxCfDlJfEN8NTBdfCQ5fDlKfDFMfDUxfEJ8OUt8Q3w1Ml18JDl8OUx8MUx8NTN8Qnw1NHxDfDU1XXwkOXw5TXwxTHw1NnxCfDlHfEN8NTddfCQ5fDlOfDFMfDU4fEJ8NTl8Q3w1QV18JDl8OU98MUx8NUJ8Qnw5S3xDfDVDXXwkOXw5UHwxTHw1RHxCfDVFfEN8NUZdXXwxTXwtMV0=

longer periods causes Errror "Error 756 Too long request string" for perma links.
So here is the data for a longer period:
metrics.txt

checking

ok, there are 2 things:
most of your fragments do not start with a Key Frame.
=> as a consequence, when switching between renditions (to level L, SN N), hls.js needs also to load frag level L, SN N-1 to be able to decode the first frames of frag level L, SN N
as it adds extra latency, upfront buffer becomes short, and the changes i did in ABR (taking into account upfront buffer to choose rendition) triggers a switch down to avoid a rebuffering (although bw is enough)

=> you should try to have your fragment starting with KF
=> i will try to disable the upfront buffer check in ABR for live streams (it might not be appropriate)

thank you for the quick support!
we will check the keyframe issue with our streaming department.

plz recheck against latest demo page with 2Mb/s bw throttling, it should not oscillate that much in case of frag not starting with KF

looks better now, thank you very much!

some metrics
metric.txt

looks better

most of your fragments do not start with a Key Frame.

This is due to the default mechanism used in Akamai stream packaging, which is deriving HLS from live RTMP input. The default enforces that the segments are of exactly equal length, following a strict requirement of the Apple app qualification process. I am not sure if this requirement is still valid, but it used to be for quite a while and there have been cases in which apps have been rejected because the segments did not have equal length. Forcing equal length on the packaging side in combination with the packages arriving from the encoder via RTMP can lead to fragments not starting with a Key Frame. As having a Key Frame at the beginning is not a strict requirement by Apple this makes sense as a default.

However, it is possible to change the packaging behaviour on Akamai's side to produce only segments that start with a key frame. Depending on the encoder input, this can lead to segments of slightly different length, though. To my understanding this option is currently being discussed with the client.

Was this page helpful?
0 / 5 - 0 ratings

Related issues

krsvital picture krsvital  路  3Comments

mmmmoj picture mmmmoj  路  3Comments

NicholasAsimov picture NicholasAsimov  路  3Comments

itsjamie picture itsjamie  路  3Comments

shalommeoded picture shalommeoded  路  3Comments