UNPKG

@playkit-js/playkit-js-hls

Version:

[![Build Status](https://github.com/kaltura/playkit-js-hls/actions/workflows/run_canary_full_flow.yaml/badge.svg)](https://github.com/kaltura/playkit-js-hls/actions/workflows/run_canary_full_flow.yaml) [![code style: prettier](https://img.shields.io/badge

482 lines (477 loc) 14.8 kB
import { AudioTrack } from '@playkit-js/playkit-js'; import { BaseMediaSourceAdapter } from '@playkit-js/playkit-js'; import { ILogger } from 'js-logger'; import { IMediaSourceAdapter } from '@playkit-js/playkit-js'; import { PKABRRestrictionObject } from '@playkit-js/playkit-js'; import { PKMediaSourceObject } from '@playkit-js/playkit-js'; import { TextTrack as TextTrack_2 } from '@playkit-js/playkit-js'; import { VideoTrack } from '@playkit-js/playkit-js'; /** * Adapter of hls.js lib for hls content. * @classdesc */ declare class HlsAdapter extends BaseMediaSourceAdapter { /** * The id of the adapter. * @member {string} id * @static * @private */ static id: string; /** * The adapter logger. * @member {any} _logger * @static * @private */ protected static _logger: ILogger; /** * The supported mime types by the hls adapter. * @member {Array<string>} _hlsMimeType * @static * @private */ private static _hlsMimeTypes; /** * The Hls lib * @type {any} * @private */ private _hlsjsLib; /** * The hls player instance. * @member {any} _hls * @private */ private _hls; /** * Last recover date from decoding error * @type {number} * @private */ private _recoverDecodingErrorDate; /** * Last recover date from audio swap codec operation * @type {number} * @private */ private _recoverSwapAudioCodecDate; /** * Indicates if external redirect was performed * @type {boolean} * @private */ private _triedReloadWithRedirect; /** * The _loadPromise handlers * @member {{resolve: (result: Promise<R> | R) => void, reject: (error: any) => void}} - _loadPromiseHandlers * @type {{resolve: (result: Promise<R> | R) => void, reject: (error: any) => void}} * @private */ private _loadPromiseHandlers; /** * Reference to the player tracks. * @member {Array<Track>} - _playerTracks * @type {Array<Track>} * @private */ private _playerTracks; /** * Stream start time in seconds * @type {?number} * @private */ private _startTime; /** * Reference to _onRecoveredCallback function * @member {?Function} - _onRecoveredCallback * @type {?Function} * @private */ private _onRecoveredCallback; private _onMediaAttached; private _mediaAttachedPromise; private _requestFilterError; private _responseFilterError; private _nativeTextTracksMap; private _lastLoadedFragSN; private _sameFragSNLoadedCount; private _waitForSubtitleLoad; /** * an object containing all the events we bind and unbind to. * @member {Object} - _adapterEventsBindings * @type {Object} * @private */ private _adapterEventsBindings; /** * Factory method to create media source adapter. * @function createAdapter * @param {HTMLVideoElement} videoElement - The video element that the media source adapter work with. * @param {PKMediaSourceObject} source - The source Object. * @param {Object} config - The player configuration. * @returns {IMediaSourceAdapter} - New instance of the run time media source adapter. * @static */ static createAdapter(videoElement: HTMLVideoElement, source: PKMediaSourceObject, config: any): IMediaSourceAdapter; /** * Checks if hls adapter can play a given mime type. * @function canPlayType * @param {string} mimeType - The mime type to check. * @returns {boolean} - Whether the hls adapter can play a specific mime type. * @static */ static canPlayType(mimeType: string): boolean; /** * Checks if hls adapter can play a given drm data. * For hls.js it always returns false. * @returns {boolean} - Whether the hls adapter can play a specific drm data. * @static */ static canPlayDrm(): boolean; /** * Checks if the hls adapter is supported. * @function isSupported * @returns {boolean} - Whether hls is supported. * @static */ static isSupported(): boolean; /** * @constructor * @param {HTMLVideoElement} videoElement - The video element which will bind to the hls adapter * @param {PKMediaSourceObject} source - The source object * @param {Object} config - The media source adapter configuration */ constructor(videoElement: HTMLVideoElement, source: PKMediaSourceObject, config: any); /** * init the hls adapter * @function _init * @private * @returns {void} */ private _init; private _maybeSetFilters; /** * Adds the required bindings locally and with hls.js. * @function _addBindings * @private * @returns {void} */ private _addBindings; private _onFpsDrop; private _onFragParsingMetadata; private _onAddTrack; /** * attach media - return the media source to handle the video tag * @public * @returns {void} */ attachMediaSource(): void; /** * detach media - will remove the media source from handling the video * @public * @returns {void} */ detachMediaSource(): void; /** * video error event handler. * @param {MediaError} error - the media error * @public * @returns {boolean} if hls-adapter will try to recover */ handleMediaError(error: MediaError): boolean; /** * Load the video source * @function load * @param {number} startTime - Optional time to start the video from. * @returns {Promise<Object>} - The loaded data * @override */ load(startTime?: number): Promise<any>; /** * Load the video source * @function load * @returns {void} * @private */ private _loadInternal; /** * Load the video source with installed playlist loader * @function _reloadWithDirectManifest * @returns {void} * @private */ private _reloadWithDirectManifest; /** * Destroys the hls adapter. * @function destroy * @override * @returns {Promise<*>} - The destroy promise. */ destroy(): Promise<void>; /** * reset hls.js instance and its bindings * @private * @returns {void} */ private _reset; /** * Parse the hls tracks into player tracks. * @returns {Array<Track>} - The parsed tracks. * @private */ private _parseTracks; /** * Parse hls audio tracks into player audio tracks. * @param {Array<Object>} hlsAudioTracks - The hls audio tracks. * @returns {Array<AudioTrack>} - The parsed audio tracks. * @private */ private _parseAudioTracks; /** * Parse hls video tracks into player video tracks. * @param {Array<Object>} hlsVideoTracks - The hls video tracks. * @returns {Array<VideoTrack>} - The parsed video tracks. * @private */ private _parseVideoTracks; /** * Parse hls text tracks into player text tracks. * @param {Array<Object>} hlsTextTracks - The hls text tracks. * @returns {Array<TextTrack>} - The parsed text tracks. * @private */ private _parseTextTracks; private _captionsOrSubtitlesFromCharacteristics; /** * Parse a CEA 608/708 text track which not expose on hlsjs api into player text tracks. * @param {Object} CEATextTrack - A video element text track. * @returns {?TextTrack} - A parsed text track if the param is a CEA 608/708 caption. * @private */ private _parseCEATextTrack; /** * Select an audio track. * @function selectAudioTrack * @param {AudioTrack} audioTrack - the audio track to select. * @returns {void} * @public */ selectAudioTrack(audioTrack: AudioTrack): void; /** * Select a video track. * @function selectVideoTrack * @param {VideoTrack} videoTrack - the track to select. * @returns {void} * @public */ selectVideoTrack(videoTrack: VideoTrack): void; /** * Select a text track. * @function selectTextTrack * @param {TextTrack} textTrack - the track to select. * @returns {void} * @public */ selectTextTrack(textTrack: TextTrack_2): void; /** * Select a video element text track. * @function _selectNativeTextTrack * @param {TextTrack} textTrack - the track to select. * @returns {void} * @private */ private _selectNativeTextTrack; private _notifyTrackChanged; /** Hide the text track * @function hideTextTrack * @returns {void} * @public */ hideTextTrack(): void; /** * Enables adaptive bitrate switching according to hls.js logic. * @function enableAdaptiveBitrate * @returns {void} * @public */ enableAdaptiveBitrate(): void; /** * Checking if adaptive bitrate switching is enabled. * @function isAdaptiveBitrateEnabled * @returns {boolean} - Whether adaptive bitrate is enabled. * @public */ isAdaptiveBitrateEnabled(): boolean; /** * Apply ABR restriction. * @function applyABRRestriction * @param {PKABRRestrictionObject} restrictions - abr restrictions config * @returns {void} * @public */ applyABRRestriction(restrictions: PKABRRestrictionObject): void; /** * Returns the details of hls level * @function _getLevelDetails * @returns {Object} - Level details * @private */ private _getLevelDetails; /** * Returns the live edge * @returns {number} - live edge * @private */ protected _getLiveEdge(): number; /** * Seeking to live edge, calculated according hls configuration - liveSyncDuration or liveSyncDurationCount. * @function seekToLiveEdge * @returns {void} * @public */ seekToLiveEdge(): void; /** * Gets the segment duration of the stream * @return {number} - Segment duration in seconds */ getSegmentDuration(): number; /** * Gets the live duration * @return {number} - live duration */ get liveDuration(): number; /** * Checking if the current playback is live. * @function isLive * @returns {boolean} - Whether playback is live. * @public */ isLive(): boolean; /** * Fired after manifest has been loaded. * @function _onManifestLoaded * @param {any} data - the data of the manifest load event * @private * @returns {void} */ private _onManifestLoaded; /** * apply ABR restrictions * @private * @param {PKABRRestrictionObject} restrictions - abt config object * @returns {void} */ private _maybeApplyAbrRestrictions; /** * Triggers on video track selection (auto or manually) the 'videotrackchanged' event forward. * @function _onLevelSwitched * @param {string} event - The event name. * @param {any} data - The event data object. * @private * @returns {void} */ private _onLevelSwitched; /** * Triggers on audio track selection (auto or manually) the 'audiotrackchanged' event forward. * @function _onAudioTrackSwitched * @param {string} event - The event name. * @param {any} data - The event data object. * @private * @returns {void} */ private _onAudioTrackSwitched; /** * Trigger a playing event whenever an audio track is changed & time_update event is fired. * This align Edge and IE behaviour to other browsers. When an audio track changed in IE & Edge, they trigger * waiting event but not playing event. * @returns {void} * @private */ private _handleWaitingUponAudioTrackSwitch; /** * Creates a detailed Error Object according to the relevant error name * @param {any} data - The event data object. * @private * @returns {any} - the relevant error data object */ private _getErrorDataObject; /** * Handles hls errors. * @param {any} data - The event data object. * @private * @returns {void} */ private _onError; /** * Tries to handle media errors via hls.js error handlers * @param {string} mediaErrorName - Media Error Name * @returns {boolean} - if media error is handled or not * @private */ private _handleMediaError; /** * trigger mediarecovered event if metadata is loaded (means the recovery succeeded) * @returns {void} * @private */ private _onRecovered; /** * Check if time has passed a certain delta * @param {number} now - current time * @param {number} then - previous time * @param {number} delay - time delta in ms * @returns {boolean} - if time delta has * @private */ private _checkTimeDeltaHasPassed; /** * handle recover from decoding error * @returns {void} * @private */ private _recoverDecodingError; /** * handle recover from decoding error by swaping audio codec * @returns {void} * @private */ private _recoverSwapAudioCodec; /** * Removes hls.js bindings. * @returns {void} * @private */ private _removeBindings; /** * Get the start time of DVR window in live playback in seconds. * @returns {Number} - start time of DVR window. * @public */ getStartTimeOfDvrWindow(): number; /** * called when a level is loaded * @private * @param {any} e - the event object * @param {any} data - the event data * @returns {void} */ private _onLevelLoaded; /** * called when a fragment is loaded * @private * @param {any} data - the event data of the loaded fragment * @returns {void} */ private _onFragLoaded; /** * returns value the player targets the buffer * @returns {number} buffer target length in seconds */ get targetBuffer(): number; private _getLiveTargetBuffer; } export default HlsAdapter; export declare const NAME: string; export declare const VERSION: string; export { }