Gestione dei diritti digitali

ExoPlayer utilizza l'API MediaDrm di Android per supportare la riproduzione protetta da DRM. Le versioni minime di Android richieste per i diversi schemi DRM supportati, insieme ai formati di streaming per i quali sono supportati, sono descritte nella tabella seguente:

Schema DRM Numero di versione di Android Livello API Android Formati supportati:
Widevine "cenc" 4.4 19 DASH, HLS (solo FMP4)
Widevine "cbcs" 7.1 25 DASH, HLS (solo FMP4)
ClearKey "cenc" 5,0 21 DASH
PlayReady SL2000 "cenc" Android TV Android TV DASH, SmoothStreaming, HLS (solo FMP4)

Per riprodurre contenuti protetti da DRM con ExoPlayer, l'UUID del sistema DRM deve essere specificato quando viene creato un elemento multimediale e possono essere fornite anche altre proprietà. Il player utilizzerà queste proprietà per creare un'implementazione predefinita di DrmSessionManager, chiamata DefaultDrmSessionManager, adatta alla maggior parte dei casi d'uso. Per alcuni casi d'uso, potrebbero essere necessarie proprietà DRM aggiuntive, come descritto nelle sezioni seguenti.

Rotazione delle chiavi

Per riprodurre stream con chiavi rotanti, passa true a MediaItem.DrmConfiguration.Builder.setMultiSession durante la creazione dell'elemento multimediale.

Contenuti con più chiavi

I contenuti con più chiavi sono costituiti da più stream, alcuni dei quali utilizzano chiavi diverse rispetto ad altri. I contenuti con più chiavi possono essere riprodotti in due modi, a seconda della configurazione del server delle licenze.

Scenario 1: il server delle licenze risponde con tutte le chiavi per i contenuti

In questo caso, il server delle licenze è configurato in modo che quando riceve una richiesta per una chiave, risponda con tutte le chiavi per i contenuti. Questo caso viene gestito da ExoPlayer senza la necessità di alcuna configurazione speciale. L'adattamento tra gli stream (ad es. video SD e HD) è fluido anche se utilizzano chiavi diverse.

Ove possibile, ti consigliamo di configurare il server delle licenze in questo modo. È il modo più efficiente e solido per supportare la riproduzione di contenuti multikey, perché non richiede al client di effettuare più richieste di licenza per accedere ai diversi stream.

Scenario 2: il server delle licenze risponde solo con la chiave richiesta

In questo caso, il server delle licenze è configurato per rispondere solo con la chiave specificata nella richiesta. I contenuti con più chiavi possono essere riprodotti con questa configurazione del server delle licenze passando true a MediaItem.DrmConfiguration.Builder.setMultiSession durante la creazione dell'elemento multimediale.

Non consigliamo di configurare il server delle licenze in questo modo. Richiede richieste di licenza aggiuntive per riprodurre contenuti multi-key, il che è meno efficiente e solido rispetto all'alternativa descritta sopra.

Chiavi offline

Un insieme di chiavi offline può essere caricato passando l'ID dell'insieme di chiavi a MediaItem.DrmConfiguration.Builder.setKeySetId durante la creazione dell'elemento multimediale. Consente la riproduzione utilizzando le chiavi archiviate nel set di chiavi offline con l'ID specificato.

Sessioni DRM per contenuti chiari

L'utilizzo del segnaposto DrmSessions consente a ExoPlayer di utilizzare gli stessi decoder per i contenuti non protetti utilizzati per la riproduzione di contenuti criptati. Quando i contenuti multimediali contengono sezioni sia chiare che criptate, ti consigliamo di utilizzare il segnaposto DrmSessions per evitare la ricreazione dei decoder quando si verificano transizioni tra sezioni chiare e criptate. L'utilizzo del segnaposto DrmSessions per le tracce audio e video può essere attivato passando true a MediaItem.DrmConfiguration.Builder.forceSessionsForAudioAndVideoTracks durante la creazione dell'elemento multimediale.

Utilizzo di un DrmSessionManager personalizzato

Se un'app vuole personalizzare il DrmSessionManager utilizzato per la riproduzione, può implementare un DrmSessionManagerProvider e passarlo a MediaSource.Factory, che viene utilizzato durante la creazione del player. Il fornitore può scegliere se creare o meno una nuova istanza del gestore ogni volta. Per utilizzare sempre la stessa istanza:

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);

Migliorare le prestazioni di riproduzione

Se riscontri problemi di riproduzione dei video durante la riproduzione di contenuti protetti da DRM su un dispositivo con una versione di Android da Android 6.0 (livello API 23) fino ad Android 11 (livello API 30) incluso, puoi provare ad attivare l'accodamento asincrono dei buffer.