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 のみ) |
DRM で保護されたコンテンツを ExoPlayer で再生するには、メディア アイテムのビルド時に 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)までのバージョンを搭載したデバイスで DRM で保護されたコンテンツを再生すると動画が途切れる場合は、非同期バッファ キューイングを有効にする方法をお試しください。