nsplayer
Version:
NSPlayer, a player which supports quality list of dash and hls
167 lines (166 loc) • 7.62 kB
TypeScript
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;
}