Classic/VPC 환경에서 이용 가능합니다.
TV SDK에서 DRM(Digital Rights Management)으로 보호된 콘텐츠를 재생하는 방법을 안내합니다.
주의
DRM은 시뮬레이터 / 에뮬레이터에서 동작하지 않습니다. 반드시 실제 기기에서 테스트해 주십시오.
플랫폼별 DRM
플랫폼별 지원 DRM과 재생 엔진은 다음과 같습니다.
| 플랫폼 | DRM | 엔진 |
|---|---|---|
| Android TV | Widevine(com.widevine.alpha) |
ExoPlayer |
| tvOS | FairPlay(com.apple.fps) |
AVPlayer |
방식 1: 웹 SDK 호환 DRM 키
SDK가 플랫폼에 따라 자동으로 적합한 DRM을 선택합니다. Android TV는 Widevine, tvOS는 FairPlay를 사용합니다.
<VpePlayer
accessKey="YOUR_ACCESS_KEY"
options={{
playlist: [{
drm: {
'com.widevine.alpha': {
src: 'https://example.com/manifest.mpd',
licenseUri: 'https://license-server.com/widevine',
licenseRequestHeader: {
'pallycon-customdata-v2': 'DRM_TOKEN',
},
},
'com.apple.fps': {
src: 'https://example.com/index.m3u8',
certificateUri: 'https://license-server.com/cert',
certificateRequestHeader: {
'pallycon-customdata-v2': 'DRM_TOKEN',
},
licenseUri: 'https://license-server.com/fairplay',
licenseRequestHeader: {
'pallycon-customdata-v2': 'DRM_TOKEN',
},
},
},
poster: 'https://example.com/poster.jpg',
description: { title: 'DRM 영상' },
}],
}}
onBack={() => navigation.goBack()}
/>
방식 2: react-native-video 직접 DRM 형식
react-native-video의 DRM 형식을 직접 사용할 수도 있습니다.
FairPlay (tvOS)
<VpePlayer
accessKey="YOUR_ACCESS_KEY"
options={{
playlist: [{
file: 'https://example.com/video.m3u8',
drm: {
type: 'fairplay',
licenseServer: 'https://license-server.com/fairplay',
certificateUrl: 'https://license-server.com/cert',
headers: { 'pallycon-customdata-v2': 'DRM_TOKEN' },
},
}],
}}
onBack={() => navigation.goBack()}
/>
Widevine (Android TV)
<VpePlayer
accessKey="YOUR_ACCESS_KEY"
options={{
playlist: [{
file: 'https://example.com/video.mpd',
drm: {
type: 'widevine',
licenseServer: 'https://license-server.com/widevine',
headers: { 'pallycon-customdata-v2': 'DRM_TOKEN' },
},
}],
}}
onBack={() => navigation.goBack()}
/>
Secure Token
token 속성으로 재생 소스에 Secure Token을 적용하여 OneTimeUrl을 지원할 수 있습니다. 재생 중 토큰 갱신도 가능합니다.
const playerRef = useRef<PlayerHandle>(null);
<VpePlayer
ref={playerRef}
accessKey="YOUR_ACCESS_KEY"
options={{
playlist: [{ file: 'https://example.com/video.m3u8' }],
token: 'token=st=1675320871~exp=1675320901~acl=....',
}}
onBack={() => navigation.goBack()}
/>
// 재생 중 토큰 갱신
playerRef.current?.tokenChange('NEW_TOKEN_VALUE');