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.