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
に渡します。
マルチキー コンテンツ
マルチキー コンテンツは複数のストリームで構成され、一部のストリームは他のストリームとは異なるキーを使用します。マルチキー コンテンツは、ライセンス サーバーの構成に応じて、次の 2 つの方法のいずれかで再生できます。
ケース 1: ライセンス サーバーがコンテンツのすべてのキーで応答する
この場合、ライセンス サーバーは、1 つのキーのリクエストを受信すると、コンテンツのすべてのキーで応答するように構成されています。このケースは、特別な構成を必要とせずに ExoPlayer によって処理されます。ストリーム間(SD 動画と HD 動画など)の適応は、異なるキーを使用していてもシームレスです。
可能であれば、この方法で動作するようにライセンス サーバーを設定することをおすすめします。クライアントが異なるストリームにアクセスするために複数のライセンス リクエストを行う必要がないため、マルチキー コンテンツの再生をサポートする最も効率的で堅牢な方法です。
ケース 2: ライセンス サーバーがリクエストされた鍵のみを返す
この場合、ライセンス サーバーは、リクエストで指定されたキーのみを返すように構成されています。マルチキー コンテンツをこのライセンス サーバー構成で再生するには、メディア アイテムの作成時に true
を MediaItem.DrmConfiguration.Builder.setMultiSession
に渡します。
ライセンス サーバーがこのような動作をするように構成することはおすすめしません。マルチキー コンテンツを再生するには追加のライセンス リクエストが必要であり、上記の代替手段よりも効率性と堅牢性が低くなります。
オフライン キー
オフライン キーセットは、メディア アイテムの作成時にキーセット ID を MediaItem.DrmConfiguration.Builder.setKeySetId
に渡すことで読み込むことができます。これにより、指定された ID のオフライン鍵セットに保存されている鍵を使用して再生できるようになります。
クリアなコンテンツの DRM セッション
プレースホルダ DrmSessions
を使用すると、ExoPlayer
は暗号化されたコンテンツの再生時に使用するものと同じデコーダをクリア コンテンツに使用できます。メディアにクリアセクションと暗号化されたセクションの両方が含まれる場合は、プレースホルダ DrmSessions
を使用して、クリアセクションと暗号化されたセクション間の遷移が発生したときにデコーダが再作成されないようにすることをおすすめします。音声トラックと動画のトラックにプレースホルダ DrmSessions
を使用するには、メディア アイテムの作成時に true
を MediaItem.DrmConfiguration.Builder.forceSessionsForAudioAndVideoTracks
に渡します。
カスタム 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 }
Java
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 で保護されたコンテンツを再生する際に動画が途切れる場合は、非同期バッファ キューイングを有効にすることをおすすめします。