Android 8.0 (API 수준 26)부터 MediaPlayer
에는 DRM으로 보호되는 자료의 재생을 지원하는 API가 포함됩니다. MediaPlayer DRM API는 MediaDrm
에서 제공하는 낮은 수준의 API와 유사하지만 더 높은 수준에서 작동하고 기본 추출기, DRM, 암호화 객체를 노출하지 않습니다.
MediaPlayer DRM API는 MediaDrm
의 전체 기능을 제공하지는 않지만 가장 일반적인 사용 사례를 지원합니다. 현재 구현에서는 다음 콘텐츠 유형을 처리할 수 있습니다.
- Widevine으로 보호되는 로컬 미디어 파일
- Widevine으로 보호되는 원격 또는 스트리밍 미디어 파일
다음 코드 스니펫은 동기식 구현에서 새 DRM MediaPlayer
메서드를 사용하는 방법을 보여줍니다.
DRM 제어 미디어를 관리하려면 다음 예와 같이 일반적인 MediaPlayer 호출 흐름과 함께 새 메서드를 포함해야 합니다.
Kotlin
mediaPlayer?.apply {
setDataSource()
setOnDrmConfigHelper() // optional, for custom configuration
prepare()
drmInfo?.also {
prepareDrm()
getKeyRequest()
provideKeyResponse()
}
// MediaPlayer is now ready to use
start()
// ...play/pause/resume...
stop()
releaseDrm()
}
자바
setDataSource();
setOnDrmConfigHelper(); // optional, for custom configuration
prepare();
if (getDrmInfo() != null) {
prepareDrm();
getKeyRequest();
provideKeyResponse();
}
// MediaPlayer is now ready to use
start();
// ...play/pause/resume...
stop();
releaseDrm();
여느 때처럼 MediaPlayer
객체를 초기화하고 setDataSource()
를 사용하여 소스를 설정하는 것으로 시작하세요. 그리고 나서 DRM을 사용하려면 다음 단계를 따르세요.
- 앱에서 맞춤 구성을 실행하려면
OnDrmConfigHelper
인터페이스를 정의하고setOnDrmConfigHelper()
를 사용하여 플레이어에 연결합니다. prepare()
을 호출합니다.getDrmInfo()
을 호출합니다. 소스에 DRM 콘텐츠가 있으면 메서드는 null이 아닌MediaPlayer.DrmInfo
값을 반환합니다.
MediaPlayer.DrmInfo
가 있는 경우:
- 사용 가능한 UUID의 지도를 검사하고 하나를 선택합니다.
prepareDrm()
를 호출하여 현재 소스의 DRM 구성을 준비합니다.OnDrmConfigHelper
콜백을 만들고 등록했다면prepareDrm()
이 실행되는 동안 호출됩니다. 그러면 DRM 세션을 열기 전에 DRM 속성의 맞춤 구성을 실행할 수 있습니다. 콜백은prepareDrm()
을 호출한 스레드에서 동기적으로 호출됩니다. DRM 속성에 액세스하려면getDrmPropertyString()
및setDrmPropertyString()
를 호출합니다. 너무 긴 작업은 실행하지 마세요.- 기기가 아직 프로비저닝되지 않은 경우
prepareDrm()
도 프로비저닝 서버에 액세스하여 기기를 프로비저닝합니다. 네트워크 연결에 따라 이 작업에 걸리는 시간은 다를 수 있습니다.
- 불투명한 키 요청 바이트 배열을 가져와 라이선스 서버로 전송하려면
getKeyRequest()
를 호출합니다. - 라이선스 서버에서 수신한 키 응답을 DRM 엔진에 알리려면
provideKeyResponse()
를 호출합니다. 결과는 키 요청 유형에 따라 달라집니다.- 응답이 오프라인 키 요청에 관한 것이면 결과는 키 세트 식별자입니다. 이 키 세트 식별자를
restoreKeys()
와 함께 사용하여 키를 새 세션으로 복원할 수 있습니다. - 응답이 스트리밍 또는 해제 요청에 관한 것이면 결과는 null입니다.
- 응답이 오프라인 키 요청에 관한 것이면 결과는 키 세트 식별자입니다. 이 키 세트 식별자를
비동기식으로 DRM 준비
기본적으로 prepareDrm()
은 동기식으로 실행되어 준비가 완료될 때까지 차단됩니다. 그러나 새 기기에서 맨 첫 번째 DRM 준비에는 prepareDrm()
에서 내부적으로 처리하는 프로비저닝이 필요할 수도 있으며 관련된 네트워크 작업으로 인해 완료되는 데 시간이 좀 걸릴 수 있습니다. MediaPlayer.OnDrmPreparedListener
를 정의하고 설정하여 prepareDrm()
에서 차단을 방지할 수 있습니다.
OnDrmPreparedListener
를 설정합니다. prepareDrm()
은 백그라운드에서 프로비저닝 (필요한 경우)과 준비를 실행합니다. 프로비저닝과 준비가 완료되면 시스템은 리스너를 호출합니다. 호출 시퀀스나 리스너가 실행되는 스레드에 관해 어떤 가정도 해서는 안 됩니다. 리스너를 핸들러 스레드에 등록하는 경우는 예외입니다. 시스템은 prepareDrm()
가 반환되기 전이나 후에 리스너를 호출할 수 있습니다.
비동기식으로 DRM 설정
DRM 준비를 위한 MediaPlayer.OnDrmInfoListener
와 플레이어를 시작하기 위한 MediaPlayer.OnDrmPreparedListener
를 만들고 등록하여 DRM을 비동기적으로 초기화할 수 있습니다. 다음 예와 같이 prepareAsync()
와 함께 작동합니다.
Kotlin
setOnPreparedListener()
setOnDrmInfoListener()
setDataSource()
prepareAsync()
// ...
// If the data source content is protected you receive a call to the onDrmInfo() callback.
override fun onDrmInfo(mediaPlayer: MediaPlayer, drmInfo: MediaPlayer.DrmInfo) {
mediaPlayer.apply {
prepareDrm()
getKeyRequest()
provideKeyResponse()
}
}
// When prepareAsync() finishes, you receive a call to the onPrepared() callback.
// If there is a DRM, onDrmInfo() sets it up before executing this callback,
// so you can start the player.
override fun onPrepared(mediaPlayer: MediaPlayer) {
mediaPlayer.start()
}
자바
setOnPreparedListener();
setOnDrmInfoListener();
setDataSource();
prepareAsync();
// ...
// If the data source content is protected you receive a call to the onDrmInfo() callback.
onDrmInfo() {
prepareDrm();
getKeyRequest();
provideKeyResponse();
}
// When prepareAsync() finishes, you receive a call to the onPrepared() callback.
// If there is a DRM, onDrmInfo() sets it up before executing this callback,
// so you can start the player.
onPrepared() {
start();
}
암호화된 미디어 처리
Android 8.0 (API 수준 26)부터 MediaPlayer
는 기본 스트림 유형 H.264 및 AAC에 관해 Common Encryption Scheme (CENC) 및 HLS 샘플 레벨 암호화된 미디어(METHOD=SAMPLE-AES)를 복호화할 수도 있습니다. 전체 세그먼트 암호화된 미디어 (METHOD=AES-128)는 이전에 지원되었습니다.
자세히 알아보기
Jetpack Media3는 앱에서 미디어를 재생하는 데 권장되는 솔루션입니다. 자세한 내용은 자세히 알아보세요.
이 페이지에서는 오디오와 동영상 녹음/녹화, 저장 및 재생과 관련된 주제를 다룹니다.