Gestione dei diritti digitali

ExoPlayer utilizza l'API MediaDrm di Android per supportare la riproduzione con protezione DRM. Le versioni minime di Android richieste per i diversi schemi DRM supportati, e i formati di flussi di dati per cui sono supportati, sono descritti nella tabella seguente:

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

Per riprodurre contenuti protetti da DRM con ExoPlayer, è necessario specificare l'UUID del sistema DRM durante la creazione di un elemento multimediale ed è possibile specificare anche altre proprietà. Il player utilizzerà quindi 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 della chiave

Per riprodurre stream con tasti 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 multichiave possono essere riprodotti in due modi, a seconda della configurazione del server di licenze.

Caso 1: il server di licenze risponde con tutte le chiavi per i contenuti

In questo caso, il server di 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 esempio i video SD e HD) è semplice anche se vengono utilizzati chiavi diverse.

Se possibile, consigliamo di configurare il server di licenze in modo che si comporti in questo modo. È il modo più efficiente ed efficace per supportare la riproduzione di contenuti multichiave, perché non richiede al client di effettuare più richieste di licenza per accedere ai diversi stream.

Caso 2: il server di licenze risponde solo con la chiave richiesta

In questo caso, il server di licenze è configurato in modo da rispondere solo con la chiave specificata nella richiesta. I contenuti multichiave possono essere riprodotti con questa configurazione del server di licenze passando true a MediaItem.DrmConfiguration.Builder.setMultiSession durante la creazione dell'elemento multimediale.

Consigliamo di non configurare il server di licenze in modo che si comporti in questo modo. Richiede richieste di licenza aggiuntive per riprodurre contenuti multichiave, il che è meno efficiente e solido rispetto all'alternativa descritta sopra.

Chiavi offline

Un set di chiavi offline può essere caricato passando l'ID del set di chiavi a MediaItem.DrmConfiguration.Builder.setKeySetId durante la creazione dell'elemento multimediale. Ciò consente la riproduzione utilizzando le chiavi archiviate nella chiave offline impostata con l'ID specificato.

Sessioni DRM per contenuti chiari

L'uso del segnaposto DrmSessions consente a ExoPlayer di usare per contenuti chiari gli stessi decoder utilizzati per la riproduzione di contenuti criptati. Quando i contenuti multimediali contengono sezioni sia chiare sia criptate, ti consigliamo di utilizzare il segnaposto DrmSessions per evitare la creazione 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 usato per la riproduzione, può implementare un DrmSessionManagerProvider e passarlo a MediaSource.Factory, che viene utilizzato durante la creazione del player. Il provider può scegliere se creare un'istanza ogni volta o meno per una nuova istanza del gestore. 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);

Miglioramento delle prestazioni di riproduzione

Se riscontri stuttering del video durante la riproduzione di contenuti protetti da DRM su un dispositivo con qualsiasi versione di Android da Android 6.0 (livello API 23) fino ad Android 11 (livello API 30), incluso, puoi provare ad attivare la coda del buffer asincrono.