aboutsummaryrefslogtreecommitdiffstats
path: root/src/hls-player.js
blob: 18292ddfe05127dc5cad612b04666f58b578574a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// HLS where the browser has none of its own (Firefox): hls.js feeds the
// <video> through Media Source. Chrome and Safari play the playlist as a
// plain src, so this file is fetched only when needed. The single-file
// build replaces it with a stub (attachHls → null): no stream there.
// A stream that's on (`live`) is held near its live edge: started 1.5 s
// back, played up to 1.1× when it drifts past 5 s.
export async function attachHls(video, src, { live = false } = {}) {
  const { default: Hls } = await import('hls.js');
  if (!Hls.isSupported()) return null;
  const hls = new Hls({ lowLatencyMode: true, backBufferLength: 30,
    ...(live ? { liveSyncDuration: 1.5, liveMaxLatencyDuration: 5, maxLiveSyncPlaybackRate: 1.1 } : {}) });
  hls.loadSource(src);
  hls.attachMedia(video);
  hls.on(Hls.Events.ERROR, (_, d) => {
    if (!d.fatal) return;
    if (d.type === Hls.ErrorTypes.MEDIA_ERROR) { hls.recoverMediaError(); return; }
    video.dispatchEvent(new Event('hlsfatal'));
  });
  return hls;
}