デジタル著作権管理

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 プロパティが必要になることがあります。

鍵のローテーション

ローテーションする鍵でストリームを再生するには、メディア アイテムをビルドするときに trueMediaItem.DrmConfiguration.Builder.setMultiSession に渡します。

マルチキー コンテンツ

マルチキー コンテンツは複数のストリームで構成され、一部のストリームは他のストリームとは異なるキーを使用します。ライセンス サーバーの構成方法に応じて、マルチキー コンテンツは次のいずれかの方法で再生できます。

ケース 1: ライセンス サーバーがコンテンツのすべてのキーを返した場合

この場合、ライセンス サーバーは、1 つのキーのリクエストを受信すると、コンテンツのすべてのキーで応答するように構成されています。このケースは、特別な構成をしなくても ExoPlayer で処理されます。ストリーム(SD 動画や HD 動画など)間の適応は、異なるキーを使用している場合でもシームレスです。

可能な場合は、ライセンス サーバーがこのように動作するように構成することをおすすめします。この方法は、クライアントがさまざまなストリームにアクセスするために複数のライセンス リクエストを行う必要がないため、マルチキー コンテンツの再生をサポートする最も効率的で堅牢な方法です。

ケース 2: ライセンス サーバーがリクエストされたキーのみを返す

この場合、ライセンス サーバーはリクエストで指定されたキーのみを返すように構成されています。このライセンス サーバー構成では、メディア アイテムのビルド時に trueMediaItem.DrmConfiguration.Builder.setMultiSession に渡すことで、マルチキー コンテンツを再生できます。

ライセンス サーバーがこのような動作をするように構成することはおすすめしません。マルチキー コンテンツを再生するには追加のライセンス リクエストが必要になるため、上記の代替方法よりも効率性と堅牢性が劣ります。

オフライン キー

オフライン キーセットは、メディア アイテムのビルド時にキーセット ID を MediaItem.DrmConfiguration.Builder.setKeySetId に渡すことで読み込むことができます。これにより、指定された ID のオフライン キーセットに保存されているキーを使用して再生できます。

クリア コンテンツの DRM セッション

プレースホルダ DrmSessions を使用すると、ExoPlayer は、暗号化されたコンテンツの再生時に使用されるものと同じデコーダをクリア コンテンツに使用できます。メディアにクリア セクションと暗号化セクションの両方が含まれている場合、クリア セクションと暗号化セクションの切り替え時にデコーダが再作成されないように、プレースホルダ DrmSessions を使用することがあります。メディア アイテムのビルド時に trueMediaItem.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 で保護されたコンテンツを再生する際に動画が途切れる場合は、非同期バッファ キューイングを有効にすることをお試しください。