Skip to content
This repository was archived by the owner on Mar 13, 2025. It is now read-only.

Commit 18c81f8

Browse files
Added HLS Instance accessibility support
1 parent 739acb5 commit 18c81f8

File tree

3 files changed

+63
-4
lines changed

3 files changed

+63
-4
lines changed

example/App/App.tsx

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import Hls from 'hls.js';
12
import React, { useState, useRef } from 'react';
23

34
import HlsPlayer from '../../src';
@@ -9,6 +10,9 @@ function App() {
910
'https://bitdash-a.akamaihd.net/content/sintel/hls/playlist.m3u8'
1011
);
1112
const [destroy, setDestroy] = useState(false);
13+
const [HLSInstance, setHLSInstance] = useState<Hls>();
14+
const [displayHLSPrperties, setDisplayHLSPrperties] = useState(false)
15+
const [selectedQuality, setSelectedQuality] = useState<number>();
1216

1317
function _handleEnter(e: React.KeyboardEvent) {
1418
if (e.keyCode === 13) {
@@ -28,6 +32,19 @@ function App() {
2832
}
2933
}
3034

35+
function _handleHLSInstanceClick() {
36+
setDisplayHLSPrperties(!displayHLSPrperties)
37+
}
38+
39+
function getHLSInstance(hlsInstance: Hls) {
40+
setHLSInstance(hlsInstance);
41+
}
42+
43+
function handleQuality(e: React.ChangeEvent<HTMLSelectElement>) {
44+
setSelectedQuality(Number(e.target.value));
45+
if(HLSInstance) HLSInstance.currentLevel = Number(e.target.value);
46+
}
47+
3148
return (
3249
<div>
3350
<div
@@ -68,6 +85,7 @@ function App() {
6885
autoPlay
6986
playerRef={playerRef}
7087
src={hlsUrl}
88+
getHLSInstance={getHLSInstance}
7189
/>
7290
) : null}
7391

@@ -90,7 +108,36 @@ function App() {
90108
>
91109
Toggle Controls (via custom ref)
92110
</button>
93-
</div>
111+
<button
112+
style={{
113+
padding: '5px 10px',
114+
}}
115+
onClick={_handleHLSInstanceClick}
116+
>
117+
Get HLS Instance
118+
</button>
119+
120+
{displayHLSPrperties && (
121+
<div
122+
style={{
123+
padding: "5px 10px",
124+
border: "1px solid black",
125+
margin: "15px 15px",
126+
}}
127+
>
128+
<h3>HLS Details</h3>
129+
<p>Total Levels: {HLSInstance?.levels?.length}</p>
130+
<div>
131+
<p>Select Quoality</p>
132+
<select value={selectedQuality} defaultValue={`${HLSInstance?.currentLevel}`} onChange={handleQuality}>
133+
{HLSInstance?.levels?.map((level, index) => {
134+
return <option value={`${index}`}>{level.bitrate}</option>
135+
})}
136+
</select>
137+
</div>
138+
</div>
139+
)}
140+
</div>
94141
);
95142
}
96143

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/index.tsx

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,24 @@
1-
import React, { useEffect, RefObject } from 'react';
1+
import React, { useEffect, RefObject, useState } from 'react';
22
import Hls, { Config } from 'hls.js';
33

44
export interface HlsPlayerProps
55
extends React.VideoHTMLAttributes<HTMLVideoElement> {
66
hlsConfig?: Config;
77
playerRef: RefObject<HTMLVideoElement>;
88
src: string;
9+
getHLSInstance?: (HLSInstance: Hls) => void;
910
}
1011

1112
function ReactHlsPlayer({
1213
hlsConfig,
1314
playerRef = React.createRef<HTMLVideoElement>(),
1415
src,
1516
autoPlay,
17+
getHLSInstance,
1618
...props
1719
}: HlsPlayerProps) {
20+
const [hlsInstance, setHlsInstance] = useState<Hls>();
21+
1822
useEffect(() => {
1923
let hls: Hls;
2024

@@ -64,6 +68,7 @@ function ReactHlsPlayer({
6468
}
6569
});
6670

71+
setHlsInstance(newHls);
6772
hls = newHls;
6873
}
6974

@@ -79,6 +84,13 @@ function ReactHlsPlayer({
7984
};
8085
}, [autoPlay, hlsConfig, playerRef, src]);
8186

87+
useEffect(() => {
88+
if(getHLSInstance && hlsInstance){
89+
getHLSInstance(hlsInstance)
90+
}
91+
// eslint-disable-next-line react-hooks/exhaustive-deps
92+
}, [hlsInstance])
93+
8294
// If Media Source is supported, use HLS.js to play video
8395
if (Hls.isSupported()) return <video ref={playerRef} {...props} />;
8496

0 commit comments

Comments
 (0)