MediaPlayer 및 디지털 권한 관리 (DRM) 사용

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을 사용하려면 다음 단계를 따르세요.

  1. 앱에서 맞춤 구성을 실행하려면 OnDrmConfigHelper 인터페이스를 정의하고 setOnDrmConfigHelper()를 사용하여 플레이어에 연결합니다.
  2. prepare()을 호출합니다.
  3. getDrmInfo()을 호출합니다. 소스에 DRM 콘텐츠가 있으면 메서드는 null이 아닌 MediaPlayer.DrmInfo 값을 반환합니다.

MediaPlayer.DrmInfo가 있는 경우:

  1. 사용 가능한 UUID의 지도를 검사하고 하나를 선택합니다.
  2. prepareDrm()를 호출하여 현재 소스의 DRM 구성을 준비합니다.
    • OnDrmConfigHelper 콜백을 만들고 등록했다면 prepareDrm()이 실행되는 동안 호출됩니다. 그러면 DRM 세션을 열기 전에 DRM 속성의 맞춤 구성을 실행할 수 있습니다. 콜백은 prepareDrm()을 호출한 스레드에서 동기적으로 호출됩니다. DRM 속성에 액세스하려면 getDrmPropertyString()setDrmPropertyString()를 호출합니다. 너무 긴 작업은 실행하지 마세요.
    • 기기가 아직 프로비저닝되지 않은 경우 prepareDrm()도 프로비저닝 서버에 액세스하여 기기를 프로비저닝합니다. 네트워크 연결에 따라 이 작업에 걸리는 시간은 다를 수 있습니다.
  3. 불투명한 키 요청 바이트 배열을 가져와 라이선스 서버로 전송하려면 getKeyRequest()를 호출합니다.
  4. 라이선스 서버에서 수신한 키 응답을 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는 앱에서 미디어를 재생하는 데 권장되는 솔루션입니다. 자세한 내용은 자세히 알아보세요.

이 페이지에서는 오디오와 동영상 녹음/녹화, 저장 및 재생과 관련된 주제를 다룹니다.