컨텐츠 제공 서버는 사용 권한 정보를 검증하여 불법 다운로드 및 복제를 방지합니다.
이 시스템은 구매한 사용자만이 컨텐츠에 접근할 수 있도록 하여, 제작자의 권리를 보호합니다.
MP4 같은 단일 비디오 파일을 스트리밍 포맷으로 변환하는 과정을 자동화해주는 서비스입니다.
HLS 변환 순서 예시
분할(Segmentation): 비디오 파일을 여러 개의 작은 세그먼트로 나눕니다.
인코딩(Encoding): 세그먼트를 다양한 비트레이트와 해상도로 인코딩하여 적응형 스트리밍을 지원합니다.
플레이리스트 생성(Playlist Creation): HLS 포맷에서는 각 세그먼트와 품질 옵션을 포함한 m3u8 플레이리스트 파일을 생성합니다.
AWS Elemental MediaConvert를 사용하면 이러한 복잡한 과정을 사용자가 직접 다룰 필요 없이 간편하게 MP4를 HLS로 변환할 수 있습니다
크로스 브라우징은 다양한 웹 브라우저에서 웹 애플리케이션이 일관되게 작동하도록 보장하는 과정입니다. 이를 위해 다음과 같은 점들을 고려해야 합니다
브라우저 호환성 테스트: 다양한 브라우저(Chrome, Firefox, Safari, Edge 등)에서 플레이어가 제대로 작동하는지 테스트합니다.
비디오 포맷 지원: 모든 브라우저가 HLS와 DASH를 네이티브로 지원하지 않기 때문에, 이러한 포맷을 지원하는 JavaScript 라이브러리(HLS.js, Dash.js)를 사용합니다.
반응형 디자인: 다양한 화면 크기와 해상도에서 비디오 플레이어가 잘 보이도록 반응형 디자인을 적용합니다.
여러 Video.js 등 비디오 라이브러리가 있지만, Plyr 라이브러리를 사용하는 예시를 소개해드리겠습니다.
import { useEffect, useRef } from "react";
import "./styles.css";
import "plyr-react/dist/plyr.css";
import Hls from "hls.js";
import Plyr, { APITypes, PlyrProps, PlyrInstance } from "plyr-react";
import * as dashjs from "dashjs";
const VideoPlayer = () => {
const ref = useRef<APITypes>(null);
useEffect(() => {
const loadVideo = async () => {
const video = document.getElementById("plyr") as HTMLVideoElement;
const setupHls = () => {
const hls = new Hls();
hls.loadSource("https://content.cdn.m3u8");
hls.attachMedia(video);
// @ts-ignore
ref.current!.plyr.media = video;
hls.on(Hls.Events.MANIFEST_PARSED, function () {
(ref.current!.plyr as PlyrInstance).play();
});
};
const setupDash = () => {
const player = dashjs.MediaPlayer().create();
player.initialize(video, "https://content.cdn.mpd", true);
// @ts-ignore
ref.current!.plyr.media = video;
player.on(dashjs.MediaPlayer.events.STREAM_INITIALIZED, function () {
(ref.current!.plyr as PlyrInstance).play();
});
};
if (Hls.isSupported()) {
setupHls();
} else if (dashjs.MediaPlayer.isSupported()) {
setupDash();
} else {
console.error("No supported streaming technology found.");
}
};
loadVideo();
// Clean up video element
return () => {
if (video.current) {
video.current.pause();
video.current.src = "";
}
};
}, []);
return (
<Plyr
id="plyr"
options={{ volume: 0.1 }}
source={{} as PlyrProps["source"]}
ref={ref}
/>
);
};
video.current.onended
를 활용하여 비디오가 종료된 후 실행할 콜백 이벤트를 추가했습니다. 이를 사용하여 종료 후 맞춤 추천 비디오를 노출하거나 다음 비디오로 이동하는 기능을 구현했습니다.