1
- import Hls from 'hls.js' ;
1
+ import Hls , {
2
+ Loader ,
3
+ LoaderCallbacks ,
4
+ LoaderConfiguration ,
5
+ LoaderContext ,
6
+ LoaderResponse ,
7
+ LoaderStats ,
8
+ HlsConfig
9
+ } from 'hls.js' ;
2
10
import { useEffect , useRef } from 'react' ;
3
11
12
+ class CustomLoader implements Loader < LoaderContext > {
13
+ private loader : Loader < LoaderContext > ;
14
+
15
+ constructor ( config : HlsConfig ) {
16
+ const DefaultLoader = Hls . DefaultConfig . loader as new ( config : HlsConfig ) => Loader < LoaderContext > ;
17
+ this . loader = new DefaultLoader ( config ) ;
18
+ }
19
+
20
+ load ( context : LoaderContext , config : LoaderConfiguration , callbacks : LoaderCallbacks < LoaderContext > ) {
21
+ const { onSuccess, onError, onTimeout, onAbort, onProgress } = callbacks ;
22
+
23
+ const newCallbacks : LoaderCallbacks < LoaderContext > = {
24
+ onSuccess : ( response : LoaderResponse , stats : LoaderStats , context : LoaderContext , networkDetails : any = null ) => {
25
+ onSuccess ( response , stats , context , networkDetails ) ;
26
+ } ,
27
+ onError : (
28
+ error : { code : number ; text : string } ,
29
+ context : LoaderContext ,
30
+ networkDetails : any = null ,
31
+ stats : LoaderStats
32
+ ) => {
33
+ if ( error . code === 404 ) {
34
+ const emptyData = new ArrayBuffer ( 0 ) ;
35
+ onSuccess (
36
+ {
37
+ url : context . url ,
38
+ data : emptyData
39
+ } ,
40
+ {
41
+ trequest : performance . now ( ) ,
42
+ tfirst : performance . now ( ) ,
43
+ tload : performance . now ( ) ,
44
+ loaded : 0 ,
45
+ total : 0
46
+ } as unknown as LoaderStats ,
47
+ context ,
48
+ networkDetails
49
+ ) ;
50
+ } else {
51
+ if ( onError ) {
52
+ onError ( error , context , networkDetails , stats ) ;
53
+ }
54
+ }
55
+ } ,
56
+ onTimeout : ( stats : LoaderStats , context : LoaderContext , networkDetails : any = null ) => {
57
+ if ( onTimeout ) {
58
+ onTimeout ( stats , context , networkDetails ) ;
59
+ }
60
+ } ,
61
+ onAbort : ( stats : LoaderStats , context : LoaderContext , networkDetails : any = null ) => {
62
+ if ( onAbort ) {
63
+ onAbort ( stats , context , networkDetails ) ;
64
+ }
65
+ } ,
66
+ onProgress : (
67
+ stats : LoaderStats ,
68
+ context : LoaderContext ,
69
+ data : string | ArrayBuffer ,
70
+ networkDetails : any = null
71
+ ) => {
72
+ if ( onProgress ) {
73
+ onProgress ( stats , context , data , networkDetails ) ;
74
+ }
75
+ }
76
+ } ;
77
+
78
+ this . loader . load ( context , config , newCallbacks ) ;
79
+ }
80
+
81
+ abort ( ) {
82
+ this . loader . abort ( ) ;
83
+ }
84
+
85
+ destroy ( ) {
86
+ this . loader . destroy ( ) ;
87
+ }
88
+
89
+ get stats ( ) {
90
+ return this . loader . stats ;
91
+ }
92
+
93
+ get context ( ) {
94
+ return this . loader . context ;
95
+ }
96
+ }
97
+
4
98
export default function usePlayer ( url : string ) {
5
99
const videoRef = useRef < HTMLVideoElement | null > ( null ) ;
6
100
@@ -19,7 +113,8 @@ export default function usePlayer(url: string) {
19
113
20
114
const hls = new Hls ( {
21
115
enableWorker : true ,
22
- lowLatencyMode : true
116
+ lowLatencyMode : true ,
117
+ loader : CustomLoader
23
118
} ) ;
24
119
25
120
hls . loadSource ( url ) ;
0 commit comments