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 とライセンス サーバーの URI を指定する必要があります。プレーヤーはこれらのプロパティを使用して、ほとんどのユースケースに適した 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 で保護されたコンテンツを再生すると動画が途切れる場合は、非同期バッファ キューを有効にすることができます。