Gestione dei diritti digitali

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

Schema DRM Numero di versione di Android Livello API Android Formati supportati:
"Cenc" Widevine 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, streaming fluido, HLS (solo FMP4)

Per riprodurre contenuti protetti da DRM con ExoPlayer, l'UUID del sistema DRM e l'URI del server delle licenze devono essere specificati durante la creazione di un elemento multimediale. Il player utilizzerà quindi queste proprietà per creare un'implementazione predefinita di DrmSessionManager, denominata DefaultDrmSessionManager, adatta alla maggior parte dei casi d'uso. Per alcuni casi d'uso, potrebbero essere necessarie ulteriori proprietà DRM, come descritto nelle sezioni seguenti.

Rotazione della chiave

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

Contenuti con più tasti

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

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

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

Se possibile, ti consigliamo di configurare il server delle licenze in modo che agisca in questo modo. È il modo più efficiente e affidabile per supportare la riproduzione di contenuti multichiave, perché non richiede al client di effettuare più richieste di licenza per accedere ai diversi flussi.

Caso 2: il server delle licenze risponde soltanto 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ù tasti possono essere riprodotti con questa configurazione del server di licenze passando true a MediaItem.DrmConfiguration.Builder.setMultiSession durante la creazione dell'elemento multimediale.

Sconsigliamo di configurare il server delle licenze in modo che agisca in questo modo. Richiede richieste di licenza aggiuntive per riprodurre contenuti multi-chiave, che sono meno efficienti ed efficaci 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 nel set di chiavi offline con l'ID specificato.

Sessioni DRM per contenuti chiari

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

Utilizzo di DrmSessionManager personalizzato

Se un'app vuole personalizzare il DrmSessionManager utilizzato per la riproduzione, può implementare un DrmSessionManagerProvider e trasmetterlo al MediaSource.Factory, che viene utilizzato durante la creazione del player. Il provider può scegliere se creare ogni volta o meno un'istanza di una nuova istanza 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);

Migliorare le prestazioni di riproduzione

Se riscontri problemi di stuttering dei video durante la riproduzione di contenuti protetti da DRM su un dispositivo con una versione qualsiasi 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 asincrona.