@johnBartos johnBartos released this Dec 22, 2018 · 6 commits to master since this release

Assets 12

Happy holidays, Hls.js-ers! Santa left a bit of coal under the WebVTT-tree; luckily, we managed to sweep it away before too many good developers noticed (we hope).


  • Fixed a bug where WebVTT did not show after a discontinuity #2056
  • Fixed a bug where WebVTT did not show when captions were enabled after a seek #2058. Thanks @mtoczko!

@hlsjs-ci hlsjs-ci released this Dec 12, 2018

Assets 12

New Features


  • Hls.js will now load VTT segments in sync with the corresponding media. This means that segments will load beginning at the playhead, and will only download up to the end of the buffer. Previous behaviour was to download and parse every VTT segment on start. #1882
  • Key load failures will now cause Hls.js to immediately downswitch to a new variant on failure, instead of retrying 3 times before switching. #1836


  • Ensure that streams are ended after the last fragment has buffered, even if has already been buffered. #2040
  • Remux according to the initial video PTS so that streams begin at 0. This may fix stalling in streams with very small segments. #2030
  • Fix missing alternate audio when the video codec is not specified in the manifest #1993
  • Fixed an exception using Set in browsers which do not natively support it. #1984
  • Restore response data in the load error events. #1977
  • Fix stalling in Chrome when an abort error happens after seeking. #1925
  • Fix playback of streams for which the segment URL looks like an mp4 fragment, but which are not mp4s. #1921
  • Fix exceptions caused by attempting to load embedded audio tracks found in a manifest. #1907
  • Fix parsing of segments which contain spaces in its URL. #1899
  • Reuse textTracks when the track order between manifests is different. #1869
  • Fix FRAG_CHANGED not firing on the first segment of the first level. #1872
  • Fix performance.now usage in workers. #1866

@hlsjs-ci hlsjs-ci released this Aug 14, 2018 · 185 commits to master since this release

Assets 12

Breaking Changes

  • The dist folder has been removed from master. dist assets are now included as an attachment to the release. This shouldn't affect those installing via npm; developers deploying locally will need to build it themselves. Developers wanting to run the demo locally will need to build the library first.

New Features

  • Added support for server-side rendered builds
  • Enabled Typescript support in the codebase
  • Automate release via Travis
  • Added a bunch of new logos. Thanks for your support!


  • Avoid fatal exception when the ABR controller sets up before the level has been loaded
  • Fixes custom JSON parsing in metadata tags by splitting the regex on the first found colon
  • Improve stall detection and resolution
  • Stop and cleanup level capping on MEDIA_DETACHING in order to avoid out-of-bound exceptions
  • Switch demo from HTTP to HTTPS to avoid mixed content errors
  • Clean up broken fragment-loader objects when errored or timed out
  • Fix PTS computation of AAC segments when the timestamp is 0
  • Fix a bunch of bugs related to stream synchronization via PROGRAM-DATE-TIME
  • Only select a default audio track when not previously set by the API
  • Reassign audio track IDs after filtering to avoid array index mismatches
  • Fix AAC demuxing of alternate audio tracks with different timestamps
  • Fix always-failing performance.now call
  • Ensure that initial FRAG_CHANGED event is fired if the bitrate test fragment is buffered

@tchakabam tchakabam released this Jun 16, 2018 · 221 commits to master since this release

Assets 2


FIXES IE11 exception in broken array-copy wrapper (error message: "Function.prototype.call: 'this' is not a Function object)

We attempted to use the recommended technique where available to do shallow copy operations on Array-like types (assuming Array.from where available would be better). All recent browsers are implementing the Array.from method, why we noticed this bug too late. The way we were calling Array.prototype.slice on IE11 was ineffective: our compatiblity-wrapper function was crafted in the wrong manner - as we have learned in a painful way.

See #1786

Our main take-away here is improving our CI acceptance testing in browser VMs, so we can have confident automated testing on IE11 as well, and notice such issues before we merge them :shipit:

Also, we have now actually acknowledged that slice is usually more performant, which might be because of Array.from supporting a more wide range of parameters: https://jsperf.com/array-from-vs-array-prototype-slice

@tchakabam tchakabam released this Jun 14, 2018

Assets 2

IE11: ⚠️ This release has an issue with IE11 which has been addressed in v0.10.1. Please use that version instead if it concerns you.


Many stability and efficiency fixes. Also, a lot of work done around subtitles.

Also: Improved alternate audio-track support, proper support for backup audio/video-track fallback behavior by media-group-IDs (so that e.g the same-level video-stream of the new group ID will be used in case of audio-fallback and vice-versa), support for various mp4 suffixes, no more unnecessary buffer-stall errors, and a few more things.


While we didn't want to hold back on releasing the current stable state, issues related to gaps at start, seeking into gaps, and buffer-stall errors on seeking are still present in this release (regression from 0.8.x). We are planning to address them with the necessary time, as this requires a clean solution in order to avoid another regression in the area. We are hoping to release 0.10.1 asap with a fix for them:


API changes


  • Fixed undefined vars assumed by linter as DOM globals (no more linter globals)

  • Fix memory leak in destruction of TaskLoop sub-classes

  • Remove playbackRate factor for setting lastCurrentTime

  • Fixed FragmentTracker causing endless loading

  • Fix RemuxerTrackIdConfig as per iso/iec 14496-12 spec

  • Fall back to frag finding by SN if PDT search does not return a good fragment

  • Resolve partial frag loop loading

  • Activate level capping only when a video codec is found

  • Change example to use 'loadedmetadata' event rather than 'canplay' event

  • Fragment loading stuck issues resolved

  • TaskLoop: Clear timer when already set


  • Add a regex to check different mp4 suffix

  • Prevent excessive bufferStall errors through a 1 second debounce on reporting stalls

  • Refactor checkbuffer

  • Various subtitle bugfixes

  • Refactor timeline-controller to refer to 608/708 captions via name instead of number

  • Properly calculate the amount of sourcebuffers needed for streams with multiple non-alternate audio renditions

  • Redundant streams fallback behavior (backup) for alternate renditions with multiple media groups

dev-tooling / CI / releases

  • Use Array.from instead of Array.prototype.slice.call (where available)

  • Canary releases

  • Add ability to load demo page with canary build

  • unit test source-maps

  • Make MP4 inspect CLI tool

  • fix(deps): update to esdoc@1.1.0

  • Dissolve "helper" folder and towards more self-contained components

  • Demo config parameters serialized B64/JSON

  • Curly brace ESLint rule changes

  • Update PR template

  • Add limitMetrics option for demo page to limit the total number of metric entries per class

  • add package-lock.json

  • Remove old & insecure (404) favicons in demo HTML pages


  • Fix stream var not defined in top scope

  • Browser tests setup: Replace deprecated method by setTimeouts

  • Fixed chrome not autoplaying when performing functional tests


  • Fix Getting Started Documentation

  • fixed typo

  • correct fragLoadingTimeout doc according to config

demo link


@mangui mangui released this Mar 27, 2018 · 418 commits to master since this release

Assets 2


  • Emit 'loadError' instead of 'loadTimeout' when playlist request retries exhaust #1622
  • playlist-loader: correctly detect playlist type in case of empty chunk list #1607
  • [REGRESSION] Simple Live Streams no longer play; works in 0.8.9 #1624 #1626

demo link


@mangui mangui released this Mar 22, 2018 · 427 commits to master since this release

Assets 2


This new release should now support HLS/fMP4 Widevine encrypted content


  • RemuxVideo method called with incorrect number of parameters; accurateTimeOffset is lost #1513
  • Remove PKCS7 padding in AESDecryptor #1447
  • does not support MPEGTS and fMP4 segments in the same HLS stream #1510
  • loader.abort is not a function #1517 #1523
  • Update audio-stream-controller to respect maxMaxBufferLength. #1524
  • Player stop playing and loading after second seek #1469
  • fix monitor playback progress on StreamController #1547
  • ensure Hidden subtitles on hidden TextTrack #1527
  • Get right language code from config like 'Label' parameter #1552 #1553
  • Fixes handling network error on loading chunklist + Exception on Object.keys in FragmentTracker #1585
  • Testbench: Fix missing argument in switchToHighestLevel function #1593
  • Fix text track change edge cases #1582
  • avoid repeated request for init segment on live fmp4 playlist and fix regression introduced by FragmentTracker #1611

functional improvements

  • DRM / EME - Widevine - Support for Shaka-packager fMP4 Widevine content #1442
  • Add Fragment Tracker #1466
  • Improve StreamController#_checkAppendedParsed performance #1528
  • PDT switch for EXT-X-DISCONTINUITY manifests #1455 #1601

non-functional improvements

  • Webpack bundle analyzer plugin #1465
  • Move to eslint with idempotent configuration & ensure lint in CI #1475
  • Improve the demo page #1476 #1498
  • Decoder unit tests added #1507
  • test: add BufferHelper tests #1525
  • Add StreamController unit tests #1538
  • Auto generated docs + full Hls.js API jsdoc info #1540
  • add level controller unit test, update eme controller unit test #1575
  • functional test / smooth switch : use currentTime instead of readyState as test condition #1608
  • fix(travis): introduce build stage #1574
  • refactor StreamController and FragmentTracker logics #1545

API change


demo link


@mangui mangui released this Dec 19, 2017 · 878 commits to master since this release

Assets 2


  • Video playback doesn't start #1464
  • mp4-remuxer.remuxAudio Uncaught TypeError #1462
  • mp4-remuxer: don't filter audio frame with pts=0, fix regression introduced in v0.8.8, that might affect playback on OS X 10.11/10.12


  • Improve Media Zigzagging #1459

demo link


@mangui mangui released this Dec 6, 2017 · 890 commits to master since this release

Assets 2


  • fix nextAutoLevel blocking when fragment aborted #1427
  • Fix mpeg audio frame duration #1430 #1356
  • Uncaught DOMException: Failed to read the 'buffered' property from 'SourceBuffer' #971
  • Don't reset media source if replaced by 3rd party #1443
  • [IE11] After seeking back and forth when Clicking Replay the video is not playing again #1444
  • Garbling audio with hls.js but not (or much less) with VLC and macOS Safari #1453 #1334
  • Audio glitch at the end of first segment/start of the second #1419


  • Add Live Duration Infinity config parameter #1451 #1371
  • Move isSupported method to module #1454
  • Add Level Manifest recovery #1452

demo link