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를 지정해야 합니다. 다른 속성도 제공할 수 있습니다. 그런 다음 플레이어는 이러한 속성을 사용하여 대부분의 사용 사례에 적합한 DefaultDrmSessionManager
이라는 DrmSessionManager
의 기본 구현을 빌드합니다. 일부 사용 사례의 경우 다음 섹션에 설명된 대로 추가 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으로 보호된 콘텐츠를 재생할 때 동영상 끊김이 발생하는 경우 비동기 버퍼 큐잉을 사용 설정해 보세요.