@libmedia/avplayer 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/COPYING.LGPLv3 +165 -0
- package/README.md +13 -0
- package/dist/esm/118.avplayer.js +1 -0
- package/dist/esm/217.avplayer.js +1 -0
- package/dist/esm/299.avplayer.js +1 -0
- package/dist/esm/331.avplayer.js +1 -0
- package/dist/esm/344.avplayer.js +1 -0
- package/dist/esm/433.avplayer.js +1 -0
- package/dist/esm/453.avplayer.js +1 -0
- package/dist/esm/487.avplayer.js +1 -0
- package/dist/esm/522.avplayer.js +1 -0
- package/dist/esm/531.avplayer.js +1 -0
- package/dist/esm/543.avplayer.js +1 -0
- package/dist/esm/576.avplayer.js +1 -0
- package/dist/esm/611.avplayer.js +1 -0
- package/dist/esm/634.avplayer.js +1 -0
- package/dist/esm/70.avplayer.js +1 -0
- package/dist/esm/791.avplayer.js +1 -0
- package/dist/esm/808.avplayer.js +1 -0
- package/dist/esm/839.avplayer.js +1 -0
- package/dist/esm/854.avplayer.js +1 -0
- package/dist/esm/855.avplayer.js +1 -0
- package/dist/esm/94.avplayer.js +1 -0
- package/dist/esm/941.avplayer.js +1 -0
- package/dist/esm/969.avplayer.js +1 -0
- package/dist/esm/avplayer.js +1 -0
- package/dist/types/AVPlayer.d.ts +683 -0
- package/dist/types/Controller.d.ts +36 -0
- package/dist/types/JitterBufferController.d.ts +38 -0
- package/dist/types/StatsController.d.ts +22 -0
- package/dist/types/eventType.d.ts +21 -0
- package/dist/types/function/createMessageChannel.d.ts +1 -0
- package/dist/types/function/getMediaSource.d.ts +10 -0
- package/dist/types/function/supportOffscreenCanvas.d.ts +1 -0
- package/dist/types/mse/MSEPipeline.d.ts +98 -0
- package/dist/types/struct.d.ts +12 -0
- package/dist/types/subtitle/AssRender.d.ts +52 -0
- package/dist/types/subtitle/SubtitleRender.d.ts +48 -0
- package/dist/types/type.d.ts +6 -0
- package/dist/types/worker/AudioPipeline.d.ts +13 -0
- package/dist/types/worker/AudioPipelineProxy.d.ts +13 -0
- package/dist/types/worker/IODemuxPipeline.d.ts +13 -0
- package/dist/types/worker/IODemuxPipelineProxy.d.ts +13 -0
- package/dist/types/worker/MSEPipeline.d.ts +12 -0
- package/dist/types/worker/MSEPipelineProxy.d.ts +12 -0
- package/dist/types/worker/VideoPipeline.d.ts +13 -0
- package/dist/types/worker/VideoPipelineProxy.d.ts +13 -0
- package/dist/umd/118.avplayer.js +1 -0
- package/dist/umd/217.avplayer.js +1 -0
- package/dist/umd/299.avplayer.js +1 -0
- package/dist/umd/331.avplayer.js +1 -0
- package/dist/umd/344.avplayer.js +1 -0
- package/dist/umd/433.avplayer.js +1 -0
- package/dist/umd/453.avplayer.js +1 -0
- package/dist/umd/487.avplayer.js +1 -0
- package/dist/umd/522.avplayer.js +1 -0
- package/dist/umd/531.avplayer.js +1 -0
- package/dist/umd/543.avplayer.js +1 -0
- package/dist/umd/576.avplayer.js +1 -0
- package/dist/umd/611.avplayer.js +1 -0
- package/dist/umd/634.avplayer.js +1 -0
- package/dist/umd/70.avplayer.js +1 -0
- package/dist/umd/791.avplayer.js +1 -0
- package/dist/umd/808.avplayer.js +1 -0
- package/dist/umd/839.avplayer.js +1 -0
- package/dist/umd/854.avplayer.js +1 -0
- package/dist/umd/855.avplayer.js +1 -0
- package/dist/umd/94.avplayer.js +1 -0
- package/dist/umd/941.avplayer.js +1 -0
- package/dist/umd/969.avplayer.js +1 -0
- package/dist/umd/avplayer.js +1 -0
- package/package.json +42 -0
|
@@ -0,0 +1,683 @@
|
|
|
1
|
+
import { AVCodecID, AVMediaType } from "@libmedia/avutil/codec";
|
|
2
|
+
import IOPipeline from "@libmedia/avpipeline/IOPipeline";
|
|
3
|
+
import DemuxPipeline from "@libmedia/avpipeline/DemuxPipeline";
|
|
4
|
+
import AudioDecodePipeline from "@libmedia/avpipeline/AudioDecodePipeline";
|
|
5
|
+
import { Thread } from "@libmedia/cheap/thread/thread";
|
|
6
|
+
import Emitter, { EmitterOptions } from "@libmedia/common/event/Emitter";
|
|
7
|
+
import compile, { WebAssemblyResource } from "@libmedia/cheap/webassembly/compiler";
|
|
8
|
+
import AudioRenderPipeline from "@libmedia/avpipeline/AudioRenderPipeline";
|
|
9
|
+
import VideoRenderPipeline from "@libmedia/avpipeline/VideoRenderPipeline";
|
|
10
|
+
import { RenderMode } from "@libmedia/avrender/image/ImageRender";
|
|
11
|
+
import { ControllerObserver } from "./Controller";
|
|
12
|
+
import * as eventType from "./eventType";
|
|
13
|
+
import Stats from "@libmedia/avpipeline/struct/stats";
|
|
14
|
+
import MSEPipeline from "./mse/MSEPipeline";
|
|
15
|
+
import { AVStreamInterface } from "@libmedia/avutil/AVStream";
|
|
16
|
+
import { AVFormatContextInterface } from "@libmedia/avformat/AVFormatContext";
|
|
17
|
+
import { Data, Fn } from "@libmedia/common/types/type";
|
|
18
|
+
import { playerEventChanged, playerEventChanging, playerEventError, playerEventNoParam, playerEventTime } from "./type";
|
|
19
|
+
import FetchIOLoader from "@libmedia/avnetwork/ioLoader/FetchIOLoader";
|
|
20
|
+
import FileIOLoader from "@libmedia/avnetwork/ioLoader/FileIOLoader";
|
|
21
|
+
import CustomIOLoader from "@libmedia/avnetwork/ioLoader/CustomIOLoader";
|
|
22
|
+
import IODemuxPipelineProxy from "./worker/IODemuxPipelineProxy";
|
|
23
|
+
import AudioPipelineProxy from "./worker/AudioPipelineProxy";
|
|
24
|
+
import MSEPipelineProxy from "./worker/MSEPipelineProxy";
|
|
25
|
+
import WebSocketIOLoader from "@libmedia/avnetwork/ioLoader/WebSocketIOLoader";
|
|
26
|
+
import SocketIOLoader from "@libmedia/avnetwork/ioLoader/SocketIOLoader";
|
|
27
|
+
import WebTransportIOLoader from "@libmedia/avnetwork/ioLoader/WebTransportIOLoader";
|
|
28
|
+
export interface ExternalSubtitle {
|
|
29
|
+
/**
|
|
30
|
+
* 字幕源,支持 url 和 文件
|
|
31
|
+
*/
|
|
32
|
+
source: string | File;
|
|
33
|
+
/**
|
|
34
|
+
* 字幕语言
|
|
35
|
+
*/
|
|
36
|
+
lang?: string;
|
|
37
|
+
/**
|
|
38
|
+
* 字幕标题
|
|
39
|
+
*/
|
|
40
|
+
title?: string;
|
|
41
|
+
}
|
|
42
|
+
export interface AVPlayerOptions {
|
|
43
|
+
/**
|
|
44
|
+
* dom 挂载元素
|
|
45
|
+
*/
|
|
46
|
+
container: HTMLDivElement;
|
|
47
|
+
/**
|
|
48
|
+
* 获取 wasm 回调
|
|
49
|
+
*
|
|
50
|
+
* @param type
|
|
51
|
+
* @param codecId
|
|
52
|
+
* @param mediaType
|
|
53
|
+
* @returns
|
|
54
|
+
*/
|
|
55
|
+
getWasm: (type: 'decoder' | 'resampler' | 'stretchpitcher', codecId?: AVCodecID, mediaType?: AVMediaType) => string | ArrayBuffer | WebAssemblyResource;
|
|
56
|
+
/**
|
|
57
|
+
* 是否是直播
|
|
58
|
+
*/
|
|
59
|
+
isLive?: boolean;
|
|
60
|
+
/**
|
|
61
|
+
* 自定义检查是否使用 mse 模式
|
|
62
|
+
*/
|
|
63
|
+
checkUseMES?: (streams: AVStreamInterface[]) => boolean;
|
|
64
|
+
/**
|
|
65
|
+
* 是否启用硬件加速
|
|
66
|
+
*/
|
|
67
|
+
enableHardware?: boolean;
|
|
68
|
+
/**
|
|
69
|
+
* 是否启用 WebGPU 渲染
|
|
70
|
+
*/
|
|
71
|
+
enableWebGPU?: boolean;
|
|
72
|
+
/**
|
|
73
|
+
* 是否启用 WebCodecs 编解码
|
|
74
|
+
*/
|
|
75
|
+
enableWebCodecs?: boolean;
|
|
76
|
+
/**
|
|
77
|
+
* 是否启用 worker
|
|
78
|
+
*/
|
|
79
|
+
enableWorker?: boolean;
|
|
80
|
+
/**
|
|
81
|
+
* 是否循环播放
|
|
82
|
+
*/
|
|
83
|
+
loop?: boolean;
|
|
84
|
+
/**
|
|
85
|
+
* 是否开启低延时模式(直播)开始之后会根据网络情况自动调整 buffer,尽量在不卡顿的情况下降低延时
|
|
86
|
+
*/
|
|
87
|
+
lowLatency?: boolean;
|
|
88
|
+
/**
|
|
89
|
+
* jitter buffer 最大值 lowLatency 模式下影响最高延时(秒)
|
|
90
|
+
*/
|
|
91
|
+
jitterBufferMax?: float;
|
|
92
|
+
/**
|
|
93
|
+
* jitter buffer 最小值 lowLatency 模式下影响最低延时(秒)
|
|
94
|
+
*/
|
|
95
|
+
jitterBufferMin?: float;
|
|
96
|
+
/**
|
|
97
|
+
* 预加载 buffer 时长,点播使用(秒)
|
|
98
|
+
*/
|
|
99
|
+
preLoadTime?: float;
|
|
100
|
+
/**
|
|
101
|
+
* 自定义查找播放流回调
|
|
102
|
+
*/
|
|
103
|
+
findBestStream?: (streams: AVStreamInterface[], mediaType: AVMediaType) => AVStreamInterface;
|
|
104
|
+
}
|
|
105
|
+
export interface AVPlayerLoadOptions {
|
|
106
|
+
/**
|
|
107
|
+
* 源扩展名
|
|
108
|
+
* 强制指定扩展名,对没有扩展名的 url 链接使用
|
|
109
|
+
*/
|
|
110
|
+
ext?: string;
|
|
111
|
+
/**
|
|
112
|
+
* 需要一起加载的外挂字幕
|
|
113
|
+
*/
|
|
114
|
+
externalSubtitles?: ExternalSubtitle[];
|
|
115
|
+
/**
|
|
116
|
+
* http 请求配置
|
|
117
|
+
*/
|
|
118
|
+
http?: {
|
|
119
|
+
/**
|
|
120
|
+
* http 请求需要添加的 header
|
|
121
|
+
*/
|
|
122
|
+
headers?: Data;
|
|
123
|
+
/**
|
|
124
|
+
* http 请求的 credentials 配置
|
|
125
|
+
*/
|
|
126
|
+
credentials?: RequestCredentials;
|
|
127
|
+
/**
|
|
128
|
+
* http 请求的 referrerPolicy 配置
|
|
129
|
+
*/
|
|
130
|
+
referrerPolicy?: ReferrerPolicy;
|
|
131
|
+
};
|
|
132
|
+
/**
|
|
133
|
+
* webtransport 配置
|
|
134
|
+
*/
|
|
135
|
+
webtransport?: WebTransportOptions;
|
|
136
|
+
/**
|
|
137
|
+
* 如果 source 是被 Websocket 或者 WebTransport 代理的,这里传源地址
|
|
138
|
+
* 像 rtmp 需要使用到这个源地址
|
|
139
|
+
*/
|
|
140
|
+
uri?: string;
|
|
141
|
+
/**
|
|
142
|
+
* 透传给 format 的参数
|
|
143
|
+
*/
|
|
144
|
+
formatOptions?: Data;
|
|
145
|
+
}
|
|
146
|
+
export interface AVPlayerPlayOptions {
|
|
147
|
+
/**
|
|
148
|
+
* 是否播放音频
|
|
149
|
+
*/
|
|
150
|
+
audio?: boolean;
|
|
151
|
+
/**
|
|
152
|
+
* 是否播放视频
|
|
153
|
+
*/
|
|
154
|
+
video?: boolean;
|
|
155
|
+
/**
|
|
156
|
+
* 是否播放字幕
|
|
157
|
+
*/
|
|
158
|
+
subtitle?: boolean;
|
|
159
|
+
}
|
|
160
|
+
export declare const AVPlayerSupportedCodecs: AVCodecID[];
|
|
161
|
+
export declare const enum AVPlayerStatus {
|
|
162
|
+
STOPPED = 0,
|
|
163
|
+
DESTROYING = 1,
|
|
164
|
+
DESTROYED = 2,
|
|
165
|
+
LOADING = 3,
|
|
166
|
+
LOADED = 4,
|
|
167
|
+
PLAYING = 5,
|
|
168
|
+
PLAYED = 6,
|
|
169
|
+
PAUSED = 7,
|
|
170
|
+
SEEKING = 8,
|
|
171
|
+
CHANGING = 9
|
|
172
|
+
}
|
|
173
|
+
export declare const enum AVPlayerProgress {
|
|
174
|
+
OPEN_FILE = 0,
|
|
175
|
+
ANALYZE_FILE = 1,
|
|
176
|
+
LOAD_AUDIO_DECODER = 2,
|
|
177
|
+
LOAD_VIDEO_DECODER = 3
|
|
178
|
+
}
|
|
179
|
+
export default class AVPlayer extends Emitter implements ControllerObserver {
|
|
180
|
+
static Util: {
|
|
181
|
+
compile: typeof compile;
|
|
182
|
+
browser: import("common/types/type").Browser;
|
|
183
|
+
os: import("common/types/type").OS;
|
|
184
|
+
};
|
|
185
|
+
static IOLoader: {
|
|
186
|
+
CustomIOLoader: typeof CustomIOLoader;
|
|
187
|
+
FetchIOLoader: typeof FetchIOLoader;
|
|
188
|
+
FileIOLoader: typeof FileIOLoader;
|
|
189
|
+
WebSocketIOLoader: typeof WebSocketIOLoader;
|
|
190
|
+
SocketIOLoader: typeof SocketIOLoader;
|
|
191
|
+
WebTransportIOLoader: typeof WebTransportIOLoader;
|
|
192
|
+
};
|
|
193
|
+
static level: number;
|
|
194
|
+
static DemuxThreadReady: Promise<void>;
|
|
195
|
+
static AudioThreadReady: Promise<void>;
|
|
196
|
+
static VideoThreadReady: Promise<void>;
|
|
197
|
+
static MSEThreadReady: Promise<void>;
|
|
198
|
+
static IODemuxProxy: IODemuxPipelineProxy;
|
|
199
|
+
static AudioPipelineProxy: AudioPipelineProxy;
|
|
200
|
+
static MSEPipelineProxy: MSEPipelineProxy;
|
|
201
|
+
static IOThread: Thread<IOPipeline>;
|
|
202
|
+
static DemuxerThread: Thread<DemuxPipeline>;
|
|
203
|
+
static AudioDecoderThread: Thread<AudioDecodePipeline>;
|
|
204
|
+
static AudioRenderThread: Thread<AudioRenderPipeline>;
|
|
205
|
+
static VideoRenderThread: Thread<VideoRenderPipeline>;
|
|
206
|
+
static MSEThread: Thread<MSEPipeline>;
|
|
207
|
+
static audioContext: AudioContext;
|
|
208
|
+
static Resource: Map<string, WebAssemblyResource | ArrayBuffer>;
|
|
209
|
+
private VideoDecoderThread;
|
|
210
|
+
private VideoRenderThread;
|
|
211
|
+
private VideoPipelineProxy;
|
|
212
|
+
private GlobalData;
|
|
213
|
+
private taskId;
|
|
214
|
+
private subTaskId;
|
|
215
|
+
private subtitleTaskId;
|
|
216
|
+
private ext;
|
|
217
|
+
private source;
|
|
218
|
+
private ioIPCPort;
|
|
219
|
+
private options;
|
|
220
|
+
private ioloader2DemuxerChannel;
|
|
221
|
+
private demuxer2VideoDecoderChannel;
|
|
222
|
+
private demuxer2AudioDecoderChannel;
|
|
223
|
+
private videoDecoder2VideoRenderChannel;
|
|
224
|
+
private audioDecoder2AudioRenderChannel;
|
|
225
|
+
private audioRender2AudioWorkletChannel;
|
|
226
|
+
private audioSourceNode;
|
|
227
|
+
private gainNode;
|
|
228
|
+
private formatContext;
|
|
229
|
+
private canvas;
|
|
230
|
+
private updateCanvas;
|
|
231
|
+
private video;
|
|
232
|
+
private audio;
|
|
233
|
+
private controller;
|
|
234
|
+
private volume;
|
|
235
|
+
private playRate;
|
|
236
|
+
private renderMode;
|
|
237
|
+
private renderRotate;
|
|
238
|
+
private flipHorizontal;
|
|
239
|
+
private flipVertical;
|
|
240
|
+
private useMSE;
|
|
241
|
+
private audioEnded;
|
|
242
|
+
private videoEnded;
|
|
243
|
+
private status;
|
|
244
|
+
private lastStatus;
|
|
245
|
+
private playChannels;
|
|
246
|
+
private seekedTimestamp;
|
|
247
|
+
private statsController;
|
|
248
|
+
private jitterBufferController;
|
|
249
|
+
private selectedVideoStream;
|
|
250
|
+
private selectedAudioStream;
|
|
251
|
+
private selectedSubtitleStream;
|
|
252
|
+
private lastSelectedInnerSubtitleStreamIndex;
|
|
253
|
+
private subtitleRender;
|
|
254
|
+
private externalSubtitleTasks;
|
|
255
|
+
constructor(options: AVPlayerOptions);
|
|
256
|
+
/**
|
|
257
|
+
* 当前播放时间戳(毫秒)
|
|
258
|
+
*/
|
|
259
|
+
get currentTime(): int64;
|
|
260
|
+
private isCodecIdSupported;
|
|
261
|
+
private findBestStream;
|
|
262
|
+
private checkUseMSE;
|
|
263
|
+
private createCanvas;
|
|
264
|
+
private createVideo;
|
|
265
|
+
private createAudio;
|
|
266
|
+
private handleTimeupdate;
|
|
267
|
+
private handleEnded;
|
|
268
|
+
/**
|
|
269
|
+
* 当前播放的源是否是 hls
|
|
270
|
+
*
|
|
271
|
+
* @returns
|
|
272
|
+
*/
|
|
273
|
+
isHls(): boolean;
|
|
274
|
+
/**
|
|
275
|
+
* 当前播放的源是否是 dash
|
|
276
|
+
*
|
|
277
|
+
* @returns
|
|
278
|
+
*/
|
|
279
|
+
isDash(): boolean;
|
|
280
|
+
private getResource;
|
|
281
|
+
private createSubtitleRender;
|
|
282
|
+
/**
|
|
283
|
+
* 加载外挂字幕
|
|
284
|
+
*
|
|
285
|
+
* @param externalSubtitle
|
|
286
|
+
* @returns
|
|
287
|
+
*/
|
|
288
|
+
loadExternalSubtitle(externalSubtitle: ExternalSubtitle): Promise<number>;
|
|
289
|
+
/**
|
|
290
|
+
* 加载媒体源,分析流信息
|
|
291
|
+
*
|
|
292
|
+
* @param source 媒体源,支持 url、File 和自定义 CustomIOLoader
|
|
293
|
+
* @param options 配置项
|
|
294
|
+
*/
|
|
295
|
+
load(source: string | File | CustomIOLoader, options?: AVPlayerLoadOptions): Promise<void>;
|
|
296
|
+
/**
|
|
297
|
+
* 播放
|
|
298
|
+
*
|
|
299
|
+
* @param options
|
|
300
|
+
* @returns
|
|
301
|
+
*/
|
|
302
|
+
play(options?: AVPlayerPlayOptions): Promise<void>;
|
|
303
|
+
/**
|
|
304
|
+
* 暂停播放
|
|
305
|
+
*/
|
|
306
|
+
pause(): Promise<void>;
|
|
307
|
+
private doSeek;
|
|
308
|
+
/**
|
|
309
|
+
* 跳转到指定时间戳位置播放(只支持点播)
|
|
310
|
+
* 某些文件可能不会 seek 成功
|
|
311
|
+
*
|
|
312
|
+
* @param timestamp 毫秒
|
|
313
|
+
*/
|
|
314
|
+
seek(timestamp: int64): Promise<void>;
|
|
315
|
+
/**
|
|
316
|
+
* 获取流信息
|
|
317
|
+
*
|
|
318
|
+
* @returns
|
|
319
|
+
*/
|
|
320
|
+
getStreams(): {
|
|
321
|
+
/**
|
|
322
|
+
* 媒体类型
|
|
323
|
+
*/
|
|
324
|
+
mediaType: string;
|
|
325
|
+
codecparProxy: import("avutil/struct/avcodecparameters").default;
|
|
326
|
+
index: number;
|
|
327
|
+
id: number;
|
|
328
|
+
codecpar: pointer<import("avutil/struct/avcodecparameters").default>;
|
|
329
|
+
nbFrames: int64;
|
|
330
|
+
metadata: Data;
|
|
331
|
+
duration: int64;
|
|
332
|
+
startTime: int64;
|
|
333
|
+
disposition: int32;
|
|
334
|
+
timeBase: import("avutil/struct/rational").Rational;
|
|
335
|
+
}[];
|
|
336
|
+
/**
|
|
337
|
+
* 获取当前选择播放的视频流 id
|
|
338
|
+
*
|
|
339
|
+
* @returns
|
|
340
|
+
*/
|
|
341
|
+
getSelectedVideoStreamId(): number;
|
|
342
|
+
/**
|
|
343
|
+
* 获取当前选择播放的音频流 id
|
|
344
|
+
*
|
|
345
|
+
* @returns
|
|
346
|
+
*/
|
|
347
|
+
getSelectedAudioStreamId(): number;
|
|
348
|
+
/**
|
|
349
|
+
* 获取当前选择播放的字幕流 id
|
|
350
|
+
*
|
|
351
|
+
* @returns
|
|
352
|
+
*/
|
|
353
|
+
getSelectedSubtitleStreamId(): number;
|
|
354
|
+
/**
|
|
355
|
+
* 获取章节信息
|
|
356
|
+
*
|
|
357
|
+
* @returns
|
|
358
|
+
*/
|
|
359
|
+
getChapters(): import("avformat/AVFormatContext").AVChapter[];
|
|
360
|
+
/**
|
|
361
|
+
* 获取总时长(毫秒)
|
|
362
|
+
*
|
|
363
|
+
* @returns
|
|
364
|
+
*/
|
|
365
|
+
getDuration(): bigint;
|
|
366
|
+
/**
|
|
367
|
+
* 停止播放
|
|
368
|
+
*
|
|
369
|
+
* @returns
|
|
370
|
+
*/
|
|
371
|
+
stop(): Promise<void>;
|
|
372
|
+
setPlaybackRate(rate: number): void;
|
|
373
|
+
/**
|
|
374
|
+
* 获取倍数值
|
|
375
|
+
*
|
|
376
|
+
* @returns
|
|
377
|
+
*/
|
|
378
|
+
getPlaybackRate(): double;
|
|
379
|
+
/**
|
|
380
|
+
* resume 音频
|
|
381
|
+
*/
|
|
382
|
+
resume(): Promise<void>;
|
|
383
|
+
/**
|
|
384
|
+
* 获取播放音量
|
|
385
|
+
*
|
|
386
|
+
* @returns
|
|
387
|
+
*/
|
|
388
|
+
getVolume(): double;
|
|
389
|
+
/**
|
|
390
|
+
* 设置播放音量
|
|
391
|
+
*
|
|
392
|
+
* @param volume [0, 3]
|
|
393
|
+
*
|
|
394
|
+
*/
|
|
395
|
+
setVolume(volume: number, force?: boolean): void;
|
|
396
|
+
/**
|
|
397
|
+
*
|
|
398
|
+
* 获取渲染模式
|
|
399
|
+
*
|
|
400
|
+
* @param mode
|
|
401
|
+
* @returns
|
|
402
|
+
*/
|
|
403
|
+
getRenderMode(): RenderMode;
|
|
404
|
+
/**
|
|
405
|
+
* 设置画面填充模式
|
|
406
|
+
*
|
|
407
|
+
* - 0 自适应
|
|
408
|
+
* - 1 填充
|
|
409
|
+
*
|
|
410
|
+
* @param mode
|
|
411
|
+
*/
|
|
412
|
+
setRenderMode(mode: RenderMode): void;
|
|
413
|
+
private getVideoTransformContext;
|
|
414
|
+
/**
|
|
415
|
+
* 设置视频渲染旋转角度
|
|
416
|
+
*
|
|
417
|
+
* @param angle
|
|
418
|
+
*/
|
|
419
|
+
setRotate(angle: double): void;
|
|
420
|
+
enableHorizontalFlip(enable: boolean): void;
|
|
421
|
+
enableVerticalFlip(enable: boolean): void;
|
|
422
|
+
/**
|
|
423
|
+
* 设置是否循环播放
|
|
424
|
+
*
|
|
425
|
+
* @param enable
|
|
426
|
+
*/
|
|
427
|
+
setLoop(enable: boolean): void;
|
|
428
|
+
/**
|
|
429
|
+
*
|
|
430
|
+
* 设置字幕延时(毫秒)
|
|
431
|
+
*
|
|
432
|
+
* @param delay
|
|
433
|
+
*/
|
|
434
|
+
setSubtitleDelay(delay: int32): void;
|
|
435
|
+
/**
|
|
436
|
+
* 获取字幕延时(毫秒)
|
|
437
|
+
*
|
|
438
|
+
* @returns
|
|
439
|
+
*/
|
|
440
|
+
getSubtitleDelay(): 0 | int32;
|
|
441
|
+
/**
|
|
442
|
+
* 设置是否开启字幕显示
|
|
443
|
+
*
|
|
444
|
+
* @param enable
|
|
445
|
+
*/
|
|
446
|
+
setSubtitleEnable(enable: boolean): void;
|
|
447
|
+
/**
|
|
448
|
+
* 重置渲染视图大小
|
|
449
|
+
*
|
|
450
|
+
* @param width
|
|
451
|
+
* @param height
|
|
452
|
+
*/
|
|
453
|
+
resize(width: number, height: number): void;
|
|
454
|
+
/**
|
|
455
|
+
* 当前是否是 mse 播放模式
|
|
456
|
+
*
|
|
457
|
+
* @returns
|
|
458
|
+
*/
|
|
459
|
+
isMSE(): boolean;
|
|
460
|
+
/**
|
|
461
|
+
* 当前是否是 live 模式
|
|
462
|
+
*
|
|
463
|
+
* @returns
|
|
464
|
+
*/
|
|
465
|
+
isLive(): boolean;
|
|
466
|
+
/**
|
|
467
|
+
* 获取视频列表( dash 使用)
|
|
468
|
+
*
|
|
469
|
+
* @returns
|
|
470
|
+
*/
|
|
471
|
+
getVideoList(): Promise<import("avnetwork/ioLoader/IOLoader").IOLoaderVideoStreamInfo>;
|
|
472
|
+
/**
|
|
473
|
+
* 获取音频列表( dash 使用)
|
|
474
|
+
*
|
|
475
|
+
* @returns
|
|
476
|
+
*/
|
|
477
|
+
getAudioList(): Promise<import("avnetwork/ioLoader/IOLoader").IOLoaderAudioStreamInfo>;
|
|
478
|
+
/**
|
|
479
|
+
* 获取字幕列表( dash 使用)
|
|
480
|
+
*
|
|
481
|
+
* @returns
|
|
482
|
+
*/
|
|
483
|
+
getSubtitleList(): Promise<import("avnetwork/ioLoader/IOLoader").IOLoaderSubtitleStreamInfo>;
|
|
484
|
+
/**
|
|
485
|
+
* 获取 status 状态
|
|
486
|
+
*
|
|
487
|
+
* @returns
|
|
488
|
+
*/
|
|
489
|
+
getStatus(): AVPlayerStatus;
|
|
490
|
+
/**
|
|
491
|
+
* 是否播放了音频
|
|
492
|
+
*
|
|
493
|
+
* @returns
|
|
494
|
+
*/
|
|
495
|
+
hasAudio(): boolean;
|
|
496
|
+
/**
|
|
497
|
+
* 是否播放了视频
|
|
498
|
+
*
|
|
499
|
+
* @returns
|
|
500
|
+
*/
|
|
501
|
+
hasVideo(): boolean;
|
|
502
|
+
/**
|
|
503
|
+
* 是否播放了字幕
|
|
504
|
+
*
|
|
505
|
+
* @returns
|
|
506
|
+
*/
|
|
507
|
+
hasSubtitle(): boolean;
|
|
508
|
+
/**
|
|
509
|
+
* 获取当前的播放源
|
|
510
|
+
*
|
|
511
|
+
* @returns
|
|
512
|
+
*/
|
|
513
|
+
getSource(): string | File | CustomIOLoader;
|
|
514
|
+
/**
|
|
515
|
+
* 获取 formatContext 对象
|
|
516
|
+
*
|
|
517
|
+
* @returns
|
|
518
|
+
*/
|
|
519
|
+
getFormatContext(): AVFormatContextInterface;
|
|
520
|
+
/**
|
|
521
|
+
* 获取当前加载的外挂字幕
|
|
522
|
+
*
|
|
523
|
+
* @returns
|
|
524
|
+
*/
|
|
525
|
+
getExternalSubtitle(): {
|
|
526
|
+
source: string | File;
|
|
527
|
+
lang: string;
|
|
528
|
+
title: string;
|
|
529
|
+
}[];
|
|
530
|
+
/**
|
|
531
|
+
* 获取 AVPlayerOptions
|
|
532
|
+
*
|
|
533
|
+
* @returns
|
|
534
|
+
*/
|
|
535
|
+
getOptions(): AVPlayerOptions;
|
|
536
|
+
/**
|
|
537
|
+
* 重新设置是否是直播,load 之前调用
|
|
538
|
+
*
|
|
539
|
+
* @param is
|
|
540
|
+
*/
|
|
541
|
+
setIsLive(is: boolean): void;
|
|
542
|
+
/**
|
|
543
|
+
* 获取 audioContext 声音输出 Node,可拿给外部去处理
|
|
544
|
+
*/
|
|
545
|
+
getAudioOutputNode(): AudioNode;
|
|
546
|
+
/**
|
|
547
|
+
* 判断是否处于画中画状态
|
|
548
|
+
*
|
|
549
|
+
* @returns
|
|
550
|
+
*/
|
|
551
|
+
isPictureInPicture(): boolean;
|
|
552
|
+
/**
|
|
553
|
+
* 设置播放视频轨道
|
|
554
|
+
*
|
|
555
|
+
* @param id 流 id,dash 传 getVideoList 列表中的 index
|
|
556
|
+
* @returns
|
|
557
|
+
*/
|
|
558
|
+
selectVideo(id: number): Promise<void>;
|
|
559
|
+
/**
|
|
560
|
+
* 设置播放音频轨道
|
|
561
|
+
*
|
|
562
|
+
* @param id 流 id,dash 传 getAudioList 列表中的 index
|
|
563
|
+
* @returns
|
|
564
|
+
*/
|
|
565
|
+
selectAudio(id: number): Promise<void>;
|
|
566
|
+
/**
|
|
567
|
+
* 设置播放字幕轨道
|
|
568
|
+
*
|
|
569
|
+
* @param id 流 id,dash 传 getSubtitleList 列表中的 index
|
|
570
|
+
* @returns
|
|
571
|
+
*/
|
|
572
|
+
selectSubtitle(id: number): Promise<void>;
|
|
573
|
+
/**
|
|
574
|
+
* 播放视频下一帧,可用于逐帧播放,暂停状态下使用(不支持 mse 模式)
|
|
575
|
+
*/
|
|
576
|
+
playNextFrame(): Promise<void>;
|
|
577
|
+
/**
|
|
578
|
+
* 全屏
|
|
579
|
+
*/
|
|
580
|
+
enterFullscreen(): void;
|
|
581
|
+
/**
|
|
582
|
+
* 退出全屏
|
|
583
|
+
*/
|
|
584
|
+
exitFullscreen(): void;
|
|
585
|
+
/**
|
|
586
|
+
* 获取截图
|
|
587
|
+
*
|
|
588
|
+
* @param type 生成图片格式
|
|
589
|
+
* @param quality 生成图片质量
|
|
590
|
+
*/
|
|
591
|
+
snapshot(type?: 'png' | 'jpeg' | 'webp', quality?: number): string;
|
|
592
|
+
/**
|
|
593
|
+
* 获取统计数据
|
|
594
|
+
*
|
|
595
|
+
* @returns
|
|
596
|
+
*/
|
|
597
|
+
getStats(): Stats;
|
|
598
|
+
/**
|
|
599
|
+
* 销毁播放器
|
|
600
|
+
*
|
|
601
|
+
* @returns
|
|
602
|
+
*/
|
|
603
|
+
destroy(): Promise<void>;
|
|
604
|
+
/**
|
|
605
|
+
* @internal
|
|
606
|
+
*/
|
|
607
|
+
onVideoEnded(): void;
|
|
608
|
+
/**
|
|
609
|
+
* @internal
|
|
610
|
+
*/
|
|
611
|
+
onAudioEnded(): void;
|
|
612
|
+
/**
|
|
613
|
+
* @internal
|
|
614
|
+
*/
|
|
615
|
+
onCanvasUpdated(): void;
|
|
616
|
+
/**
|
|
617
|
+
* @internal
|
|
618
|
+
*/
|
|
619
|
+
onGetDecoderResource(mediaType: AVMediaType, codecId: AVCodecID): Promise<WebAssemblyResource | string | ArrayBuffer>;
|
|
620
|
+
/**
|
|
621
|
+
* @internal
|
|
622
|
+
*/
|
|
623
|
+
onFirstVideoRendered(): void;
|
|
624
|
+
/**
|
|
625
|
+
* @internal
|
|
626
|
+
*/
|
|
627
|
+
onFirstAudioRendered(): void;
|
|
628
|
+
/**
|
|
629
|
+
* @internal
|
|
630
|
+
*/
|
|
631
|
+
onAudioStutter(): void;
|
|
632
|
+
onVideoStutter(): void;
|
|
633
|
+
/**
|
|
634
|
+
* @internal
|
|
635
|
+
*/
|
|
636
|
+
onFirstVideoRenderedAfterUpdateCanvas(): void;
|
|
637
|
+
/**
|
|
638
|
+
* @internal
|
|
639
|
+
*/
|
|
640
|
+
onTimeUpdate(pts: int64): void;
|
|
641
|
+
/**
|
|
642
|
+
* @internal
|
|
643
|
+
*/
|
|
644
|
+
onMSESeek(time: number): void;
|
|
645
|
+
private createVideoDecoderThread;
|
|
646
|
+
static startDemuxPipeline(enableWorker?: boolean): Promise<void>;
|
|
647
|
+
static startAudioPipeline(enableWorker?: boolean): Promise<void>;
|
|
648
|
+
static startVideoRenderPipeline(enableWorker?: boolean): Promise<void>;
|
|
649
|
+
static startMSEPipeline(enableWorker?: boolean): Promise<void>;
|
|
650
|
+
/**
|
|
651
|
+
* 提前运行所有管线
|
|
652
|
+
*/
|
|
653
|
+
static startPipelines(enableWorker?: boolean): Promise<void>;
|
|
654
|
+
/**
|
|
655
|
+
* 停止所有管线
|
|
656
|
+
*/
|
|
657
|
+
static stopPipelines(): Promise<void>;
|
|
658
|
+
/**
|
|
659
|
+
* 设置日志等级
|
|
660
|
+
*
|
|
661
|
+
* @param level
|
|
662
|
+
*/
|
|
663
|
+
static setLogLevel(level: number): void;
|
|
664
|
+
on(event: typeof eventType.LOADING, listener: typeof playerEventNoParam, options?: Partial<EmitterOptions>): AVPlayer;
|
|
665
|
+
on(event: typeof eventType.LOADED, listener: typeof playerEventNoParam, options?: Partial<EmitterOptions>): AVPlayer;
|
|
666
|
+
on(event: typeof eventType.PLAYING, listener: typeof playerEventNoParam, options?: Partial<EmitterOptions>): AVPlayer;
|
|
667
|
+
on(event: typeof eventType.PLAYED, listener: typeof playerEventNoParam, options?: Partial<EmitterOptions>): AVPlayer;
|
|
668
|
+
on(event: typeof eventType.PAUSED, listener: typeof playerEventNoParam, options?: Partial<EmitterOptions>): AVPlayer;
|
|
669
|
+
on(event: typeof eventType.STOPPED, listener: typeof playerEventNoParam, options?: Partial<EmitterOptions>): AVPlayer;
|
|
670
|
+
on(event: typeof eventType.ENDED, listener: typeof playerEventNoParam, options?: Partial<EmitterOptions>): AVPlayer;
|
|
671
|
+
on(event: typeof eventType.SEEKING, listener: typeof playerEventNoParam, options?: Partial<EmitterOptions>): AVPlayer;
|
|
672
|
+
on(event: typeof eventType.CHANGING, listener: typeof playerEventChanging, options?: Partial<EmitterOptions>): AVPlayer;
|
|
673
|
+
on(event: typeof eventType.CHANGED, listener: typeof playerEventChanged, options?: Partial<EmitterOptions>): AVPlayer;
|
|
674
|
+
on(event: typeof eventType.RESUME, listener: typeof playerEventNoParam, options?: Partial<EmitterOptions>): AVPlayer;
|
|
675
|
+
on(event: typeof eventType.TIME, listener: typeof playerEventTime, options?: Partial<EmitterOptions>): AVPlayer;
|
|
676
|
+
on(event: typeof eventType.STREAM_UPDATE, listener: typeof playerEventNoParam, options?: Partial<EmitterOptions>): AVPlayer;
|
|
677
|
+
on(event: typeof eventType.FIRST_AUDIO_RENDERED, listener: typeof playerEventNoParam, options?: Partial<EmitterOptions>): AVPlayer;
|
|
678
|
+
on(event: typeof eventType.FIRST_VIDEO_RENDERED, listener: typeof playerEventNoParam, options?: Partial<EmitterOptions>): AVPlayer;
|
|
679
|
+
on(event: typeof eventType.ERROR, listener: typeof playerEventError, options?: Partial<EmitterOptions>): AVPlayer;
|
|
680
|
+
on(event: typeof eventType.TIMEOUT, listener: typeof playerEventNoParam, options?: Partial<EmitterOptions>): AVPlayer;
|
|
681
|
+
on(event: string, listener: Fn, options?: Partial<EmitterOptions>): AVPlayer;
|
|
682
|
+
one(event: string, listener: Fn, options?: Partial<EmitterOptions>): this;
|
|
683
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { AVCodecID, AVMediaType } from "@libmedia/avutil/codec";
|
|
2
|
+
import { WebAssemblyResource } from "@libmedia/cheap/webassembly/compiler";
|
|
3
|
+
export interface ControllerObserver {
|
|
4
|
+
onVideoEnded: () => void;
|
|
5
|
+
onAudioEnded: () => void;
|
|
6
|
+
onCanvasUpdated: () => void;
|
|
7
|
+
onFirstVideoRendered: () => void;
|
|
8
|
+
onFirstVideoRenderedAfterUpdateCanvas: () => void;
|
|
9
|
+
onTimeUpdate: (pts: int64) => void;
|
|
10
|
+
onMSESeek: (time: number) => void;
|
|
11
|
+
onGetDecoderResource: (mediaType: AVMediaType, codecId: AVCodecID) => Promise<WebAssemblyResource | string | ArrayBuffer>;
|
|
12
|
+
isPictureInPicture: () => boolean;
|
|
13
|
+
}
|
|
14
|
+
export default class Controller {
|
|
15
|
+
private videoRenderControlChannel;
|
|
16
|
+
private audioRenderControlChannel;
|
|
17
|
+
private muxerControlChannel;
|
|
18
|
+
private demuxerControlChannel;
|
|
19
|
+
private videoRenderControlIPCPort;
|
|
20
|
+
private audioRenderControlIPCPort;
|
|
21
|
+
private muxerControlIPCPort;
|
|
22
|
+
private demuxerControlIPCPort;
|
|
23
|
+
private observer;
|
|
24
|
+
private visibilityHidden;
|
|
25
|
+
private onVisibilityChange;
|
|
26
|
+
private timeUpdateListenType;
|
|
27
|
+
private enableAudioVideoSync;
|
|
28
|
+
constructor(observer: ControllerObserver, enableWorker: boolean);
|
|
29
|
+
getVideoRenderControlPort(): MessagePort;
|
|
30
|
+
getAudioRenderControlPort(): MessagePort;
|
|
31
|
+
getMuxerControlPort(): MessagePort;
|
|
32
|
+
getDemuxerControlPort(): MessagePort;
|
|
33
|
+
setTimeUpdateListenType(type: AVMediaType): void;
|
|
34
|
+
setEnableAudioVideoSync(enable: boolean): void;
|
|
35
|
+
destroy(): void;
|
|
36
|
+
}
|