UNPKG

nsplayer

Version:

NSPlayer, a player which supports quality list of dash and hls

167 lines (166 loc) 7.62 kB
import { BasePlayer, RequestFullscreenOptions } from './baseplayer'; import { Emitter, Event, Relay, PauseableEmitter } from '@newstudios/common'; import { Source, getMimeType, formatTime, Size, ChangeDetail } from './types'; import { ICorePlayer, PlayList, QualityLevel, qualityLevelToId, idToQualityLevel, isAutoQuality, isSameLevel, computeFPS } from './coreplayer'; import { SourcePolicy } from './policy/source'; import './fullscreen-polyfill.js'; import './getvideoplaybackquality-polyfill.js'; export interface NSPlayerOptions { el?: HTMLElement; selector?: string; source?: Source | Source[]; initialBitrate?: number; autoplay?: boolean; playbackRate?: number; preload?: 'auto' | 'none' | 'metadata'; loop?: boolean; muted?: boolean; volume?: number; controls?: boolean; abrFastSwitch?: boolean; capLevelToPlayerSize?: boolean; } export interface IPlayer extends BasePlayer { readonly src: string; readonly srcObject: MediaStream | MediaSource | Blob | null; readonly currentPlayerName: string | undefined; readonly currentQualityId: string; readonly currentPlayList: PlayList; readonly currentQualityLevel?: QualityLevel; readonly requestedQualityId: string; readonly autoQuality: boolean; readonly fullscreen: boolean; readonly supportAutoQuality: boolean; readonly viewport: Size; readonly bandwidthEstimate: number; readonly version: string; container: HTMLElement | null; sourcePolicy: SourcePolicy; /** 提供所有可供播放的资源,请尽量提供 mime type 以及 src */ setSource(sources: Source | Source[], initialBitrate?: number): boolean; /** 是否含有播放源 */ hasSource(): boolean; /** 根据 id 请求播放质量,auto 表示自动,id 在各类核心播放器之间通用 */ requestQualityById(id: string): void; /** 根据 PlayList 数组的下标请求播放质量,-1 则表示自动 */ requestQualityByIndex(index: number): void; /** 对当前 corePlayer 请求 cap to player */ requestCapLevelToPlayerSize(capToPlayer: boolean): void; readonly onFullscreenChange: Event<globalThis.Event>; readonly onFullscreenError: Event<globalThis.Event>; readonly onVideoAttach: Event<HTMLVideoElement>; readonly onVideoDetach: Event<HTMLVideoElement>; readonly onQualitySwitchStart: Event<QualityLevel>; readonly onQualitySwitchEnd: Event<QualityLevel>; readonly onQualityChange: Event<QualityLevel>; readonly onPlayListChange: Event<PlayList>; readonly onAutoChange: Event<boolean>; readonly onQualityWillChange: Event<CustomEvent<ChangeDetail<string>>>; readonly onQualityRequest: Event<string>; readonly onQualitySelect: Event<string>; readonly onReset: Event<globalThis.Event>; } /** * NSPlayer */ export default class NSPlayer extends BasePlayer implements IPlayer { readonly opt: NSPlayerOptions; static readonly qualityLevelToId: typeof qualityLevelToId; static readonly idToQualityLevel: typeof idToQualityLevel; static readonly isAutoQuality: typeof isAutoQuality; static readonly computeFPS: typeof computeFPS; static readonly isSameLevel: typeof isSameLevel; static readonly formatTime: typeof formatTime; static readonly getMimeType: typeof getMimeType; static debug: boolean; private _el; private _originalContainer; private _originalBodyOverflow; private _disposableParentElement; private _delayQualitySwitchRequest; private _delayContainerTimer; private _corePlayerRef; private _sources; private _requestedQualityId; private _capLevelToPlayerSize; private _sourcePolicy; private _abrFastSwitch; private _corePlayerCreateCounter; private _reset_call; private _CMD_REQUEST_QUALITY; protected readonly _onFullscreenChange: Emitter<globalThis.Event>; readonly onFullscreenChange: Event<globalThis.Event>; protected readonly _onFullscreenError: Emitter<globalThis.Event>; readonly onFullscreenError: Event<globalThis.Event>; protected readonly _onWindowFullscreenChange: Emitter<CustomEvent<boolean>>; readonly onWindowFullscreenChange: Event<CustomEvent<boolean>>; protected readonly _onVideoAttach: Emitter<HTMLVideoElement>; readonly onVideoAttach: Event<HTMLVideoElement>; protected readonly _onVideoDetach: Emitter<HTMLVideoElement>; readonly onVideoDetach: Event<HTMLVideoElement>; protected readonly _onQualityChange: Relay<QualityLevel>; readonly onQualityChange: Event<QualityLevel>; protected readonly _onPlayListChange: Relay<PlayList>; readonly onPlayListChange: Event<PlayList>; protected readonly _onAutoChange: Relay<boolean>; readonly onAutoChange: Event<boolean>; protected readonly _onQualityRequest: Emitter<string>; readonly onQualityRequest: Event<string>; protected readonly _onQualityWillChange: Emitter<CustomEvent<ChangeDetail<string>>>; readonly onQualityWillChange: Event<CustomEvent<ChangeDetail<string>>>; protected readonly _onQualitySelect: Relay<string>; readonly onQualitySelect: Event<string>; protected readonly _onLoad: Emitter<globalThis.Event>; readonly onLoad: Event<globalThis.Event>; protected readonly _onReset: Emitter<globalThis.Event>; readonly onReset: Event<globalThis.Event>; private readonly _emitterErrorMutable; private readonly _onEscKeyDownMutable; private readonly _onSwitchCallMutalbe; protected readonly _onQualitySwitchStart: PauseableEmitter<QualityLevel>; readonly onQualitySwitchStart: Event<QualityLevel>; protected readonly _onQualitySwitchEnd: PauseableEmitter<QualityLevel>; readonly onQualitySwitchEnd: Event<QualityLevel>; get viewport(): Size; get bandwidthEstimate(): number; get currentQualityLevel(): QualityLevel | undefined; constructor(opt?: NSPlayerOptions); /** 根据当前的 source 形态获取底层的 CorePlayer,可能为 undefined */ protected get corePlayer(): ICorePlayer | undefined; get currentPlayerName(): string | undefined; get fullscreen(): boolean; requestFullscreen(options?: RequestFullscreenOptions | undefined): Promise<void>; get windowFullscreen(): boolean; requestWindowFullscreen(): void; toggleWindowFullscreen(): void; exitWindowFullscreen(): void; private initHTMLVideoElement; set container(el: HTMLElement | null); get container(): HTMLElement | null; set sourcePolicy(sourcePolicy: SourcePolicy); get sourcePolicy(): SourcePolicy; /** when attaching the video, call super.doAttach for just append the video to the child */ protected doAttach(video: HTMLVideoElement): void; /** when detaching the video from container */ protected doDetach(video: HTMLVideoElement): void; private _registerContainerListeners; /** update the quality to requested, reenter-safe */ private _updateQuality; get src(): string; get srcObject(): MediaProvider | null; get currentQualityId(): string; get currentPlayList(): PlayList; get requestedQualityId(): string; get selectedQualityId(): string; get autoQuality(): boolean; get supportAutoQuality(): boolean; requestQualityById(id: string): void; requestQualityByIndex(index: number): void; requestCapLevelToPlayerSize(capToPlayer: boolean): void; getSource(): readonly Source[]; hasSource(): boolean; setSource(sources: Source | Source[], initialBitrate?: number): boolean; stop(): void; protected reset(): void; get version(): string; }