@gcorevideo/player 2.28.36 → 2.29.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/assets/media-control/media-control.scss +8 -6
- package/assets/multi-camera/multicamera.ejs +27 -23
- package/assets/multi-camera/style.scss +7 -34
- package/assets/style/main.scss +2 -2
- package/dist/core.js +8 -6
- package/dist/index.css +427 -449
- package/dist/index.embed.js +8 -45
- package/dist/index.js +77 -181
- package/docs/api/player.md +22 -9
- package/docs/api/player.mediacontrol.setkeepvisible.md +56 -0
- package/docs/api/player.multicamera.md +0 -28
- package/docs/api/player.multiccamerasourceinfo.md +27 -0
- package/docs/api/{player.multicamera.unbindevents.md → player.multisourcesmode.md} +4 -7
- package/docs/api/player.sourcecontroller.md +0 -37
- package/lib/playback/dash-playback/DashPlayback.d.ts +2 -1
- package/lib/playback/dash-playback/DashPlayback.d.ts.map +1 -1
- package/lib/playback/hls-playback/HlsPlayback.d.ts +2 -1
- package/lib/playback/hls-playback/HlsPlayback.d.ts.map +1 -1
- package/lib/playback/types.d.ts +9 -0
- package/lib/playback/types.d.ts.map +1 -1
- package/lib/playback.types.d.ts +0 -6
- package/lib/playback.types.d.ts.map +1 -1
- package/lib/plugins/multi-camera/MultiCamera.d.ts +21 -4
- package/lib/plugins/multi-camera/MultiCamera.d.ts.map +1 -1
- package/lib/plugins/multi-camera/MultiCamera.js +70 -134
- package/lib/plugins/source-controller/SourceController.d.ts +0 -39
- package/lib/plugins/source-controller/SourceController.d.ts.map +1 -1
- package/lib/plugins/source-controller/SourceController.js +0 -39
- package/lib/utils/mediaSources.d.ts +4 -0
- package/lib/utils/mediaSources.d.ts.map +1 -1
- package/lib/utils/mediaSources.js +8 -6
- package/package.json +1 -1
- package/src/playback/dash-playback/DashPlayback.ts +1 -2
- package/src/playback/hls-playback/HlsPlayback.ts +1 -1
- package/src/playback/types.ts +10 -0
- package/src/playback.types.ts +0 -6
- package/src/plugins/multi-camera/MultiCamera.ts +103 -166
- package/src/plugins/source-controller/SourceController.ts +0 -39
- package/src/plugins/subtitles/ClosedCaptions.ts +1 -1
- package/src/utils/mediaSources.ts +10 -6
- package/tsconfig.tsbuildinfo +1 -1
- package/docs/api/player.multicamera.activebyid.md +0 -67
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
|
|
2
|
+
|
|
3
|
+
[Home](./index.md) > [@gcorevideo/player](./player.md) > [MulticCameraSourceInfo](./player.multiccamerasourceinfo.md)
|
|
4
|
+
|
|
5
|
+
## MulticCameraSourceInfo type
|
|
6
|
+
|
|
7
|
+
> This API is provided as a beta preview for developers and may change based on feedback that we receive. Do not use this API in a production environment.
|
|
8
|
+
>
|
|
9
|
+
|
|
10
|
+
Extended media source description
|
|
11
|
+
|
|
12
|
+
**Signature:**
|
|
13
|
+
|
|
14
|
+
```typescript
|
|
15
|
+
export type MulticCameraSourceInfo = {
|
|
16
|
+
description: string;
|
|
17
|
+
dvr: boolean;
|
|
18
|
+
hls_mpegts_url: string | null;
|
|
19
|
+
id: number;
|
|
20
|
+
live: boolean;
|
|
21
|
+
projection: string | null;
|
|
22
|
+
screenshot: string | null;
|
|
23
|
+
source: string;
|
|
24
|
+
source_dash: string | null;
|
|
25
|
+
title: string;
|
|
26
|
+
};
|
|
27
|
+
```
|
|
@@ -1,18 +1,15 @@
|
|
|
1
1
|
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
|
|
2
2
|
|
|
3
|
-
[Home](./index.md) > [@gcorevideo/player](./player.md) > [
|
|
3
|
+
[Home](./index.md) > [@gcorevideo/player](./player.md) > [MultisourcesMode](./player.multisourcesmode.md)
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## MultisourcesMode type
|
|
6
6
|
|
|
7
7
|
> This API is provided as a beta preview for developers and may change based on feedback that we receive. Do not use this API in a production environment.
|
|
8
8
|
>
|
|
9
9
|
|
|
10
|
+
|
|
10
11
|
**Signature:**
|
|
11
12
|
|
|
12
13
|
```typescript
|
|
13
|
-
|
|
14
|
+
export type MultisourcesMode = 'one_first' | 'only_live' | 'show_all';
|
|
14
15
|
```
|
|
15
|
-
**Returns:**
|
|
16
|
-
|
|
17
|
-
void
|
|
18
|
-
|
|
@@ -15,43 +15,6 @@ export declare class SourceController extends CorePlugin
|
|
|
15
15
|
|
|
16
16
|
## Remarks
|
|
17
17
|
|
|
18
|
-
Have a look at the [source failover diagram](https://miro.com/app/board/uXjVLiN15tY=/?share_link_id=390327585787) for the details on how sources ordering and selection works. Below is a simplified diagram:
|
|
19
|
-
|
|
20
|
-
```markdown
|
|
21
|
-
sources_list:
|
|
22
|
-
- a.mpd | +--------------------+
|
|
23
|
-
- b.m3u8 |--->| init |
|
|
24
|
-
- ... | |--------------------|
|
|
25
|
-
| current_source = 0 |
|
|
26
|
-
+--------------------+
|
|
27
|
-
|
|
|
28
|
-
| source = a.mpd
|
|
29
|
-
| playback = dash.js
|
|
30
|
-
v
|
|
31
|
-
+------------------+
|
|
32
|
-
+-->| load source |
|
|
33
|
-
| +---------|--------+
|
|
34
|
-
| v
|
|
35
|
-
| +------------------+
|
|
36
|
-
| | play |
|
|
37
|
-
| +---------|--------+
|
|
38
|
-
| |
|
|
39
|
-
| v
|
|
40
|
-
| +-----------------------+
|
|
41
|
-
| | on playback_error |
|
|
42
|
-
| |-----------------------|
|
|
43
|
-
| | current_source = |
|
|
44
|
-
| | (current_source + 1) |
|
|
45
|
-
| | % len sources_list |
|
|
46
|
-
| | |
|
|
47
|
-
| | delay 1..3s |
|
|
48
|
-
| +---------------|-------+
|
|
49
|
-
| |
|
|
50
|
-
| source=b.m3u8 |
|
|
51
|
-
| playback=hls.js |
|
|
52
|
-
+-------------------+
|
|
53
|
-
|
|
54
|
-
```
|
|
55
18
|
|
|
56
19
|
## Example
|
|
57
20
|
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { Playback } from '@clappr/core';
|
|
2
2
|
import { MediaPlayerClass, IManifestInfo } from 'dashjs';
|
|
3
|
-
import { QualityLevel, TimePosition, TimeValue
|
|
3
|
+
import { QualityLevel, TimePosition, TimeValue } from '../../playback.types.js';
|
|
4
4
|
import { BasePlayback } from '../BasePlayback.js';
|
|
5
|
+
import { VTTCueInfo } from '../types.js';
|
|
5
6
|
import { AudioTrack } from '@clappr/core/types/base/playback/playback.js';
|
|
6
7
|
type PlaybackType = typeof Playback.VOD | typeof Playback.LIVE | typeof Playback.AOD | typeof Playback.NO_OP;
|
|
7
8
|
type PlaylistType = string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DashPlayback.d.ts","sourceRoot":"","sources":["../../../src/playback/dash-playback/DashPlayback.ts"],"names":[],"mappings":"AAKA,OAAO,EAAe,QAAQ,EAAyB,MAAM,cAAc,CAAA;AAG3E,OAAO,EAGL,gBAAgB,EAKhB,aAAa,EAQd,MAAM,QAAQ,CAAA;AAEf,OAAO,EAGL,YAAY,EACZ,YAAY,EACZ,SAAS,
|
|
1
|
+
{"version":3,"file":"DashPlayback.d.ts","sourceRoot":"","sources":["../../../src/playback/dash-playback/DashPlayback.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import HLSJS, { Events as HlsEvents, type LevelSwitchingData } from 'hls.js';
|
|
2
|
-
import { QualityLevel
|
|
2
|
+
import { QualityLevel } from '../../playback.types.js';
|
|
3
3
|
import { PlaybackType } from '../../types.js';
|
|
4
4
|
import { BasePlayback } from '../BasePlayback.js';
|
|
5
5
|
import { AudioTrack } from '@clappr/core/types/base/playback/playback.js';
|
|
6
|
+
import { VTTCueInfo } from '../types.js';
|
|
6
7
|
export default class HlsPlayback extends BasePlayback {
|
|
7
8
|
private _ccTracksUpdated;
|
|
8
9
|
private _currentFragment;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HlsPlayback.d.ts","sourceRoot":"","sources":["../../../src/playback/hls-playback/HlsPlayback.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,EACZ,MAAM,IAAI,SAAS,EAMnB,KAAK,kBAAkB,EAMxB,MAAM,QAAQ,CAAA;AAEf,OAAO,EAIL,YAAY,
|
|
1
|
+
{"version":3,"file":"HlsPlayback.d.ts","sourceRoot":"","sources":["../../../src/playback/hls-playback/HlsPlayback.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,EACZ,MAAM,IAAI,SAAS,EAMnB,KAAK,kBAAkB,EAMxB,MAAM,QAAQ,CAAA;AAEf,OAAO,EAIL,YAAY,EAEb,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAG7C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAGjD,OAAO,EAAE,UAAU,EAAE,MAAM,8CAA8C,CAAA;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAmCxC,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,YAAY;IACnD,OAAO,CAAC,gBAAgB,CAAQ;IAEhC,OAAO,CAAC,gBAAgB,CAAwB;IAEhD,OAAO,CAAC,aAAa,CAAsB;IAE3C,OAAO,CAAC,mCAAmC,CAAQ;IAEnD,OAAO,CAAC,8BAA8B,CAAI;IAE1C,OAAO,CAAC,cAAc,CAAQ;IAE9B,OAAO,CAAC,IAAI,CAAqB;IAEjC,OAAO,CAAC,aAAa,CAAsB;IAE3C,OAAO,CAAC,eAAe,CAA4B;IAEnD,OAAO,CAAC,OAAO,CAA8B;IAE7C,OAAO,CAAC,0BAA0B,CAA+B;IAEjE,OAAO,CAAC,wBAAwB,CAA+B;IAE/D,OAAO,CAAC,eAAe,CAAQ;IAE/B,OAAO,CAAC,uBAAuB,CAAI;IAEnC,OAAO,CAAC,aAAa,CAA6C;IAElE,OAAO,CAAC,aAAa,CAA4B;IAEjD,OAAO,CAAC,wBAAwB,CAAI;IAEpC,OAAO,CAAC,gBAAgB,CAAsB;IAE9C,OAAO,CAAC,yBAAyB,CAAI;IAErC,OAAO,CAAC,yBAAyB,CAAQ;IAEzC,OAAO,CAAC,uBAAuB,CAAQ;IAEvC,OAAO,CAAC,sBAAsB,CAAsB;IAEpD,OAAO,CAAC,gBAAgB,CAAuB;IAE/C,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC,GAAG,IAAI,CAAO;IAEnD,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC,GAAG,IAAI,CAAO;IAEtD,OAAO,CAAC,IAAI,CAAmB;IAE/B,OAAO,CAAC,YAAY,CAAsB;IAE1C;;OAEG;IACH,IAAI,IAAI,WAEP;IAED;;OAEG;IACH,IAAI,gBAAgB;;MAEnB;IAED,IAAI,MAAM,mBAET;IAED,IAAI,YAAY,IAIK,MAAM,CAF1B;IAED,IAAI,YAAY,CAAC,EAAE,EAAE,MAAM,EAS1B;IAED,IAAI,OAAO,WAGV;IAED,IAAI,sBAAsB,SAIzB;IAED,OAAO,KAAK,UAAU,GASrB;IAED,OAAO,KAAK,IAAI,GAEf;IAID,OAAO,KAAK,sBAAsB,GAcjC;IAID,IAAI,oBAAoB,WAevB;IAED,OAAO,KAAK,SAAS,GAEpB;IAmBD,OAAO,KAAK,2BAA2B,GAMtC;IAED,IAAI,iBAAiB,kBAEpB;IAED,IAAI,cAAc;;MAEjB;IAED,IAAI,eAAe,QAKlB;IAED,IAAI,WAAW,QAEd;IAED,IAAI,gBAAgB,kBAcnB;IAED,MAAM,KAAK,KAAK,iBAEf;gBAEW,GAAG,IAAI,EAAE,GAAG,EAAE;IAU1B,OAAO,CAAC,gBAAgB;IAmDxB,OAAO,CAAC,MAAM;IAOd,OAAO,CAAC,mBAAmB;IAY3B,OAAO,CAAC,kBAAkB;IAc1B,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,gBAAgB;IAqExB,OAAO,CAAC,mBAAmB;IAU3B,OAAO,CAAC,qBAAqB;cASV,MAAM;cAMN,MAAM;IAKzB,OAAO,CAAC,QAAQ;cA0BG,SAAS,CAAC,MAAM,EAAE,MAAM;IAE3C,OAAO,CAAC,qBAAqB;IAU7B,OAAO,CAAC,oBAAoB;IAQ5B,OAAO,CAAC,kBAAkB;IAO1B,WAAW;IAIX,cAAc;IAad,kBAAkB;IAIlB,cAAc,CAAC,UAAU,EAAE,MAAM;IAOjC,IAAI,CAAC,IAAI,EAAE,MAAM;IAejB,eAAe;IAIf,OAAO,CAAC,UAAU;IAKlB,OAAO,CAAC,eAAe;IAiBvB,OAAO,CAAC,aAAa;IA4GrB,OAAO,CAAC,MAAM;IAMd,OAAO,CAAC,YAAY;IAUX,aAAa;IAkBb,iBAAiB;IAUjB,WAAW;IAwCpB,OAAO,CAAC,WAAW;IAcV,IAAI,CAAC,GAAG,EAAE,MAAM;IAMhB,IAAI;IAUJ,KAAK;IAUd,IAAI;IAQJ,OAAO;IAMP,OAAO,CAAC,mBAAmB;IAsB3B,OAAO,CAAC,WAAW;IAanB,OAAO,CAAC,eAAe;IAkJvB,cAAc,CAAC,GAAG,EAAE,SAAS,CAAC,eAAe,EAAE,IAAI,EAAE,kBAAkB;IAOvE,gBAAgB,CAAC,GAAG,EAAE,SAAS,CAAC,cAAc,EAAE,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE;IAmBvE,IAAI,UAAU,YAUb;IAED,eAAe;IAIf,aAAa;IAIb,OAAO,CAAC,YAAY;IAUpB,IAAI,WAAW,IAAI,UAAU,EAAE,CAG9B;IAGD,IAAI,iBAAiB,IAAI,UAAU,GAAG,IAAI,CAQzC;IAED,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAKlC,OAAO,CAAC,qBAAqB;IAU7B,OAAO,CAAC,qBAAqB;IAU7B,YAAY,CAAC,EAAE,EAAE,MAAM;IAQvB;;OAEG;IACH,IAAI,oBAAoB;;;;;;;;QAEvB;IAED,aAAa;;;;;;;;;CAWd"}
|
package/lib/playback/types.d.ts
CHANGED
|
@@ -6,4 +6,13 @@ export declare enum PlaybackEvents {
|
|
|
6
6
|
*/
|
|
7
7
|
PLAYBACK_RATE_CHANGED = "playback:rate-changed"
|
|
8
8
|
}
|
|
9
|
+
/**
|
|
10
|
+
* @internal
|
|
11
|
+
*/
|
|
12
|
+
export type VTTCueInfo = {
|
|
13
|
+
id: string;
|
|
14
|
+
start: number;
|
|
15
|
+
end: number;
|
|
16
|
+
text: string;
|
|
17
|
+
};
|
|
9
18
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/playback/types.ts"],"names":[],"mappings":"AAAA,oBAAY,cAAc;IACxB;;;;OAIG;IACH,qBAAqB,0BAA0B;CAChD"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/playback/types.ts"],"names":[],"mappings":"AAAA,oBAAY,cAAc;IACxB;;;;OAIG;IACH,qBAAqB,0BAA0B;CAChD;AAED;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;CACb,CAAA"}
|
package/lib/playback.types.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"playback.types.d.ts","sourceRoot":"","sources":["../src/playback.types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,CAAA;AAE9B;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,OAAO,EAAE,SAAS,CAAA;IAClB;;OAEG;IACH,KAAK,EAAE,SAAS,CAAA;CACjB;AAED;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB;;OAEG;IACH,KAAK,EAAE,SAAS,CAAA;IAChB;;OAEG;IACH,OAAO,EAAE,SAAS,CAAA;IAClB;;OAEG;IACH,KAAK,EAAE,SAAS,CAAA;CACjB,CAAA;AAED;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG,YAAY,CAAA;AAErC;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAA;IACb;;OAEG;IACH,KAAK,EAAE,MAAM,CAAA;IACb;;OAEG;IACH,MAAM,EAAE,MAAM,CAAA;IACd;;OAEG;IACH,OAAO,EAAE,MAAM,CAAA;CAChB;AAED;;;GAGG;AACH,oBAAY,iBAAiB;IAC3B;;OAEG;IACH,OAAO,kBAAkB;IACzB;;OAEG;IACH,sBAAsB,6BAA6B;IACnD;;OAEG;IACH,uBAAuB,+BAA+B;CACvD;AAED;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAA;AAElD;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAAG,WAAW,GAAG,MAAM,GAAG,UAAU,CAAA;AAEnE;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,IAAI,EAAE,iBAAiB,CAAA;IACvB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAA;IACnB;;OAEG;IACH,KAAK,EAAE,UAAU,CAAA;IACjB;;OAEG;IACH,OAAO,EAAE,MAAM,CAAA;IACf;;;;;;OAMG;IACH,MAAM,EAAE,MAAM,CAAA;IACd;;OAEG;IACH,KAAK,EAAE,mBAAmB,CAAA;IAE1B;;OAEG;IACH,EAAE,CAAC,EAAE;QACH,KAAK,EAAE,MAAM,CAAA;QACb,OAAO,EAAE,MAAM,CAAA;QACf,IAAI,CAAC,EAAE,MAAM,CAAA;KACd,CAAA;CACF
|
|
1
|
+
{"version":3,"file":"playback.types.d.ts","sourceRoot":"","sources":["../src/playback.types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,CAAA;AAE9B;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,OAAO,EAAE,SAAS,CAAA;IAClB;;OAEG;IACH,KAAK,EAAE,SAAS,CAAA;CACjB;AAED;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB;;OAEG;IACH,KAAK,EAAE,SAAS,CAAA;IAChB;;OAEG;IACH,OAAO,EAAE,SAAS,CAAA;IAClB;;OAEG;IACH,KAAK,EAAE,SAAS,CAAA;CACjB,CAAA;AAED;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG,YAAY,CAAA;AAErC;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAA;IACb;;OAEG;IACH,KAAK,EAAE,MAAM,CAAA;IACb;;OAEG;IACH,MAAM,EAAE,MAAM,CAAA;IACd;;OAEG;IACH,OAAO,EAAE,MAAM,CAAA;CAChB;AAED;;;GAGG;AACH,oBAAY,iBAAiB;IAC3B;;OAEG;IACH,OAAO,kBAAkB;IACzB;;OAEG;IACH,sBAAsB,6BAA6B;IACnD;;OAEG;IACH,uBAAuB,+BAA+B;CACvD;AAED;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAA;AAElD;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAAG,WAAW,GAAG,MAAM,GAAG,UAAU,CAAA;AAEnE;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,IAAI,EAAE,iBAAiB,CAAA;IACvB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAA;IACnB;;OAEG;IACH,KAAK,EAAE,UAAU,CAAA;IACjB;;OAEG;IACH,OAAO,EAAE,MAAM,CAAA;IACf;;;;;;OAMG;IACH,MAAM,EAAE,MAAM,CAAA;IACd;;OAEG;IACH,KAAK,EAAE,mBAAmB,CAAA;IAE1B;;OAEG;IACH,EAAE,CAAC,EAAE;QACH,KAAK,EAAE,MAAM,CAAA;QACb,OAAO,EAAE,MAAM,CAAA;QACf,IAAI,CAAC,EAAE,MAAM,CAAA;KACd,CAAA;CACF"}
|
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
import { Core, UICorePlugin } from '@clappr/core';
|
|
2
2
|
import '../../../assets/multi-camera/style.scss';
|
|
3
|
+
/**
|
|
4
|
+
* @beta
|
|
5
|
+
*/
|
|
6
|
+
export type MultisourcesMode = 'one_first' | 'only_live' | 'show_all';
|
|
7
|
+
/**
|
|
8
|
+
* Extended media source description
|
|
9
|
+
* @beta
|
|
10
|
+
*/
|
|
11
|
+
export type MulticCameraSourceInfo = {
|
|
12
|
+
description: string;
|
|
13
|
+
dvr: boolean;
|
|
14
|
+
hls_mpegts_url: string | null;
|
|
15
|
+
id: number;
|
|
16
|
+
live: boolean;
|
|
17
|
+
projection: string | null;
|
|
18
|
+
screenshot: string | null;
|
|
19
|
+
source: string;
|
|
20
|
+
source_dash: string | null;
|
|
21
|
+
title: string;
|
|
22
|
+
};
|
|
3
23
|
/**
|
|
4
24
|
* `PLUGIN` that adds support for loading multiple streams and switching between them using the media control UI.
|
|
5
25
|
* @beta
|
|
@@ -26,14 +46,13 @@ export declare class MultiCamera extends UICorePlugin {
|
|
|
26
46
|
};
|
|
27
47
|
constructor(core: Core);
|
|
28
48
|
bindEvents(): void;
|
|
29
|
-
unBindEvents
|
|
49
|
+
private unBindEvents;
|
|
30
50
|
private onPlay;
|
|
31
51
|
private bindPlaybackEvents;
|
|
32
52
|
private reload;
|
|
33
53
|
private shouldRender;
|
|
34
54
|
render(): this;
|
|
35
55
|
private onCameraSelect;
|
|
36
|
-
activeById(id: number, active: boolean): void;
|
|
37
56
|
private setLiveStatus;
|
|
38
57
|
private behaviorLive;
|
|
39
58
|
private behaviorOne;
|
|
@@ -42,8 +61,6 @@ export declare class MultiCamera extends UICorePlugin {
|
|
|
42
61
|
private showError;
|
|
43
62
|
private hideError;
|
|
44
63
|
private changeById;
|
|
45
|
-
private getCamerasList;
|
|
46
|
-
private getCurrentCamera;
|
|
47
64
|
private findElementById;
|
|
48
65
|
private findIndexById;
|
|
49
66
|
private onShowLevelSelectMenu;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MultiCamera.d.ts","sourceRoot":"","sources":["../../../src/plugins/multi-camera/MultiCamera.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,IAAI,EAIJ,YAAY,EACb,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"MultiCamera.d.ts","sourceRoot":"","sources":["../../../src/plugins/multi-camera/MultiCamera.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,IAAI,EAIJ,YAAY,EACb,MAAM,cAAc,CAAA;AAOrB,OAAO,yCAAyC,CAAA;AAKhD;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG,WAAW,GAAG,UAAU,CAAA;AAErE;;;GAGG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACnC,WAAW,EAAE,MAAM,CAAA;IACnB,GAAG,EAAE,OAAO,CAAA;IACZ,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,OAAO,CAAA;IACb,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAMD;;;GAGG;AACH,qBAAa,WAAY,SAAQ,YAAY;IAC3C,OAAO,CAAC,aAAa,CAAsC;IAE3D,OAAO,CAAC,WAAW,CAAY;IAE/B,OAAO,CAAC,OAAO,CAAQ;IAEvB,OAAO,CAAC,WAAW,CAA+B;IAElD,OAAO,CAAC,eAAe,CAAQ;IAE/B,IAAI,IAAI,WAEP;IAED,IAAI,gBAAgB;;MAEnB;IAED,MAAM,KAAK,OAAO,WAEjB;IAED,IAAI,QAAQ,QAEX;IAED,IAAa,UAAU;;;MAKtB;IAED,IAAa,MAAM;;;MAKlB;gBAEW,IAAI,EAAE,IAAI;IAmBb,UAAU;IAmBnB,OAAO,CAAC,YAAY;IAgBpB,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,kBAAkB;IAM1B,OAAO,CAAC,MAAM;IAMd,OAAO,CAAC,YAAY;IAQX,MAAM;IA2Df,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,aAAa;IAerB,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,qBAAqB;IAqB7B,OAAO,CAAC,SAAS;IAmBjB,OAAO,CAAC,SAAS;IAQjB,OAAO,CAAC,UAAU;IA0ClB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,qBAAqB;IAI7B,OAAO,CAAC,mBAAmB;IAI3B,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,qBAAqB;CAM9B"}
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import { Browser, Events, Playback, template, UICorePlugin, } from '@clappr/core';
|
|
2
2
|
import { reportError, trace } from '@gcorevideo/utils';
|
|
3
|
+
import { guessMimeType, MIME_TYPE_DASH } from '../../utils/mediaSources.js';
|
|
3
4
|
import { CLAPPR_VERSION } from '../../build.js';
|
|
4
5
|
import pluginHtml from '../../../assets/multi-camera/multicamera.ejs';
|
|
5
6
|
import '../../../assets/multi-camera/style.scss';
|
|
6
7
|
import streamsIcon from '../../../assets/icons/old/streams.svg';
|
|
7
|
-
import streamsMomentoIcon from '../../../assets/icons/old/language.svg';
|
|
8
|
-
import streamsWhiteNightsIcon from '../../../assets/icons/old/wn.svg';
|
|
9
8
|
const VERSION = '0.0.1';
|
|
10
9
|
const T = 'plugins.multicamera';
|
|
11
10
|
/**
|
|
@@ -53,6 +52,8 @@ export class MultiCamera extends UICorePlugin {
|
|
|
53
52
|
// Don't mutate the options, TODO check if some plugin observes the options.multicamera
|
|
54
53
|
this.multicamera = this.options.multisources.map((item) => ({ ...item }));
|
|
55
54
|
this.noActiveStreams = this.multicamera.every((item) => !item.live);
|
|
55
|
+
// TODO filter out non-live
|
|
56
|
+
this.core.options.sources = expandMediaSource(this.multicamera[0]);
|
|
56
57
|
}
|
|
57
58
|
bindEvents() {
|
|
58
59
|
this.listenTo(this.core, Events.CORE_READY, this.bindPlaybackEvents);
|
|
@@ -61,15 +62,10 @@ export class MultiCamera extends UICorePlugin {
|
|
|
61
62
|
this.listenTo(this.core.mediaControl, Events.MEDIACONTROL_HIDE, this.hideSelectLevelMenu);
|
|
62
63
|
}
|
|
63
64
|
unBindEvents() {
|
|
64
|
-
|
|
65
|
-
this.stopListening(this.core, Events.
|
|
66
|
-
|
|
67
|
-
this.stopListening(this.core.mediaControl, Events.
|
|
68
|
-
// @ts-ignore
|
|
69
|
-
this.stopListening(this.core.mediaControl, Events.MEDIACONTROL_RENDERED);
|
|
70
|
-
// @ts-ignore
|
|
71
|
-
this.stopListening(this.core.mediaControl, Events.MEDIACONTROL_HIDE);
|
|
72
|
-
// @ts-ignore
|
|
65
|
+
this.stopListening(this.core, Events.CORE_READY, this.bindPlaybackEvents);
|
|
66
|
+
this.stopListening(this.core.mediaControl, Events.MEDIACONTROL_CONTAINERCHANGED, this.reload);
|
|
67
|
+
this.stopListening(this.core.mediaControl, Events.MEDIACONTROL_RENDERED, this.render);
|
|
68
|
+
this.stopListening(this.core.mediaControl, Events.MEDIACONTROL_HIDE, this.hideSelectLevelMenu);
|
|
73
69
|
this.stopListening(this.core.activePlayback, Events.PLAYBACK_PLAY, this.onPlay);
|
|
74
70
|
}
|
|
75
71
|
onPlay() {
|
|
@@ -85,80 +81,53 @@ export class MultiCamera extends UICorePlugin {
|
|
|
85
81
|
this.bindPlaybackEvents();
|
|
86
82
|
}
|
|
87
83
|
shouldRender() {
|
|
88
|
-
if (
|
|
89
|
-
return false;
|
|
90
|
-
}
|
|
91
|
-
if (!this.core.activePlayback) {
|
|
84
|
+
if (this.noActiveStreams) {
|
|
92
85
|
return false;
|
|
93
86
|
}
|
|
94
87
|
return this.multicamera.length >= 2;
|
|
95
88
|
}
|
|
96
89
|
render() {
|
|
97
|
-
if (this.
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
}
|
|
109
|
-
// const mediaControl = this.core.getPlugin('media_control')
|
|
110
|
-
if (this.currentTime &&
|
|
111
|
-
// TODO check the last active playback type instead
|
|
112
|
-
// !mediaControl.$el.hasClass('live') &&
|
|
113
|
-
this.core.getPlaybackType() !== Playback.LIVE) {
|
|
114
|
-
if (this.currentTime < this.core.activePlayback.getDuration()) {
|
|
115
|
-
this.core.activePlayback.seek(this.currentTime);
|
|
116
|
-
}
|
|
117
|
-
this.currentTime = 0;
|
|
118
|
-
// if (mediaControl.$el.hasClass('dvr')) {
|
|
119
|
-
// this.core.activeContainer.dvrInUse = true;
|
|
120
|
-
// }
|
|
121
|
-
}
|
|
122
|
-
// TODO current source
|
|
123
|
-
this.$el.html(this.template({
|
|
124
|
-
streams: this.multicamera,
|
|
125
|
-
multisources_mode: this.options.multisourcesMode,
|
|
126
|
-
}));
|
|
127
|
-
if ((numActiveSources <= 1 &&
|
|
128
|
-
this.options.multisourcesMode !== 'show_all') ||
|
|
129
|
-
this.options.multisourcesMode === 'one_first') {
|
|
130
|
-
this.$el.hide();
|
|
131
|
-
}
|
|
132
|
-
else {
|
|
133
|
-
this.$el.show();
|
|
134
|
-
}
|
|
135
|
-
if (this.core.mediaControl.$multiCameraSelector &&
|
|
136
|
-
this.core.mediaControl.$multiCameraSelector.length > 0) {
|
|
137
|
-
this.core.mediaControl.$multiCameraSelector.append(this.el);
|
|
90
|
+
if (!this.core.activeContainer || !this.core.activePlayback) {
|
|
91
|
+
return this;
|
|
92
|
+
}
|
|
93
|
+
if (!this.shouldRender()) {
|
|
94
|
+
return this;
|
|
95
|
+
}
|
|
96
|
+
let numActiveSources = 0;
|
|
97
|
+
const currentSource = this.core.activePlayback?.sourceMedia;
|
|
98
|
+
for (const item of this.multicamera) {
|
|
99
|
+
if (item.live) {
|
|
100
|
+
numActiveSources++;
|
|
138
101
|
}
|
|
139
|
-
|
|
140
|
-
this.
|
|
102
|
+
if (!this.currentCamera && item.source === currentSource) {
|
|
103
|
+
this.currentCamera = item;
|
|
141
104
|
}
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
.append(streamsWhiteNightsIcon);
|
|
148
|
-
}
|
|
149
|
-
else if (~window.location.href.indexOf('momentosolutions.gcdn.co')) {
|
|
150
|
-
this.core.mediaControl.$multiCameraSelector
|
|
151
|
-
.find('span.multicamera-icon')
|
|
152
|
-
.append(streamsMomentoIcon);
|
|
153
|
-
}
|
|
154
|
-
else {
|
|
155
|
-
this.core.mediaControl.$multiCameraSelector
|
|
156
|
-
.find('span.multicamera-icon')
|
|
157
|
-
.append(streamsIcon);
|
|
158
|
-
}
|
|
105
|
+
}
|
|
106
|
+
if (this.currentTime &&
|
|
107
|
+
this.core.getPlaybackType() !== Playback.LIVE) {
|
|
108
|
+
if (this.currentTime < this.core.activePlayback.getDuration()) {
|
|
109
|
+
this.core.activePlayback.seek(this.currentTime);
|
|
159
110
|
}
|
|
160
|
-
this.
|
|
111
|
+
this.currentTime = 0;
|
|
161
112
|
}
|
|
113
|
+
this.$el.html(this.template({
|
|
114
|
+
streams: this.multicamera,
|
|
115
|
+
multisources_mode: this.options.multisourcesMode,
|
|
116
|
+
}));
|
|
117
|
+
if ((numActiveSources < 2 &&
|
|
118
|
+
this.options.multisourcesMode !== 'show_all') ||
|
|
119
|
+
this.options.multisourcesMode === 'one_first') {
|
|
120
|
+
this.$el.hide();
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
this.$el.show();
|
|
124
|
+
}
|
|
125
|
+
const mediaControl = this.core.getPlugin('media_control');
|
|
126
|
+
mediaControl.slot('multicamera', this.$el);
|
|
127
|
+
this.$el
|
|
128
|
+
.find('span.multicamera-icon')
|
|
129
|
+
.html(streamsIcon);
|
|
130
|
+
this.highlightCurrentLevel();
|
|
162
131
|
return this;
|
|
163
132
|
}
|
|
164
133
|
onCameraSelect(event) {
|
|
@@ -171,33 +140,6 @@ export class MultiCamera extends UICorePlugin {
|
|
|
171
140
|
event.stopPropagation();
|
|
172
141
|
return false;
|
|
173
142
|
}
|
|
174
|
-
activeById(id, active) {
|
|
175
|
-
this.setLiveStatus(id, active);
|
|
176
|
-
if (!this.currentCamera && !this.noActiveStreams) {
|
|
177
|
-
return;
|
|
178
|
-
}
|
|
179
|
-
if (this.noActiveStreams && !active) {
|
|
180
|
-
return;
|
|
181
|
-
}
|
|
182
|
-
if (this.currentCamera) {
|
|
183
|
-
if (this.options.multisourcesMode === 'only_live') {
|
|
184
|
-
this.behaviorLive(id, active);
|
|
185
|
-
}
|
|
186
|
-
if (this.options.multisourcesMode === 'one_first') {
|
|
187
|
-
this.behaviorOne(id, active);
|
|
188
|
-
}
|
|
189
|
-
if (this.options.multisourcesMode === 'show_all') {
|
|
190
|
-
this.behaviorAll(id, active);
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
else {
|
|
194
|
-
if (this.noActiveStreams && active) {
|
|
195
|
-
this.changeById(id);
|
|
196
|
-
this.noActiveStreams = false;
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
this.render();
|
|
200
|
-
}
|
|
201
143
|
setLiveStatus(id, active) {
|
|
202
144
|
try {
|
|
203
145
|
const index = this.findIndexById(id);
|
|
@@ -260,7 +202,6 @@ export class MultiCamera extends UICorePlugin {
|
|
|
260
202
|
this.currentCamera = null;
|
|
261
203
|
this.noActiveStreams = true;
|
|
262
204
|
this.core.trigger('core:multicamera:no_active_translation');
|
|
263
|
-
// this.changeById(this.multicamera[nextIndex].id);
|
|
264
205
|
}
|
|
265
206
|
showError() {
|
|
266
207
|
this.core.activePlayback.pause();
|
|
@@ -283,7 +224,7 @@ export class MultiCamera extends UICorePlugin {
|
|
|
283
224
|
}
|
|
284
225
|
hideError() {
|
|
285
226
|
try {
|
|
286
|
-
this.core.
|
|
227
|
+
this.core.getPlugin('media_control')?.enableControlButton();
|
|
287
228
|
}
|
|
288
229
|
catch (error) {
|
|
289
230
|
reportError(error);
|
|
@@ -293,14 +234,9 @@ export class MultiCamera extends UICorePlugin {
|
|
|
293
234
|
trace(`${T} changeById`, { id });
|
|
294
235
|
queueMicrotask(() => {
|
|
295
236
|
const playbackOptions = this.core.options.playback || {};
|
|
296
|
-
// TODO figure out
|
|
237
|
+
// TODO figure out if it's needed
|
|
297
238
|
playbackOptions.recycleVideo = Browser.isMobile;
|
|
298
|
-
this.currentCamera = this.findElementById(id)
|
|
299
|
-
trace(`${T} changeById`, {
|
|
300
|
-
id,
|
|
301
|
-
currentCamera: this.currentCamera,
|
|
302
|
-
multicamera: this.multicamera,
|
|
303
|
-
});
|
|
239
|
+
this.currentCamera = this.findElementById(id);
|
|
304
240
|
if (!this.currentCamera) {
|
|
305
241
|
return;
|
|
306
242
|
}
|
|
@@ -322,26 +258,16 @@ export class MultiCamera extends UICorePlugin {
|
|
|
322
258
|
this.core.configure({
|
|
323
259
|
playback: playbackOptions,
|
|
324
260
|
source: this.currentCamera.source, // TODO ensure that the preferred transport is used
|
|
325
|
-
video360: {
|
|
326
|
-
// TODO
|
|
327
|
-
projection: this.currentCamera.projection,
|
|
328
|
-
},
|
|
329
261
|
fullscreenDisable,
|
|
330
262
|
autoPlay: this.playing,
|
|
331
263
|
disableCanAutoPlay: true,
|
|
332
264
|
});
|
|
333
|
-
this.core.activeContainer
|
|
265
|
+
this.core.activeContainer?.enableMediaControl();
|
|
334
266
|
});
|
|
335
267
|
this.toggleContextMenu();
|
|
336
268
|
}
|
|
337
|
-
getCamerasList() {
|
|
338
|
-
return this.multicamera;
|
|
339
|
-
}
|
|
340
|
-
getCurrentCamera() {
|
|
341
|
-
return this.currentCamera;
|
|
342
|
-
}
|
|
343
269
|
findElementById(id) {
|
|
344
|
-
return this.multicamera.find((element) => element.id === id);
|
|
270
|
+
return this.multicamera.find((element) => element.id === id) ?? null;
|
|
345
271
|
}
|
|
346
272
|
findIndexById(id) {
|
|
347
273
|
return this.multicamera.findIndex((element) => element.id === id);
|
|
@@ -351,20 +277,14 @@ export class MultiCamera extends UICorePlugin {
|
|
|
351
277
|
}
|
|
352
278
|
hideSelectLevelMenu() {
|
|
353
279
|
;
|
|
354
|
-
this.$('
|
|
280
|
+
this.$('ul').hide();
|
|
355
281
|
}
|
|
356
282
|
toggleContextMenu() {
|
|
357
283
|
;
|
|
358
|
-
this.$('
|
|
359
|
-
}
|
|
360
|
-
// private buttonElement(): ZeptoResult {
|
|
361
|
-
// return this.$('.multicamera button');
|
|
362
|
-
// }
|
|
363
|
-
// private buttonElementText(): ZeptoResult {
|
|
364
|
-
// return this.$('.multicamera button .quality-text');
|
|
365
|
-
// }
|
|
284
|
+
this.$('ul').toggle();
|
|
285
|
+
}
|
|
366
286
|
levelElement(id) {
|
|
367
|
-
return this.$('.multicamera
|
|
287
|
+
return this.$('ul .multicamera-item' +
|
|
368
288
|
(id !== undefined
|
|
369
289
|
? '[data-multicamera-selector-select="' + id + '"]'
|
|
370
290
|
: ''));
|
|
@@ -376,3 +296,19 @@ export class MultiCamera extends UICorePlugin {
|
|
|
376
296
|
this.levelElement(this.currentCamera.id).addClass('multicamera-active');
|
|
377
297
|
}
|
|
378
298
|
}
|
|
299
|
+
function expandMediaSource(source) {
|
|
300
|
+
const result = [{
|
|
301
|
+
source: source.source,
|
|
302
|
+
mimeType: guessMimeType(source.source),
|
|
303
|
+
}];
|
|
304
|
+
if (source.source_dash) {
|
|
305
|
+
result.push({
|
|
306
|
+
source: source.source_dash,
|
|
307
|
+
mimeType: MIME_TYPE_DASH,
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
if (source.hls_mpegts_url) {
|
|
311
|
+
result.push(source.hls_mpegts_url);
|
|
312
|
+
}
|
|
313
|
+
return result;
|
|
314
|
+
}
|
|
@@ -4,45 +4,6 @@ import { type PlayerMediaSourceDesc } from '../../types.js';
|
|
|
4
4
|
* `PLUGIN` that is managing the automatic failover between media sources.
|
|
5
5
|
* @public
|
|
6
6
|
* @remarks
|
|
7
|
-
* Have a look at the {@link https://miro.com/app/board/uXjVLiN15tY=/?share_link_id=390327585787 | source failover diagram} for the details
|
|
8
|
-
* on how sources ordering and selection works. Below is a simplified diagram:
|
|
9
|
-
*
|
|
10
|
-
* ```markdown
|
|
11
|
-
* sources_list:
|
|
12
|
-
* - a.mpd | +--------------------+
|
|
13
|
-
* - b.m3u8 |--->| init |
|
|
14
|
-
* - ... | |--------------------|
|
|
15
|
-
* | current_source = 0 |
|
|
16
|
-
* +--------------------+
|
|
17
|
-
* |
|
|
18
|
-
* | source = a.mpd
|
|
19
|
-
* | playback = dash.js
|
|
20
|
-
* v
|
|
21
|
-
* +------------------+
|
|
22
|
-
* +-->| load source |
|
|
23
|
-
* | +---------|--------+
|
|
24
|
-
* | v
|
|
25
|
-
* | +------------------+
|
|
26
|
-
* | | play |
|
|
27
|
-
* | +---------|--------+
|
|
28
|
-
* | |
|
|
29
|
-
* | v
|
|
30
|
-
* | +-----------------------+
|
|
31
|
-
* | | on playback_error |
|
|
32
|
-
* | |-----------------------|
|
|
33
|
-
* | | current_source = |
|
|
34
|
-
* | | (current_source + 1) |
|
|
35
|
-
* | | % len sources_list |
|
|
36
|
-
* | | |
|
|
37
|
-
* | | delay 1..3s |
|
|
38
|
-
* | +---------------|-------+
|
|
39
|
-
* | |
|
|
40
|
-
* | source=b.m3u8 |
|
|
41
|
-
* | playback=hls.js |
|
|
42
|
-
* +-------------------+
|
|
43
|
-
*
|
|
44
|
-
* ```
|
|
45
|
-
*
|
|
46
7
|
* @example
|
|
47
8
|
* ```ts
|
|
48
9
|
* import { SourceController } from '@gcorevideo/player'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SourceController.d.ts","sourceRoot":"","sources":["../../../src/plugins/source-controller/SourceController.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,UAAU,EACV,KAAK,IAAI,IAAI,UAAU,EACxB,MAAM,cAAc,CAAA;AAErB,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AAsB3D
|
|
1
|
+
{"version":3,"file":"SourceController.d.ts","sourceRoot":"","sources":["../../../src/plugins/source-controller/SourceController.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,UAAU,EACV,KAAK,IAAI,IAAI,UAAU,EACxB,MAAM,cAAc,CAAA;AAErB,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AAsB3D;;;;;;;;;;GAUG;AACH,qBAAa,gBAAiB,SAAQ,UAAU;IAwC9C,OAAO,CAAC,WAAW,CAA8B;IAEjD,OAAO,CAAC,kBAAkB,CAAI;IAE9B,OAAO,CAAC,YAAY,CAA6B;IAEjD,OAAO,CAAC,MAAM,CAAQ;IAEtB,OAAO,CAAC,QAAQ,CAAQ;IAExB,OAAO,CAAC,SAAS,CAAQ;IAEzB,OAAO,CAAC,IAAI,CAAiB;IAE7B;;OAEG;IACH,IAAI,IAAI,WAEP;IAED;;OAEG;IACH,IAAI,gBAAgB;;MAEnB;IAED;;OAEG;gBACS,IAAI,EAAE,UAAU;IAY5B;;;;;;;OAOG;IACH,cAAc,CAAC,WAAW,EAAE,qBAAqB,EAAE;IAQnD;;OAEG;IACM,UAAU;IAWnB,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,wBAAwB;IAgBhC,OAAO,CAAC,2BAA2B;IAiDnC,OAAO,CAAC,KAAK;IAKb,OAAO,CAAC,aAAa;IAgCrB,OAAO,CAAC,kBAAkB;IAe1B;;OAEG;IACH,MAAM,KAAK,OAAO,WAEjB;CACF"}
|
|
@@ -15,45 +15,6 @@ function noSync(cb) {
|
|
|
15
15
|
* `PLUGIN` that is managing the automatic failover between media sources.
|
|
16
16
|
* @public
|
|
17
17
|
* @remarks
|
|
18
|
-
* Have a look at the {@link https://miro.com/app/board/uXjVLiN15tY=/?share_link_id=390327585787 | source failover diagram} for the details
|
|
19
|
-
* on how sources ordering and selection works. Below is a simplified diagram:
|
|
20
|
-
*
|
|
21
|
-
* ```markdown
|
|
22
|
-
* sources_list:
|
|
23
|
-
* - a.mpd | +--------------------+
|
|
24
|
-
* - b.m3u8 |--->| init |
|
|
25
|
-
* - ... | |--------------------|
|
|
26
|
-
* | current_source = 0 |
|
|
27
|
-
* +--------------------+
|
|
28
|
-
* |
|
|
29
|
-
* | source = a.mpd
|
|
30
|
-
* | playback = dash.js
|
|
31
|
-
* v
|
|
32
|
-
* +------------------+
|
|
33
|
-
* +-->| load source |
|
|
34
|
-
* | +---------|--------+
|
|
35
|
-
* | v
|
|
36
|
-
* | +------------------+
|
|
37
|
-
* | | play |
|
|
38
|
-
* | +---------|--------+
|
|
39
|
-
* | |
|
|
40
|
-
* | v
|
|
41
|
-
* | +-----------------------+
|
|
42
|
-
* | | on playback_error |
|
|
43
|
-
* | |-----------------------|
|
|
44
|
-
* | | current_source = |
|
|
45
|
-
* | | (current_source + 1) |
|
|
46
|
-
* | | % len sources_list |
|
|
47
|
-
* | | |
|
|
48
|
-
* | | delay 1..3s |
|
|
49
|
-
* | +---------------|-------+
|
|
50
|
-
* | |
|
|
51
|
-
* | source=b.m3u8 |
|
|
52
|
-
* | playback=hls.js |
|
|
53
|
-
* +-------------------+
|
|
54
|
-
*
|
|
55
|
-
* ```
|
|
56
|
-
*
|
|
57
18
|
* @example
|
|
58
19
|
* ```ts
|
|
59
20
|
* import { SourceController } from '@gcorevideo/player'
|