Android 8.0(API レベル 26)以降、MediaPlayer には、DRM で保護された素材の再生をサポートする API が含まれています。MediaPlayer DRM API は
、MediaDrm で利用できる低レベル API に似ていますが、より
高いレベルで動作し、基礎となる Extractor オブジェクト、DRM オブジェクト、Crypto オブジェクトは公開されません。
MediaPlayer DRM API は、
MediaDrm の機能をすべて提供するわけではありませんが、一般的な用途はサポートしています。現在の実装では、次のコンテンツ タイプを処理できます。
- Widevine で保護されたローカル メディア ファイル
- Widevine で保護されたリモート(またはストリーミング)メディア ファイル
次のコード スニペットは、同期実装における新しい MediaPlayer の DRM メソッドの使用例を示しています。
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()
}
Java
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();
まずは、通常どおり
setDataSource()を使用してソースの設定を行い、MediaPlayerオブジェクトを初期化します。DRM を使用するには、次の手順を行います。
- アプリでカスタム設定を使用する場合は、
OnDrmConfigHelperインターフェースを定義し、これをsetOnDrmConfigHelper()を使用してプレーヤーにアタッチします。 prepare()を呼び出します。getDrmInfo()を呼び出します。ソースに DRM コンテンツが含まれている場合、このメソッドは null 以外のMediaPlayer.DrmInfo値を返します。
MediaPlayer.DrmInfo が存在する場合:
- 使用可能な UUID のマップを調べ、1 つを選択します。
- `
prepareDrm()` を呼び出して、現在のソースに対する DRM 設定を準備します。OnDrmConfigHelperコールバックを作成して登録した場合、prepareDrm()の実行中に呼び出されます。これにより、DRM セッションが開かれる前に DRM プロパティのカスタム設定を行えます。コールバックは、prepareDrm()を呼び出したスレッドで同期的に呼び出されます。DRM プロパティにアクセスするには、getDrmPropertyString()とsetDrmPropertyString()を呼び出します。長時間の操作は避けてください。- デバイスがまだプロビジョニングされていない場合、
prepareDrm()でも プロビジョニング サーバーにアクセスしてデバイスのプロビジョニングを行います。これにかかる時間は、ネットワーク接続に依存します。
- ライセンス サーバーに送信する不透明なキーリクエスト バイト配列を取得するには、
getKeyRequest()を呼び出します。 - ライセンス
サーバーから受信したキーレスポンスについて DRM エンジンに通知するには、
provideKeyResponse()を呼び出します。結果はキーリクエストのタイプによって、次のように異なります。- オフライン キーリクエストに対するレスポンスの場合、結果はキーセット ID になります。このキーセット ID を使用して
restoreKeys()を呼び出すことにより、キーを新しいセッションに復元できます。 - ストリーミングまたは解放のリクエストに対するレスポンスの場合、結果は null になります。
- オフライン キーリクエストに対するレスポンスの場合、結果はキーセット ID になります。このキーセット ID を使用して
DRM を非同期で準備する
デフォルトでは、prepareDrm() は同期的に実行され、準備
が完了するまで他はブロックされます。しかし、新しいデバイスにおける最初の DRM の準備では、
プロビジョニングの処理も必要になる場合があり、prepareDrm() 内部で処理され、関連するネットワーク オペレーションによっては
終了まで時間がかかる可能性があります。このような
prepareDrm()によるブロックは、
MediaPlayer.OnDrmPreparedListenerを定義して設定することで回避できます。
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()
}
Java
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 では、共通暗号化スキーム(CENC)と、基本的なストリーミング タイプである H.264 および AAC 用の HLS サンプルレベル暗号化メディア(METHOD=SAMPLE-AES)の復号も可能です。以前は、フルセグメント暗号化メディア(METHOD=AES-128)がサポートされていました。
詳細
Jetpack Media3 は、アプリでのメディア再生におすすめのソリューションです。詳細 をご確認ください。
以下は音声と動画の録音、録画、保存、再生に関するトピックを扱うページです。