Classic/VPC 환경에서 이용 가능합니다.
재생 중 발생하는 에러를 감지하고 처리하는 방법을 설명합니다.
Video Player Enhancement 서비스와 함께 Media Analytics 서비스를 이용하면 Media Analytics 관리 페이지에서 에러 코드를 손쉽게 확인할 수 있습니다.
에러 이벤트 감지
플레이어를 호출하는 함수에서 player.on("error", (err) => {}) 코드로 이벤트를 감지하여 에러 코드와 메시지를 호출할 수 있습니다.
에러 코드는 Video Player Enhancement 서비스에서 제공하는 에러 코드 목록으로 전달됩니다.
import Hls from "hls.js";
import dashjs from "dashjs";
import { VpePlayer } from "@sgrsoft/vpe-react-sdk";
// onEvent에 전달되는 error 이벤트 객체 구조:
// {
// type: "error",
// state: PlayerStateSnapshot, // 현재 플레이어 상태
// prevState?: PlayerStateSnapshot,
// data: {
// errorCode: string | null, // 예: "E0001", "E0004"
// errorMessage: string | null, // 에러 설명
// errorTitle: string | null, // 에러 제목
// }
// }
export function App() {
return (
<VpePlayer
accessKey="YOUR_ACCESS_KEY"
hls={Hls}
dashjs={dashjs}
platform="pub"
options={{
playlist: [
{
file: "https://example.com/myVideo.mp4",
poster: "https://example.com/myVideoThumb.png",
},
],
}}
onEvent={(event) => {
if (event.type === "error") {
const { errorCode, errorMessage, errorTitle } = event.data;
switch (errorCode) {
case "E0001":
console.log("E0001 - ACCESS DENIED");
console.log(errorTitle, errorMessage);
break;
case "E0002":
console.log("E0002 - NOT AUTHORIZED");
console.log(errorTitle, errorMessage);
break;
case "E0003":
console.log("E0003 - NETWORK ERROR");
console.log(errorTitle, errorMessage);
break;
case "E0004":
console.log("E0004 - CANNOT PLAY");
console.log(errorTitle, errorMessage);
break;
case "E0005":
console.log("E0005 - LICENSE IS INVALID");
console.log(errorTitle, errorMessage);
break;
case "E0006":
console.log("E0006 - LIMIT DENIED");
console.log(errorTitle, errorMessage);
break;
default:
break;
}
}
}}
/>
);
}
재시도 설정
플레이어가 오류를 응답하기 전 최대 재시도 횟수 및 최대 지연 시간 설정을 커스터마이징할 수 있습니다.
- 플레이어 초기화 시 영상 재생 시도 추가: 기본값 최대 3회, 5초 간격
- Live/VOD가 중단되었을 때 재생 시도 추가: 기본값 최대 3회, 5초 간격
import Hls from "hls.js";
import dashjs from "dashjs";
import { VpePlayer } from "@sgrsoft/vpe-react-sdk";
export function App() {
return (
<VpePlayer
accessKey="YOUR_ACCESS_KEY"
hls={Hls}
dashjs={dashjs}
platform="pub"
options={{
playlist: [
{
file: "https://dobdd7vj3864.edge.naverncp.com/hls/47NWZgkwsKFkPIU1tix9Zw__/endpoint/sample/example.mp4.smil/master.m3u8",
poster: "https://2ardrvaj2252.edge.naverncp.com/endpoint/sample/221027_NAVER_Cloud_intro_Long_ver_01.jpg",
},
],
retry: {
maxRetry: 10, // 최대 재시도 횟수
interval: 5000, // 재시도 간 지연 시간 (ms)
},
}}
/>
);
}
| 옵션 | 타입 | 기본값 | 설명 |
|---|---|---|---|
retry |
Object | - | 재시도 설정 |
retry.maxRetry |
Integer | 3 |
최대 재시도 횟수 |
retry.interval |
Integer | 5000 |
재시도 지연 시간 (밀리초) |
에러 화면 재정의
기본으로 제공되는 에러 화면을 고객사가 원하는 코드로 변경하여 실행할 수 있습니다. 에러 화면을 재정의(override)하면 마지막 재생 위치에서 정지(pause) 상태를 유지한 채 플레이어 오버레이를 통해 에러 화면을 구현할 수 있습니다.
import Hls from "hls.js";
import dashjs from "dashjs";
import { VpePlayer } from "@sgrsoft/vpe-react-sdk";
// 동영상(MP4)
export function App() {
return (
<VpePlayer
accessKey="YOUR_ACCESS_KEY"
hls={Hls}
dashjs={dashjs}
platform="pub"
options={{
playlist: [
{
file: "https://CDN도메인/example_video_01.mp4",
poster: "https://CDN도메인/example_image_01.png",
},
],
override: {
error(err) {
console.log("player error :", err);
// 고객사 에러 화면 기능 구현
},
},
}}
/>
);
}
에러 화면 커스터마이징
errorOverride는 VpePlayer props로 전달하며, 에러 발생 시 플레이어 내부에 커스텀 React UI를 직접 렌더링합니다.override.error는 options 내부에 설정하는 콜백 함수로, 에러 정보를 받아 외부 로직(로깅, 별도 DOM 조작 등)을 실행합니다.
유료 티어(isPaidTier)에서만 동작합니다.
타입 정의
errorOverride?: ReactNode | ComponentType<PlayerErrorInfo> | ((info: PlayerErrorInfo) => ReactNode);
type PlayerErrorInfo = {
errorCode: string | null;
errorMessage: string | null;
errorTitle: string | null;
};
1. 렌더 함수 (가장 일반적)
에러 정보를 받아 동적으로 UI를 렌더링합니다. 에러 코드별로 다른 메시지를 표시할 때 유용합니다.
<VpePlayer
accessKey="YOUR_ACCESS_KEY"
hls={Hls}
options={{
playlist: [{ file: "https://CDN_DOMAIN/example.m3u8" }],
}}
errorOverride={(info) => (
<div style={{
display: "flex",
width: "100%",
height: "100%",
backgroundColor: "#000",
color: "#fff",
justifyContent: "center",
alignItems: "center",
}}>
<div>ERROR {info.errorCode}</div>
</div>
)}
/>
2. React 컴포넌트
별도의 에러 컴포넌트를 정의하고 전달합니다. PlayerErrorInfo가 props로 전달됩니다.
function CustomError({ errorCode, errorMessage }: PlayerErrorInfo) {
return <div>에러: {errorCode} - {errorMessage}</div>;
}
<VpePlayer
accessKey="YOUR_ACCESS_KEY"
hls={Hls}
options={{
playlist: [{ file: "https://CDN_DOMAIN/example.m3u8" }],
}}
errorOverride={CustomError}
/>
3. ReactNode (고정 UI)
에러 코드와 관계없이 동일한 고정 UI를 표시합니다.
<VpePlayer
accessKey="YOUR_ACCESS_KEY"
hls={Hls}
options={{
playlist: [{ file: "https://CDN_DOMAIN/example.m3u8" }],
}}
errorOverride={<div>재생할 수 없습니다</div>}
/>
에러 코드
Video Player Enhancement 서비스에서 제공하는 에러 코드 목록은 다음과 같습니다.
| 에러 코드 | 에러 메시지 | 설명 |
|---|---|---|
| E0001 | ACCESS DENIED | 잘못된 접근. 잘못된 옵션 값이 전달되어 동영상 재생 불가 |
| E0002 | NOT AUTHORIZED | 동영상을 재생할 권한이 없음. 잘못된 요청으로 플레이어 인증 실패 |
| E0003 | NETWORK ERROR | 네트워크 연결이 원활하지 않음. 네트워크 문제로 플레이어 인증 실패 |
| E0004 | CANNOT PLAY VIDEO | 동영상을 재생할 수 없음. 영상 재생 실패 |
| E0005 | LICENSE IS INVALID | 라이선스가 유효하지 않음. 플레이어 라이선스가 만료되어 동영상 재생 불가 |
| E0006 | LIMIT DENIED | 월 기본 제공 호출 건수를 초과. 무료 플레이어의 월 제공량을 모두 소진하여 동영상 재생 불가 |