diff --git a/frontend/src/hooks/usePlayer.ts b/frontend/src/hooks/usePlayer.ts index b3ba022c..a154fefc 100644 --- a/frontend/src/hooks/usePlayer.ts +++ b/frontend/src/hooks/usePlayer.ts @@ -1,6 +1,100 @@ -import Hls from 'hls.js'; +import Hls, { + Loader, + LoaderCallbacks, + LoaderConfiguration, + LoaderContext, + LoaderResponse, + LoaderStats, + HlsConfig +} from 'hls.js'; import { useEffect, useRef } from 'react'; +class CustomLoader implements Loader { + private loader: Loader; + + constructor(config: HlsConfig) { + const DefaultLoader = Hls.DefaultConfig.loader as new (config: HlsConfig) => Loader; + this.loader = new DefaultLoader(config); + } + + load(context: LoaderContext, config: LoaderConfiguration, callbacks: LoaderCallbacks) { + const { onSuccess, onError, onTimeout, onAbort, onProgress } = callbacks; + + const newCallbacks: LoaderCallbacks = { + onSuccess: (response: LoaderResponse, stats: LoaderStats, context: LoaderContext, networkDetails: any = null) => { + onSuccess(response, stats, context, networkDetails); + }, + onError: ( + error: { code: number; text: string }, + context: LoaderContext, + networkDetails: any = null, + stats: LoaderStats + ) => { + if (error.code === 404) { + const emptyData = new ArrayBuffer(0); + onSuccess( + { + url: context.url, + data: emptyData + }, + { + trequest: performance.now(), + tfirst: performance.now(), + tload: performance.now(), + loaded: 0, + total: 0 + } as unknown as LoaderStats, + context, + networkDetails + ); + } else { + if (onError) { + onError(error, context, networkDetails, stats); + } + } + }, + onTimeout: (stats: LoaderStats, context: LoaderContext, networkDetails: any = null) => { + if (onTimeout) { + onTimeout(stats, context, networkDetails); + } + }, + onAbort: (stats: LoaderStats, context: LoaderContext, networkDetails: any = null) => { + if (onAbort) { + onAbort(stats, context, networkDetails); + } + }, + onProgress: ( + stats: LoaderStats, + context: LoaderContext, + data: string | ArrayBuffer, + networkDetails: any = null + ) => { + if (onProgress) { + onProgress(stats, context, data, networkDetails); + } + } + }; + + this.loader.load(context, config, newCallbacks); + } + + abort() { + this.loader.abort(); + } + + destroy() { + this.loader.destroy(); + } + + get stats() { + return this.loader.stats; + } + + get context() { + return this.loader.context; + } +} + export default function usePlayer(url: string) { const videoRef = useRef(null); @@ -19,7 +113,8 @@ export default function usePlayer(url: string) { const hls = new Hls({ enableWorker: true, - lowLatencyMode: true + lowLatencyMode: true, + loader: CustomLoader }); hls.loadSource(url); diff --git a/frontend/src/utils/hostURL.ts b/frontend/src/utils/hostURL.ts index 75753288..0fa6d109 100644 --- a/frontend/src/utils/hostURL.ts +++ b/frontend/src/utils/hostURL.ts @@ -1,8 +1,7 @@ -import { BASE_URL, RTMP_HTTP_PORT } from '@apis/index'; -import { getStreamKey } from './streamKey'; +import { getSessionKey } from './streamKey'; export function getHostURL() { - const streamKey = getStreamKey(); + const sessionKey = getSessionKey(); - return `${BASE_URL}:${RTMP_HTTP_PORT}/live/${streamKey}/index.m3u8`; + return `https://kr.object.ncloudstorage.com/web22/live/${sessionKey}/index.m3u8`; }