Gestione dei diritti digitali

ExoPlayer utilizza l'API MediaDrm di Android per supportare la riproduzione protetta da DRM. Le versioni Android minime 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
"cenc" PlayReady SL2000 Android TV Android TV DASH, SmoothStreaming, HLS (solo MP4)

Per riprodurre contenuti protetti da DRM con ExoPlayer, è necessario specificare l'UUID del sistema DRM durante la creazione di un elemento multimediale e possono essere fornite anche altre proprietà. Il player utilizzerà queste proprietà per sviluppare 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 in rotazione, passa true a MediaItem.DrmConfiguration.Builder.setMultiSession durante la creazione dell'elemento media.

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.

Caso 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) è continuo anche se utilizzano chiavi diverse.

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

Caso 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 di licenze passando true a MediaItem.DrmConfiguration.Builder.setMultiSession durante la creazione dell'elemento media.

Sconsigliamo di configurare il server delle licenze 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 insieme di chiavi offline può essere caricato passando l'ID insieme di chiavi a MediaItem.DrmConfiguration.Builder.setKeySetId durante la creazione dell'elemento multimediale. In questo modo, è possibile riprodurre i contenuti utilizzando le chiavi memorizzate nell'insieme di chiavi offline con l'ID specificato.

Sessioni DRM per contenuti chiari

L'utilizzo del segnaposto DrmSessions consente a ExoPlayer di utilizzare gli stessi decodificatori per i contenuti chiari di quelli utilizzati per la riproduzione di contenuti criptati. Quando i contenuti multimediali contengono sia sezioni non criptate sia sezioni criptate, ti consigliamo di utilizzare il segnaposto DrmSessions per evitare la ricreazione dei decodificatori quando si verificano transizioni tra sezioni non criptate 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 o meno un'istanza di nuovo 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 balbuzie 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 a Android 11 (livello API 30) incluso, puoi provare a attivare la formazione di una coda di buffer asincrona.