ExoPlayer는 Android의 MediaDrm API를 사용하여 DRM으로 보호되는 재생을 지원합니다.
지원되는 다양한 DRM 체계에 필요한 최소 Android 버전과 지원되는 스트리밍 형식은 다음 표에 설명되어 있습니다.
| DRM 스킴 | Android 버전 번호 | Android API 레벨 | 지원되는 형식 |
|---|---|---|---|
| Widevine 'cenc' | 4.4 | 19 | DASH, HLS (FMP4만 해당) |
| Widevine 'cbcs' | 7.1 | 25 | DASH, HLS (FMP4만 해당) |
| ClearKey 'cenc' | 5.0 | 21 | DASH |
| PlayReady SL2000 'cenc' | Android TV | Android TV | DASH, SmoothStreaming, HLS (FMP4만 해당) |
ExoPlayer로 DRM 보호 콘텐츠를 재생하려면 미디어 항목을 빌드할 때 DRM 시스템의 UUID를 지정해야 하며 다른 속성도 제공할 수 있습니다. 그러면 플레이어는 이러한 속성을 사용하여 대부분의 사용 사례에 적합한 DrmSessionManager의 기본 구현(DefaultDrmSessionManager)을 빌드합니다. 일부 사용 사례의 경우 다음 섹션에 설명된 대로 추가 DRM 속성이 필요할 수 있습니다.
키 순환
순환 키가 있는 스트림을 재생하려면 미디어 항목을 빌드할 때 true를 MediaItem.DrmConfiguration.Builder.setMultiSession에 전달하세요.
다중 키 콘텐츠
다중 키 콘텐츠는 여러 스트림으로 구성되며 일부 스트림은 다른 스트림과 다른 키를 사용합니다. 라이선스 서버가 구성된 방식에 따라 멀티 키 콘텐츠는 두 가지 방식으로 재생할 수 있습니다.
케이스 1: 라이선스 서버가 콘텐츠의 모든 키로 응답
이 경우 라이선스 서버는 하나의 키 요청을 수신하면 콘텐츠의 모든 키로 응답하도록 구성됩니다. 이 사례는 특별한 구성 없이 ExoPlayer에서 처리합니다. 스트림 간 적응 (예: SD 및 HD 동영상)은 서로 다른 키를 사용하더라도 원활합니다.
가능한 경우 라이선스 서버가 이러한 방식으로 작동하도록 구성하는 것이 좋습니다. 클라이언트가 여러 라이선스 요청을 통해 다양한 스트림에 액세스할 필요가 없으므로 멀티 키 콘텐츠 재생을 지원하는 가장 효율적이고 강력한 방법입니다.
케이스 2: 라이선스 서버가 요청된 키로만 응답
이 경우 라이선스 서버는 요청에 지정된 키만으로 응답하도록 구성됩니다. 미디어 항목을 빌드할 때 true를 MediaItem.DrmConfiguration.Builder.setMultiSession에 전달하여 이 라이선스 서버 구성으로 다중 키 콘텐츠를 재생할 수 있습니다.
이러한 방식으로 작동하도록 라이선스 서버를 구성하지 않는 것이 좋습니다. 멀티 키 콘텐츠를 재생하려면 추가 라이선스 요청이 필요하며, 이는 위에 설명된 대안보다 효율성과 견고성이 떨어집니다.
오프라인 키
미디어 항목을 빌드할 때 키 세트 ID를 MediaItem.DrmConfiguration.Builder.setKeySetId에 전달하여 오프라인 키 세트를 로드할 수 있습니다.
이를 통해 지정된 ID가 있는 오프라인 키 세트에 저장된 키를 사용하여 재생할 수 있습니다.
명확한 콘텐츠의 DRM 세션
자리표시자 DrmSessions를 사용하면 ExoPlayer에서 암호화된 콘텐츠를 재생할 때 사용되는 것과 동일한 디코더를 일반 콘텐츠에 사용할 수 있습니다. 미디어에 일반 섹션과 암호화된 섹션이 모두 포함된 경우 일반 섹션과 암호화된 섹션 간 전환이 발생할 때 디코더가 다시 생성되지 않도록 자리표시자 DrmSessions를 사용하는 것이 좋습니다. 미디어 항목을 빌드할 때 true를 MediaItem.DrmConfiguration.Builder.forceSessionsForAudioAndVideoTracks에 전달하여 오디오 및 동영상 트랙의 자리표시자 DrmSessions 사용을 사용 설정할 수 있습니다.
맞춤 DrmSessionManager 사용
앱에서 재생에 사용되는 DrmSessionManager를 맞춤설정하려면 DrmSessionManagerProvider를 구현하고 플레이어를 빌드할 때 사용되는 MediaSource.Factory에 이를 전달하면 됩니다. 제공자는 매번 새 관리자 인스턴스를 인스턴스화할지 여부를 선택할 수 있습니다. 항상 동일한 인스턴스를 사용하려면 다음을 실행하세요.
Kotlin
val customDrmSessionManager: DrmSessionManager = CustomDrmSessionManager() // Pass a drm session manager provider to the media source factory. val mediaSourceFactory = DefaultMediaSourceFactory(context).setDrmSessionManagerProvider { customDrmSessionManager }
자바
DrmSessionManager customDrmSessionManager = new CustomDrmSessionManager(/* ... */ ); // Pass a drm session manager provider to the media source factory. MediaSource.Factory mediaSourceFactory = new DefaultMediaSourceFactory(context) .setDrmSessionManagerProvider(mediaItem -> customDrmSessionManager);
재생 성능 개선
Android 6.0 (API 수준 23)부터 Android 11 (API 수준 30)까지의 Android 버전을 실행하는 기기에서 DRM으로 보호된 콘텐츠를 재생할 때 동영상 끊김 현상이 발생하는 경우 비동기 버퍼 대기열을 사용 설정해 보세요.