Releases: video-dev/hls.js
Release list
v1.7.0
Summary
HLS.js v1.7.0 adds I-frame playlist support, improved playback of protected content, and CMCD v2 for standardized streaming analytics. It also delivers smoother audio-track switching, faster startup through parallel init-segment loading, and fixes across Low-Latency HLS, subtitles, interstitials, and live streaming.
Highlights to try in this release:
- I-frame playback — call
hls.createIFramePlayer()andloadMediaAt(time)to render frames from a stream's#EXT-X-I-FRAME-STREAM-INFvariants in a video element, or load an#EXT-X-I-FRAMES-ONLYmedia playlist directly. - Smoother audio switching — set
hls.nextAudioTrack(or pass{ flushImmediate: true }tosetAudioOptionfor an immediate one) to schedule a seamless audio-rendition change that avoids stalls and added live latency. - CMCD v2 — set
cmcd.version: 2to enable it, and configurecmcd.eventTargetsto send standardized event reports to an external analytics endpoint. Not all CMCD v2 events, fields, and HLS.js features are supported as of this release. - Faster startup — alternate audio and video init segments now load in parallel; try a stream with separate audio/video renditions.
- Improved support for looped video — a new
loopBackBufferFlushconfig option flushes the lower-quality back buffer on looped streams. - Tune level selection —
abrSwitchIntervalthrottles automatic quality switches, anderrorPenaltyExpireMslets a level penalized by a load error be re-elected instead of being avoided for the rest of the session. - Stop loading stale live streams — set
liveMaxUnchangedPlaylistRefreshto error out withPLAYLIST_UNCHANGED_ERRORafter a set number of unchanged playlist reloads instead of polling a dead playlist indefinitely. - Recover from broken appends — on live and VOD alike,
appendTimeoutbounds aSourceBufferappend that never completes, whileMEDIA_SOURCE_REQUIRES_RESETandBUFFER_APPEND_NO_PROGRESSreport a MediaSource that has to be reset and fragments that append without ever buffering.
Demo page
https://073606d7.hls-js-dev.pages.dev/demo/
Breaking changes
No public exports were removed and no runtime behavior changes are required to upgrade from v1.6 to v1.7. TypeScript consumers might see new compile errors where previously loose types have been narrowed. Each is listed with upgrade guidance in the migration guide:
https://github.com/video-dev/hls.js/blob/v1.7.0/MIGRATING.md#migrating-from-hlsjs-16-to-17
Some exported type dependencies ("eventemitter3", "@svta/cml-cmcd", "@svta/cml-utils", "@svta/cml-structured-field-values") have not been bundled with hls.d.ts. This will be addressed in an upcoming patch.
Changes since the last release
v1.6.18...v1.7.0, v1.7.0-rc.3...v1.7.0
Features
- HLS I-frame playlist support
#EXT-X-I-FRAME-STREAM-INFand#EXT-X-I-FRAMES-ONLY(#7757, #7791) @robwalch- Optimize I-frame parsing (#7794)
- "mjpg" image I-frame support (#7862)
- Parse I-frame multivariant tags that end at EOF without a trailing newline (#7851) @rudemateo
- Play single-keyframe fMP4 segments and parse
tfhddefault_sample_sizecorrectly (#7884) @rudemateo - Support remuxing of encrypted I-frame segments, including AES decryption of byte-range requests (#7896, #7892) @robwalch
- Force rendering of requested I-frames (#7934) @robwalch
- Fix I-frame trick-play rendering of stretched and backward-loaded frames (#7930) @rudemateo
- Support muxed audio+video fMP4 and multi-trun I-frame fragments (#7940) @rudemateo
- Consolidate the I-frame remux code into one function (#7945) @robwalch
- CMCD v2
- Upgrade Common Media Client Data reporting to the CMCD v2 specification (#7725) @littlespex
- Custom events, custom keys, and
ec(#7887) @cotid-qualabs - Implement rtp, lb, dl, pb, tpb, ttfb, and ttlb (#7895) @cotid-qualabs
- Smooth audio track switching
New API, error details, and config options
Nothing below is required to upgrade. Every addition is opt-in. Each entry links to its v1.7.0 API documentation.
Config options
abrSwitchInterval(0) minimum seconds between automatic ABR switchesappendTimeout(Infinity) milliseconds before anappendBuffer()operation is treated as timed outemsgKLVSchemaUri(undefined) URN matched when extracting MISB KLV metadata from CMAFemsgboxes, defaulting tourn:misb:KLV:bin:1910.1errorPenaltyExpireMs(0) milliseconds after which a level penalized for a load error can be re-electedhandleMpegTsVideoIntegrityErrors('process'or'skip') how corrupt MPEG-TS video is handlediframeCacheLimit(2 * 1024 * 1024) bytes of I-frame data retained by I-frame player instancesliveMaxUnchangedPlaylistRefresh(Infinity, minimum2) unchanged live reloads beforePLAYLIST_UNCHANGED_ERRORloopBackBufferFlush(undefined) flush the lower-quality back buffer on an upswitch whenmedia.loopistruenextAudioTrackBufferFlushForwardOffset(0.25) forward audio buffer retained on a scheduled audio switchskipBufferHolePadding(0.1) padding added to the buffer-hole skip targetloggerId(undefined) prefixes debug logs for anHlsinstance (assetPlayerIdstill fills in for it)cmcdsub-options for CMCD v2:version(1or2),eventTargets(v2 event report endpoints),rtpSafetyFactor(5),loader, andreporterCallback(receives aCmcdCustomReporterforupdateCustomData()andrecordCustomEvent()).includeKeysis retyped fromstring[]toCmcdKey[]- Controller overrides that can be replaced or disabled:
streamController,gapController,latencyController,id3TrackController, andiframeController
DRM callback arguments
drmSystems[KEY-SYSTEM].generateRequestreceiveskeyContext & { decryptdata: LevelKey, reason: LicenseRequestReason }and returnsGenerateRequestFilterResultlicenseXhrSetupandlicenseResponseCallbackreceivekeyContext & { decryptdata: LevelKey }, andlicenseXhrSetupcan now return or resolve astringas well as aUint8Array
Methods
hls.createIFramePlayer(configOverride?)returnsHlsIFramesOnly | null, a player that renders#EXT-X-I-FRAME-STREAM-INFvariants in a video elementhls.createImageIFramePlayer(configOverride?)returnsHlsImageIFramesOnly | null, a player for"mjpg"image I-frame variantsiframePlayer.loadMediaAt(time, options?)loads, appends, and seeks to the I-frame attime(optionsisPartial<LoadMediaAtOptions>)imagePlayer.attachImage(image)andimagePlayer.detachImage()attach or detach theHTMLImageElementused for renderinghls.setAudioOption(option, flushImmediate?)takes an optional second argument to switch immediately rather than on schedule
Getters and setters
hls.iframeVariantsgetLevelParsed[]of the multivariant playlist's I-frame variantshls.audioForwardBufferInfogetBufferInfo | nullfor the alternate audio bufferhls.nextAudioTrackget and set thenumberindex of the audio track scheduled for a seamless switch
Error details
This release adds three Hls.ErrorDetails members and no new Hls.Events members.
PLAYLIST_UNCHANGED_ERROR(NETWORK_ERROR, non-fatal) a live playlist hitliveMaxUnchangedPlaylistRefreshconsecutive unchanged reloadsBUFFER_APPEND_NO_PROGRESS(MEDIA_ERROR, non-fatal) an append cycle completed without increasing the fragment's buffered coverage, and addsappendsWithoutProgresstoErrorData- `MEDIA_SOURCE_REQUIRES...
v1.6.18
Summary
HLS.js v1.6.18 includes bug fixes previously scheduled to land in v1.7.
Changes Since The Last Release
- Bind initPTS to the lowest DTS across tracks to prevent negative timestamps
(Cherry-picked from 45a1576 of #7880 and #7700 - Fixes #7932) @robwalch
Demo Page
https://12b4538a.hls-js-dev.pages.dev/demo/
Feedback
Please provide feedback via Issues in GitHub. For more details on how to contribute to HLS.js, see our CONTRIBUTING guide.
v1.7.0-rc.3
Summary
HLS.js v1.7.0-rc.3 includes bug fixes and improvements over the last pre-release.
Changes Since The Last Release
- Update README supported features (#7953) @robwalch
- Defer playlist reload while network is offline (#7926)
- Fix "discontinuity sequence mismatch" for fragment hint with no parts (#7964)
- Prevent loop loading for SourceBuffer mismatch append errors (#7965)
- Fixed v1.7 dev regressions:
- Migrate CI to Sauce Connect 5 (#7957) @itsjamie
- Improve CEA-608 performance for low powered devices (#7949)
- Improve tsdemuxer performance (#7955)
- Improve mp4 box parsing performance (#7956)
Previous 1.7 Release Notes
A complete list of 1.6 to 1.7 changes will be included in the v1.7.0 release. For now, please consult the earlier pre-release notes:
https://github.com/video-dev/hls.js/releases/tag/v1.7.0-rc.2
https://github.com/video-dev/hls.js/releases/tag/v1.7.0-rc.1
https://github.com/video-dev/hls.js/releases/tag/v1.7.0-beta.2
https://github.com/video-dev/hls.js/releases/tag/v1.7.0-beta.1
Demo Page
https://7d50c871.hls-js-dev.pages.dev/demo/
API and Breaking Changes
No public exports were removed and no runtime behavior changes are required to upgrade from v1.6 to v1.7. A list of changes impacting TypeScript consumers have been added to the migration guide:
https://github.com/video-dev/hls.js/blob/v1.7.0-rc.3/MIGRATING.md#migrating-from-hlsjs-16-to-17
Feedback
Please provide feedback via Issues in GitHub. For more details on how to contribute to HLS.js, see our CONTRIBUTING guide.
v1.6.17
Summary
HLS.js v1.6.17 includes bug fixes previously scheduled to land in v1.7.
Changes Since The Last Release
- Fixed PTS rollover condition causing segment 0 loop (#7752) @christriants
- Fixed mapPartIntersection loop bounds (#7859) @sugarzyc
- Fixed initial reload time of live media playlist loaded with
hls.loadSource()(#7875) @robwalch - Fixed "discontinuity sequence mismatch" for fragment hint with no parts (#7964)
Demo Page
https://e5f5c274.hls-js-dev.pages.dev/demo/
Feedback
Please provide feedback via Issues in GitHub. For more details on how to contribute to HLS.js, see our CONTRIBUTING guide.
v1.7.0-rc.2
Summary
HLS.js release candidate v1.7.0-rc.2 includes bug fixes and improvements over the last pre-release.
Changes Since The Last Release
API Enhancements
- Mark fragments as gaps after repeated appends without buffered range growth (#7941) @rudemateo
- Introduces
ErrorDetails.BUFFER_APPEND_NO_PROGRESS(newErrorTypes.MEDIA_ERRORtype error event) - Adds
chunkMeta: ChunkMetadatatoFragBufferedDataandFragParsedDatapayloads
- Introduces
Bug fixes
I-Frame support
- Support muxed audio+video fMP4 and multi-trun I-Frame fragments (#7940) @rudemateo
- Consolidated the I-Frame remux code into one function (#7945) @robwalch
Interstitials
Startup and teardown
- Fix selection with small samples (#7939) @robwalch
- Guard abandon-rules check after destroy (#7938) @AmPlace
Demo Page
https://71861d99.hls-js-dev.pages.dev/demo/
Feedback
Please provide feedback via Issues in GitHub. For more details on how to contribute to HLS.js, see our CONTRIBUTING guide.
v1.7.0-rc.1
Summary
HLS.js release candidate v1.7.0-rc.1 includes bug fixes and improvements over the previous beta.
Demo page
https://0f9f490e.hls-js-dev.pages.dev/demo/
Changes since the last release
Features & Enhancements
- CMCDv2 Support: implement rtp, lb, dl, pb, tpb, ttfb and ttlb (#7895) @cotid-qualabs
Bug fixes
I-Frame support
- Fixed I-Frame trick play rendering of stretched and backward-loaded frames (#7930) @rudemateo
- Force rendering of requested I-Frames and prevent loading of following segments (#7934) @robwalch
Interstitials
Documentation
Feedback
Please provide feedback via Issues in GitHub. For more details on how to contribute to HLS.js, see our CONTRIBUTING guide.
v1.7.0-beta.2
Summary
HLS.js v1.7.0-beta.2 includes bug fixes and improvements over the last beta release.
Demo Page
https://e29be494.hls-js-dev.pages.dev/demo/
Changes Since The Last Release
Features & Enhancements
- CMCDv2 Support: custom events, custom keys and
ec(#7887) @cotid-qualabs
Bug fixes
- Support
EXT-X-MEDIA-SEQUENCEdeclaration afterEXT-X-SKIP(#7905) @hongjun-bae - Treat un-demuxable fragments as a gap to prevent infinite reloading (#7900)
Interstitials
- Fix Low-Latency Live join with interstitial preroll (
PRE,ONCE) (#7908) @robwalch - Fix Live Interstitial midroll buffering and playback (#7913)
Low-Latency HLS
I-Frame support
- Fix remuxing of encrypted I-Frame segments (#7896) @robwalch
- Fix AES byte-range addressed I-Frame decryption (#7892)
Regressions in dev / v1.7.0-beta.1
- Fix subtitle buffering up to or past media buffer (#7921) @robwalch
- Fix fatal KEY_SYSTEM_ERROR handling (#7920)
- Fix
autoStartLoad:falseand deferredstartPosition(#7903) - Fix uncaught init segment abort errors (#7904)
Build and CI
For the complete list of v1.7 changes, on top of those above, see the beta.1 release notes:
https://github.com/video-dev/hls.js/releases/tag/v1.7.0-beta.1
Feedback
Please provide feedback via Issues in GitHub. For more details on how to contribute to HLS.js, see our CONTRIBUTING guide.
v1.7.0-beta.1
Summary
HLS.js v1.7.0 adds I-frame playlist support, improved playback of protected content, and CMCD v2 for standardized streaming analytics. It also delivers smoother audio-track switching, faster startup via parallel init-segment loading, and broad fixes across Low-Latency HLS, subtitles, interstitials, and live streaming.
Highlights to try in this release:
- I-frame playback — call
hls.createIFramePlayer()andloadMediaAt(time)to render frames from a stream's#EXT-X-I-FRAME-STREAM-INFvariants in a video element, or load an#EXT-X-I-FRAMES-ONLYmedia playlist directly. - Smoother audio switching — set
hls.nextAudioTrack(or passflushImmediatetosetAudioOption) to schedule a seamless audio-rendition change that avoids stalls and added live latency. - CMCD v2 — set
cmcd.version: 2to enable it, and configurecmcd.eventTargetsto send standardized event reports to an external analytics endpoint. - Faster startup — alternate audio and video init segments now load in parallel; try a stream with separate audio/video renditions.
- Tune live resilience — new
errorPenaltyExpireMs,abrSwitchInterval, andappendTimeoutconfig options, plus thePLAYLIST_UNCHANGED_ERRORandMEDIA_SOURCE_REQUIRES_RESETevents. - Improved support for looped video — new
loopBackBufferFlushconfig option flushes the back-buffer of lower quality on looped streams
Changes Since The Last Release
Features
- HLS I-FRAME playlist support —
#EXT-X-I-FRAME-STREAM-INFand#EXT-X-I-FRAMES-ONLY(#7757, #7791) @robwalch- Optimized I-frame parsing (#7794)
- "mjpg" image I-frame support (#7862)
- Parse I-frame multivariant tags that end at EOF without a trailing newline (#7851) @rudemateo
- Play single-keyframe fMP4 segments and parse
tfhddefault_sample_sizecorrectly (#7884) @rudemateo
- CMCD v2 — upgrade Common Media Client Data reporting to the CMCD v2 specification (#7725) @littlespex
- Smooth audio track switching via the
hls.nextAudioTrackAPI (#7575) @krseager
New API, events & config options
hls.iframeVariants,hls.createIFramePlayer()→HlsIFramesOnly.loadMediaAt(time): render frames from a stream's#EXT-X-I-FRAME-STREAM-INFvariants in a video element (#7757, #7791) @robwalchhls.createImageIFramePlayer()→HlsImageIFramesOnly.attachImage(image): render "mjpg" image I-frame variants (#7862) @robwalchiframeCacheLimitconfig option (default 2 MB) : cap I-frame data cached for rendering
hls.nextAudioTrackgetter/setter : Smooth audio switching (#7575) @krseagernextAudioTrackBufferFlushForwardOffsetconfig option (default 0.25) : forward buffer retained when scheduling a seamless switch
- Add optional
flushImmediateargument tohls.setAudioOption(#7795) @krseager hls.audioForwardBufferInfogetter : get audio-specific forward buffer info (#7865) @robwalchPLAYLIST_UNCHANGED_ERRORevent : Max Unchanged Live Updates (#7704) @dzianis-dashkevichliveMaxUnchangedPlaylistRefreshconfig option (default Infinity) : unchanged live refreshes allowed before the error fires
MEDIA_SOURCE_REQUIRES_RESETerror event : MediaSource closed while attached or ended on append error (#7699) @christriants- Started with: Track "sourceended" event and handle ManagedMediaSource recovery (#7697) @zalishchuk
- Additional work (#7702, #7707) @robwalch
- Only emit
FRAG_PARSING_USERDATAwhen text samples are found (#7686) @XephyrKenny - Add
subtitleTrackandclosedCaptionsproperties toCUES_PARSEDevent (#7843) @robwalch cmcd.versionandcmcd.eventTargetsconfig (pluscmcd.includeKeysand a customcmcd.loader) : enable CMCD v2 and report events to an external analytics endpoint (#7725) @littlespexabrSwitchIntervalconfig option (#7669) @christriantsappendTimeoutconfig option : SourceBuffer append operation timeout handling (#7670) @dzianis-dashkevicherrorPenaltyExpireMsconfig option : Re-elect penalized level after configurable penalty expiry (#7771) @Harshit661000- Add
xhrSetupcontext arg and loader context types (#7831 @robwalch, #7762 @dzianis-dashkevich) loopBackBufferFlushconfig option : flush the back-buffer on looped streams (#7869) @dzianis-dashkevichhandleMpegTsVideoIntegrityErrorsconfig option ('process'|'skip') : how to handle corrupt MPEG-TS video (#7094) @mstyuraemsgKLVSchemaUriconfig option (defaulturn:misb:KLV:bin:1910.1) : schema URI for MISB KLVemsgmetadata (#7668) @jacorbelloskipBufferHolePaddingconfig option (default 0.1) : padding applied when skipping buffer holes/gaps (#7630) @krseager
Enhancements
Content protection (DRM)
- DRM and multi-key handling improvements for improved protected playback (#7517) @robwalch
- Resolve usable keys from the latest key session before requesting another, and resolve
setMediaKeysonce attached (#7879, #7615) @robwalch - Parse the Widevine key id from the
EXT-X-KEYPSSH (andencryptedevent initData) whenKEYIDis absent (#7775, #7415) @robwalch @yajin2021 - Support playback of elementary (containerless) audio encrypted with Sample-AES (#7479) @Yesterday17
- Load the key for the fragment of a selected LL-HLS part so encrypted parts decrypt correctly (#7874) @robwalch
Audio switching, live & buffering
- Smooth audio track switching (#7575) @krseager
- Error and stop streaming after max unchanged live updates (#7704) @dzianis-dashkevich
- Download init segments in parallel for a faster start (#7867) @krseager
- Flush the back-buffer for looped streams (#7869) @dzianis-dashkevich
- Improve audio/video append synchronization (#7842) @robwalch
- Avoid an audio buffer flush on the first track switch (#7696)
- Reach the "ended" state reliably when a playlist ends with empty or gap segments (#7609)
- Better playlist alignment when PDT is inconsistent across renditions (#7482)
Timed metadata & track management
- Extract MISB KLV timed metadata from MPEG-TS and CMAF streams (#7668) @jacorbello, including when audio is present (#7673) @jacorbello
- Allow removing TextTracks that hls.js created (#7515) @xxoo
- (Uses removable DOM
<track>elements overHTMLMediaElement.addTextTrack()which does not allow removal)
- (Uses removable DOM
Networking & resilience
- fetch-loader retry logic for transient network failures (#7756) @dzianis-dashkevich
- Verify byte-range responses and warn on a size mismatch (#7701) @robwalch
- Detect corrupt MPEG-TS video streams (#7094) @mstyura
Performance, memory & lifecycle
- Cap the selected level to the player size with
ResizeObserver, and makenextLevelSwitchmore responsive (#7108) @robwalch - Clear the resolved fragment/part URL cache when done to reduce memory use (#7731)
- More reliable transmuxer teardown on
destroy()(#7863) - Keep inherited logger methods intact on
destroy()(#7864) - Improve M2TS init-segment handling and append-queue logging (#7695)
- Remove dead code and some unused exports for a smaller bundle (#7882)
Bug fixes
Playback start, seeking & timestamps
- Fix backward seeking that led to stalling or elevated buffering (#7577) @krseager
- Fix certain Tizen devices getting stuck seeking over buffer gaps (#7630) @krseager
- Fix an endless loop in the gap controller on bad streams (zero-duration segments) (#7661) @robwalch
- Restore playback after page restoration from bfcache in Safari (#7683) @christriants
- Restart loading from
recoverMediaError()whenautoStartLoadis disabled (#7693) @robwalch - Roll initPTS forward when needed by earlier segments (#7537) @robwalch
- Correct a
computeInitPtsrollover that caused a segment-0 loop (#7752) @christriants - Adjust initPTS when a level switch drops the opening GoP (#7700) @robwalch
- Do not update initPTS on small drift caused by playlist segment-duration rounding (#7792) @robwalch
Rendering & codecs
- Work around Chrome silently evicting coded frames on PTS overlap (#7807) @robwalch
- Pad the initial PTS of remuxed MPEG-TS to avoid Chrome rendering glitches (#7805) @robwalch
- Drop bad MP4 data instead of failing the append (#7815) @robwalch
- HEVC: set sync samples from IRAP VCL NALs (#7861) @gemxx
- HEVC: correct access-unit sample boundaries in Safari (#7854) @gemxx
- Switch away from containerless EC-3 audio that hls.js cannot demux (Safari) instead of stalling (#7873) @robwalch
- Handle implicit HE-AAC for AAC Main at low sample rates (#7835) @robwalch
Audio tracks
- Fix switching back to main (audio-only) after end-of-stream is buffered (#7645) @robwalch
- Fix AES-128 decryption failure on alternate audio when a shared key load is pending (#7834) @robwalch
- Fix audio TS segment duration calculation (#7646) @robwalch
- Stop
AUDIO_TRACK_LOAD_TIMEOUTfrom following theerrorRetrypolicy inplaylistLoadPolicy(#7506) @CongCong-1228
Content protection (DRM)
- Fix PlayReady on some devices (#7631) @KunXi-Fox
- Fix PlayReady key endianness (#7510) @ShubhamSharma2311
- Fix an eme-controller type error that depended on promise state (#7877) @bwallberg
- Fix
licenseXhrSetupreturn types and aselectKeySystemnested-Promise anti-pattern (#7888) @robwalch
Subtitles & captions
- Decrypt LL-HLS VTT AES parts per-part (#7881) @hongjun-bae
- Fix Low-Latency HLS VTT subtitle part loading (#7626) @robwalch
- Align WebVTT segments missing an
X-TIMESTAMP-MAPheader with the media timeline (#7852) @robwalch - Fix WebVTT loading by disabling progressive loading for WebVTT (#7649) @krseager
- Cache initial cues added to a TextTrack so the browser does not remove them (#7809) @robwalch
- Fix CEA-608 cursor clamping so position stays within the column array bounds (#7666) @chelleccarlyle
**Live, interstitials & ...
v1.6.16
Summary
HLS.js v1.6.16 includes bug fixes and improvements over the last release.
Changes Since The Last Release
- Fix Interstitials live start with short sliding window (#7799)
- Limit buffering while paused outside live sliding window (#7788)
Demo Page
https://121bff6b.hls-js-dev.pages.dev/demo/
Feedback
Please provide feedback via Issues in GitHub. For more details on how to contribute to HLS.js, see our CONTRIBUTING guide.
v1.7.0-alpha.1
Summary
HLS.js v1.7.0-alpha.1 is a pre-release marking a number of significant changes since the last v.16.x patch (all "v1.16.16-canary releases since v1.7.0-alpha.0 should have been versioned as 1.7 canary). This is not a feature-complete release. See the v1.7.0 milestone page and planning board for more info.
Changes Since The Last Release
v1.7.0-alpha.0...v1.7.0-alpha.1
API additions
hls.nextAudioTrackgetter/setter : Smooth audio switching (#7575) @krseagerPLAYLIST_UNCHANGED_ERRORevent : Max Unchanged Live Updates (#7704) @dzianis-dashkevichMEDIA_SOURCE_REQUIRES_RESETerror event (MediaSource closed while attached or ended on append error) (#7699) @christriants- Started with: Track "sourceended" event and handle ManagedMediaSource recovery (#7697) @zalishchuk*
- Additional work (#7702, #7707) @robwalch
- Only emit
FRAG_PARSING_USERDATAwhen text samples are found (#7686) @XephyrKenny abrSwitchIntervalconfig option (#7669) @christriantsappendTimeoutconfig option : append operation timeout handling (#7670) @dzianis-dashkevich
Enhancements
- Implemented smooth audio switching (#7575) @krseager
- Max Unchanged Live Updates (#7704) @dzianis-dashkevich
- Support playback for elementary audio stream encrypted using Sample-AES (#7479) @Yesterday17
- DRM and Multi-key handling improvements (#7517) @robwalch
ResolvesetMediaKeysonly once media is attached (#7615) - Verify byte-range responses (#7701)
- Improve playlist alignment when PDT across playlists is inconsistent (#7482)
- Clear Fragment and Part resolved url cache (#7731)
- Prevent audio buffer flush on first track switch (#7696)
- Append queue logging and M2TS init segment handling (#7695)
- Resolve end-of-stream (for "ended" event) with empty or gap segments at end of playlist (#7609)
- Add SourceBuffer append operation timeout handling (#7670) @dzianis-dashkevich
- Check integrity of MPEG-TS video stream. (#7094) @mstyura
- feat: Add MISB KLV metadata extraction from MPEG-TS and CMAF streams (#7668) @jacorbello
- Allow KLV parsing when audio is available (follow up to #7668) (#7673) @jacorbello
Bug fixes
- fix: handle page restoration from bfcache in Safari (#7683) @christriants
- fixed issue with seeking backward leading to stalling OR elevated buffering (#7577) @krseager
- fix: cea608 parser make sure pos is within bounds of chars array which has size of NR_COLS (#7666) @chelleccarlyle
- Fix WebVTT loading issue when progressive is enabled by disabling progressive loading for WebVTT (#7649) @krseager
- Fixed issue where certain Tizen devices would get stuck seeking over buffer gaps (#7630) @krseager
- Fix issue where some devices not works with PlayReady (#7631) @KunXi-Fox
- Fixed exception in interstitial-controller on legacy platforms where media.play() does not return a Promise (#7586) @malickyeu
- Fix Pathway Cloning PARAMS applied after PER-VARIANT-URIS (#7710) @robwalch
- Fixed Content Steering URI-REPLACEMENT: HOST applies to the Hostname, (#7655)
- Adjust initPTS when switching results in dropped GoP at start (#7700)
- Fix Low-Latency HLS VTT subtitle part loading (#7626)
- Restart loading in
recoverMediaErrorwhenautoStartLoadis disabled (#7693) - Fix endless while loop in gap controller with bad streams (#7661)
- Fix fallback to primary on live start (#7651)
- Do not reset interstitial when seeking between assets (#7650)
- Fix switching back to main audio(-only) after end-of-stream buffered (#7645)
Build and CI
- fix(build-config): correct interstitial env vars and content-steering condition (#7727) @zalishchuk
- Update Chrome configuration for macOS in build.yml (#7698, #7698) @robwalch
- Increase minimum Windows test version for saucelabs (#7602) @robwalch
Documentation and README
- Create SECURITY.md (#7685) @pr4v33n7-sa
- Fix links for API Docs in README (#7637) @daniemo2
- Add Labra-Flex to 'They use HLS.js in production!' section (#7419) @aaskaoui
- Updated documentation (#7628) @krseager
Demo Page
https://a24cf9ae.hls-js-dev.pages.dev/demo/
Feedback
Please provide feedback via Issues in GitHub. For more details on how to contribute to HLS.js, see our CONTRIBUTING guide.