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 に渡します。
マルチキー コンテンツ
マルチキー コンテンツは複数のストリームで構成され、一部のストリームは他のストリームとは異なるキーを使用します。ライセンス サーバーの構成方法に応じて、マルチキー コンテンツは次のいずれかの方法で再生できます。
ケース 1: ライセンス サーバーがコンテンツのすべてのキーを返した場合
この場合、ライセンス サーバーは、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 }
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)までのいずれかのバージョンを搭載したデバイスで DRM で保護されたコンテンツを再生する際に動画が途切れる場合は、非同期バッファ キューイングを有効にすることをお試しください。