Strategia di buffering di ExoPlayer

ExoPlayer Versione indagata: 2.9.6

Le classi che implementano l’interfaccia LoadControl definiscono la strategia di buffering di ExoPlayer. La strategia di buffering risponde a domande come:

  • abbiamo bisogno di caricare altri dati multimediali?
  • abbiamo abbastanza dati multimediali per iniziare la riproduzione?

La strategia di buffering non è responsabile della gestione dei buffer o del download dei dati multimediali (che è il MediaSource), o della riproduzione dei dati multimediali (che è il Renderer). La strategia di buffering è agnostica rispetto al formato dei media in riproduzione e ha solo un ruolo “consultivo”. Può occasionalmente accadere che ExoPlayer “chieda” al LoadControl se i nuovi dati multimediali debbano essere caricati, e ignori la risposta (ad esempio, ExoPlayer è già nel processo di download dei dati multimediali).

ExoPlayer viene fornito con un’implementazione predefinita, DefaultLoadControl. Questa è un’implementazione personalizzabile dell’interfaccia LoadControl.

DefaultLoadControl può essere usata per configurare, per esempio :

  • Quanti millisecondi (ms) di dati multimediali ExoPlayer dovrebbe bufferizzare prima di iniziare la riproduzione (indicato come bufferForPlaybackMs). ExoPlayer inizierà la riproduzione non appena avrà almeno bufferForPlaybackMs di dati multimediali, anche se ExoPlayer non ha bufferizzato completamente il segmento completo.
  • La quantità minima di dati multimediali bufferizzati (in ms) prima che ExoPlayer inizi a caricare altri dati (indicata come minBufferMs).
  • La quantità massima di dati multimediali (in ms) che ExoPlayer dovrebbe bufferizzare prima di fermarsi per caricarne altri (indicata come maxBufferMs).
  • Quanti millisecondi di dati multimediali ExoPlayer dovrebbe bufferizzare prima di riprendere la riproduzione dopo un evento di rimbalzo (indicato come bufferForPlaybackAfterRebufferMs).

DefaultLoadControl ha valori predefiniti per ciascuna di queste impostazioni. Nella v2.9.6, questi valori sono:

bufferForPlaybackMs

minBufferMs

maxBufferMs

bufferForPlaybackAfterRebufferMs

Tuttavia, i valori variano da una versione di ExoPlayer all’altra. Per esempio, tra ExoPlayer v2.7.3 e v2.8.0, il maxBufferMs per i flussi video è cambiato da 30 secondi a 50 secondi.

L’architettura modulare di ExoPlayer ti permette anche di implementare la tua strategia di buffering (che implementa l’interfaccia LoadControl) e di collegarla a ExoPlayer. Ma questo è un argomento per un altro post.

Ridurre il tempo di avvio

In ExoPlayer, è facile configurare quanti dati multimediali sono necessari prima di avviare la riproduzione. Nella prima parte di questa serie di blog, abbiamo evidenziato l’importanza del tempo di avvio come metrica della QoE. Un rapporto Akamai pubblicato nel 2016 ha rilevato che “gli spettatori inizieranno ad abbandonare un video se l’avvio impiega più di due secondi per iniziare la riproduzione e per ogni secondo di ritardo aggiuntivo, circa un ulteriore 6% del pubblico lascia. con un ritardo di 10 secondi, quasi la metà del pubblico ha lasciato”.

ExoPlayer versione 2.9.6 richiede per default 2,5 secondi di dati multimediali in buffer prima di iniziare la riproduzione. È possibile abbassare il tempo di avvio richiedendo meno dati da bufferare. Da un lato, abbassare il valore del buffering dei dati multimediali comporterebbe un abbassamento del tempo di avvio del video, tuttavia il rovescio della medaglia è che questo potrebbe anche comportare un aumento delle metriche di rebuffering all’avvio.

Nella prima parte di questa serie di blog, abbiamo usato un grafico radar per visualizzare l’impatto dei diversi compromessi sulle 5 metriche QoE. Il grafico qui sotto mostra l’impatto dell’abbassamento della quantità minima richiesta di dati multimediali prima di iniziare la riproduzione.

Engineering one.pngSiccome il valore predefinito per bufferForPlaybackMs di 2,5 secondi è un valore conservativo, crediamo che sia una buona scelta abbassarlo.

Il grafico sottostante mostra l’impatto sul tempo di avvio per uno stream a 3 Mbps quando si varia il valore di questa opzione di configurazione (senza considerare il tempo di andata e ritorno al server, né se il server deve recuperare il contenuto da altrove). Per esempio, su una connessione a 4 Mbps che riproduce un flusso a 3 Mbps, configurare ExoPlayer per iniziare la riproduzione dopo aver bufferizzato 1,5s di dati multimediali significa che il tempo di avvio teorico sarà di 1,1s, invece di 1,9s con la configurazione predefinita di bufferizzare 2,5s di dati multimediali.

enhancing two.pngLa prossima sezione parla di come configurare ExoPlayer per abbassare il tempo di avvio e la latenza di sventolamento. Se non hai familiarità con ExoPlayer, ti consigliamo di seguire prima i Codelabs di Google sullo streaming multimediale con ExoPlayer.

Configurazione del DefaultLoadControl

Assumendo che tu crei la tua istanza di ExoPlayer con l’implementazione LoadControl di default usando il seguente codice (o simile):

ExoPlayer player = ExoPlayerFactory.newSimpleInstance(
new DefaultRenderersFactory(this),
new DefaultTrackSelector(),
new DefaultLoadControl())

Puoi configurare il DefaultLoadControl usando un DefaultLoadControl.Builder:

/* Instanzia un DefaultLoadControl.Builder. */
DefaultLoadControl.Builder builder = new DefaultLoadControl.Builder();
/* Millisecondi di dati media bufferizzati prima che la riproduzione inizi o riprenda. */
final long loadControlStartBufferMs = 1500;

Configura il nuovo DefaultLoadControl per usare la nostra impostazione per quanti millisecondi di dati multimediali devono essere bufferizzati prima che la riproduzione inizi o riprenda dopo un evento di azione utente.

builder.setBufferDurationMs(
DefaultLoadControl.DEFAULT MAX BUFFER MS,
loadControlStartBufferMs,
DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS);
/* Costruire l'istanza effettiva di DefaultLoadControl */
DefaultLoadControl loadControl = builder.createDefaultLoadControl();
/* Instanziare ExoPlayer con il nostro DefaultLoadControl configurato */
ExoPlayer player = ExoPlayerFactory.newSimpleInstance(
new DefaultRenderersFactory(this),
new DefaultTrackSelector(), loadControl);

Riduzione delle metriche di rebuffering per il contenuto VOD

Oltre a configurare le impostazioni che portano a un tempo di avvio inferiore, è possibile configurare il DefaultLoadControl per stabilire quanti dati multimediali bufferizzare, il che può influire sulle metriche di rebuffering per il contenuto VOD.

ExoPlayer v2.9.6 caricherà di default 50 secondi di dati multimediali nel suo buffer interno se può (l’impostazione maxBufferMs). Nel caso di contenuti VOD, aumentare questo valore darà al lettore più spazio per gestire le fluttuazioni nella larghezza di banda della rete e una minore metrica di rimbalzo; il lato negativo è che aumenterà anche l’uso della memoria di ExoPlayer. Mantenere basso l’uso della memoria è importante sui dispositivi di fascia bassa. Un altro aspetto negativo è l’uso sprecato della larghezza di banda nel caso in cui la riproduzione si interrompa prematuramente.

Per trovare il valore che funziona meglio per la tua configurazione di contenuti VOD, raccomandiamo di fare test A/B con vari valori dell’opzione di configurazione per trovare quello che dà un buon compromesso tra i tassi di rimbalzo e l’uso della memoria. Raccomandiamo di essere conservativi aumentando il valore, ad es, 60 secondi inizialmente per scoprire se fornisce una differenza materiale per le metriche di rebuffering.

Configurare il DefaultLoadControl

Prevediamo che tu crei la tua istanza di ExoPlayer con l’implementazione di default del LoadControl (come mostrato nella sezione precedente su Ridurre il tempo di avvio – Configurare il DefaultLoadControl).

Puoi configurare il DefaultLoadControl usando un DefaultLoadControl.Builder:

/* Istanziare un DefaultLoadControl.Builder. */
DefaultLoadControl.Builder builder = new
DefaultLoadControl.Builder();
/* Quantità massima di dati media da bufferare (in millisecondi). */
final long loadControlMaxBufferMs = 60000;
/*Configura il DefaultLoadControl per usare la nostra impostazione per quanti
Millisecondi di dati media bufferizzare. */
builder.setBufferDurationsMs(
DefaultLoadcontrol.DEFAULT MIN BUFFER MS,
loadControlMaxBufferMs,
/* Per ridurre il tempo di avvio, cambia anche la linea sotto */
DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_MS,
DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS);
/* Costruire l'istanza effettiva di DefaultLoadControl */
DefaultLoadControl loadControl = builder.createDefaultLoadControl();
/* Instanziare ExoPlayer con il nostro DefaultLoadControl configurato */
ExoPlayer player = ExoPlayerFactory.newSimpleInstance(
new DefaultRenderersFactory(this),
new DefaultTrackSelector(),
loadControl);

Nel caso in cui minBufferMs e maxBufferMs abbiano valori diversi, ExoPlayer avrà un comportamento burst che riempie il buffer. ExoPlayer tamponerà fino a riempire il suo buffer con maxBufferMs di dati multimediali, poi aspetterà che scenda a minBufferMs (principalmente applicabile al VOD). Una volta che il livello del buffer scende al di sotto di minBufferMs di dati multimediali, ExoPlayer inizierà a caricare di nuovo i dati multimediali finché non avrà un buffer di maxBufferMs di dati multimediali. Un tale comportamento burst può portare a problemi di rebuffering. Questo è il comportamento predefinito in ExoPlayer v2.9.6 e precedenti, poiché questi valori differiscono. In v2.9.6, minBufferMs ha un valore predefinito di 15000 e maxBufferMs è 50000.

Per ridurre ulteriormente le possibilità di rimbalzo, raccomandiamo di mantenere sempre un buffer ampio in ExoPlayer, impostando minBufferMs allo stesso valore di maxBufferMs. Il team di ExoPlayer ha fatto degli esperimenti e ha scoperto che impostare minBufferMs allo stesso valore di maxBufferMs (e quindi cambiare il comportamento del buffering da bursty a drip-style) ha ridotto significativamente gli eventi di rebuffering, aumentando solo leggermente l’utilizzo della batteria. Infatti, a partire dalla v2.10, ExoPlayer ha per il caso d’uso video il minBufferMs predefinito uguale a maxBufferMs e impostato a 50s.

Come configurare il DefaultLoadControl usando un DefaultLoadControl.Builder:

/* Instanziare un DefaultLoadControl.Builder. */
DefaultLoadControl.Builder builder = new
DefaultLoadControl.Builder();
/*Quanti millisecondi di dati media da bufferizzare in ogni momento. */
final long loadControlBufferMs = DefaultloadControl.MAX_BUFFER_MS; /* Questo è 50000 millisecondi in ExoPlayer 2.9.6 */
/* Configura il DefaultLoadControl per usare lo stesso valore per */
builder.setBufferDurationMs(
loadControlBufferMs,
loadControlBufferMs,
DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_MS,
DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS);

Summary

LoadControl è il punto di ingresso alla strategia di buffering di ExoPlayer. ExoPlayer viene fornito con un’implementazione predefinita, ma configurabile, dell’interfaccia LoadControl che dovrebbe essere sufficiente per la maggior parte dei casi d’uso.

Sulla base delle discussioni finora, ecco un rapido riepilogo delle raccomandazioni:

  1. Per ridurre il tempo di avvio, abbassa il valore di bufferForPlaybackMs; effettivamente, abbassa la quantità minima di dati media bufferizzati prima di iniziare la riproduzione. Questo ha lo svantaggio di aumentare potenzialmente il numero di eventi di rebuffering.
  2. Per ridurre le metriche di rebuffering per il contenuto VOD, aumentare il valore di maxBufferMs; aumentando effettivamente la quantità massima di dati media bufferizzati. Tuttavia, tieni presente che ciò può avere un impatto negativo sui dispositivi di fascia bassa.
  3. Per ridurre le metriche di rebuffering, imposta minBufferMs e maxBufferMs allo stesso valore. Questo cambierà il comportamento di ExoPlayer da un buffering bursty a uno drip-style.

Vorremmo ringraziare i nostri colleghi Christian Worm Mortensen e Laust Brock-Nannestad per il feedback nella scrittura di questo post.

Nel prossimo post del blog, esamineremo la strategia di selezione del bitrate di ExoPlayer. Restate sintonizzati!

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.