ExoPlayer’s Buffering Strategy

ExoPlayer Version Investigated: 2.9.6

Klassen die de LoadControl interface implementeren definiëren de bufferstrategie van ExoPlayer. De buffering strategie beantwoordt vragen als:

  • moeten we meer media data laden?
  • hebben we genoeg media data om het afspelen te starten?

De buffering strategie is niet verantwoordelijk voor het beheer van de buffers of het downloaden van media data (dat is de MediaSource), of het afspelen van media data (dat is de Renderer). De buffering strategie is agnostisch ten opzichte van het mediaformaat dat wordt afgespeeld en heeft alleen een “adviserende” rol. Het kan af en toe voorkomen dat ExoPlayer aan de LoadControl “vraagt” of nieuwe media data geladen moet worden, en het antwoord negeert (b.v. als ExoPlayer al bezig is met het downloaden van media data).

ExoPlayer komt met een standaard implementatie, DefaultLoadControl. Dit is een aanpasbare implementatie van de LoadControl interface.

DefaultLoadControl kan worden gebruikt om te configureren, bijv. :

  • Hoeveel milliseconden (ms) mediagegevens ExoPlayer moet bufferen alvorens het afspelen te starten (aangeduid als bufferForPlaybackMs). De ExoPlayer begint met afspelen zodra hij ten minste bufferForPlaybackMs aan mediadata heeft, zelfs als de ExoPlayer het volledige segment niet volledig heeft gebufferd.
  • De minimale hoeveelheid gebufferde mediadata (in ms) voordat de ExoPlayer begint met het laden van meer data (aangeduid als minBufferMs).
  • De maximale hoeveelheid mediagegevens (in ms) die ExoPlayer moet bufferen voordat hij stopt met het laden van meer gegevens (aangeduid als maxBufferMs).
  • Hoeveel milliseconden mediagegevens ExoPlayer moet bufferen voordat hij opnieuw begint met afspelen na een rebufferingsevent (aangeduid als bufferForPlaybackAfterRebufferMs).

DefaultLoadControl heeft standaard waarden voor elk van deze instellingen. In v2.9.6, zijn deze waarden:

bufferForPlaybackMs

minBufferMs

maxBufferMs

bufferForPlaybackAfterRebufferMs

Hoe dan ook, de waarden variëren van ExoPlayer-versie tot versie. Tussen ExoPlayer v2.7.3 en v2.8.0, bijvoorbeeld, is de maxBufferMs voor video streams veranderd van 30 seconden naar 50 seconden.

ExoPlayer’s modulaire architectuur maakt het ook mogelijk om je eigen bufferstrategie te implementeren (die de LoadControl interface implementeert) en deze in ExoPlayer te pluggen. Maar dat is een onderwerp voor een andere post.

Verlaag de opstarttijd

In ExoPlayer, is het eenvoudig om te configureren hoeveel media data nodig is voordat het afspelen wordt gestart. In het eerste deel van deze blogserie belichtten we het belang van opstarttijd als QoE-metric. Uit een rapport dat Akamai in 2016 publiceerde, bleek dat “kijkers een video beginnen af te haken als het opstarten langer dan twee seconden duurt om te beginnen met afspelen en voor elke extra seconde vertraging, vertrekt ruwweg een extra 6% van het publiek. met een vertraging van 10 seconden is bijna de helft van het publiek vertrokken”.

ExoPlayer versie 2.9.6 vereist standaard 2,5 seconden gebufferde mediagegevens voordat het afspelen wordt gestart. Het is mogelijk om de opstarttijd te verlagen door minder data te bufferen. Aan de ene kant zou het verlagen van de mediagegevensbufferwaarde resulteren in een verlaging van de video-opstarttijd, maar het nadeel is dat dit ook zou kunnen resulteren in een verhoging van de rebufferingmetriek bij het opstarten.

In het eerste deel van deze blogserie hebben we een radardiagram gebruikt om de impact van de verschillende trade-offs op de 5 QoE-metriekpunten te visualiseren. De grafiek hieronder toont het effect van het verlagen van de minimaal vereiste hoeveelheid mediagegevens voordat het afspelen wordt gestart.

verbeteringvaneen.pngOmdat de standaardwaarde voor bufferForPlaybackMs van 2,5 seconden een conservatieve waarde is, denken we dat het een goede keuze is om deze te verlagen.

De onderstaande grafiek toont de impact op de opstarttijd voor een stream van 3 Mbps wanneer de waarde van deze configuratieoptie wordt gevarieerd (waarbij geen rekening wordt gehouden met de round-trip tijd naar de server, noch met de vraag of de server de inhoud van elders moet halen). Bijvoorbeeld, op een 4 Mbps verbinding die een 3 Mbps stream afspeelt, betekent het configureren van de ExoPlayer om het afspelen te starten na het bufferen van 1.5s media data dat de theoretische opstarttijd 1.1s zal zijn, in plaats van 1.9s met de standaard configuratie van het bufferen van 2.5s media data.

hancing two.pngHet volgende onderdeel gaat over hoe de ExoPlayer geconfigureerd kan worden om de opstarttijd en de hand-zwaai latentie te verlagen. Als je niet bekend bent met ExoPlayer, raden we je aan eerst Google’s Codelabs over Media streaming met ExoPlayer te volgen.

Configuratie van de DefaultLoadControl

Aannemend dat je je ExoPlayer instantie maakt met de standaard LoadControl implementatie met de volgende code (of vergelijkbaar):

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

U kunt de DefaultLoadControl configureren met behulp van een DefaultLoadControl.Builder:

/*Start een DefaultLoadControl.Builder. */
DefaultLoadControl.Builder = new DefaultLoadControl.Builder();
/* Milliseconden aan mediagegevens die worden gebufferd voordat het afspelen begint of wordt hervat. */
final long loadControlStartBufferMs = 1500;

Configureer de nieuwe DefaultLoadControl om onze instelling te gebruiken voor het aantal milliseconden mediagegevens dat moet worden gebufferd voordat het afspelen start of wordt hervat na een gebruikersactie.

builder.setBufferDurationMs(
DefaultLoadControl.DEFAULT MAX BUFFER MS,
loadControlStartBufferMs,
DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS);
/* Bouw de eigenlijke DefaultLoadControl-instantie */
DefaultLoadControl loadControl = builder.createDefaultLoadControl();
/*Start ExoPlayer met onze geconfigureerde DefaultLoadControl */
ExoPlayer player = ExoPlayerFactory.newSimpleInstance(
new DefaultRenderersFactory(this),
new DefaultTrackSelector(), loadControl);

Lager Rebuffering Metrics for VOD Content

Naast het configureren van instellingen die leiden tot een lagere opstarttijd, kunt u de DefaultLoadControl configureren om vast te stellen hoeveel mediagegevens moeten worden gebufferd, wat van invloed kan zijn op de rebufferingmetrics voor VOD-inhoud.

ExoPlayer v2.9.6 zal standaard 50 seconden aan media data in de interne buffer laden als het kan (de maxBufferMs instelling). In het geval van VOD inhoud, zal het verhogen van deze waarde de speler meer ruimte geven om fluctuaties in netwerk bandbreedte op te vangen en de rebuffering metriek te verlagen; het nadeel is dat het ook het geheugengebruik van ExoPlayer zal verhogen. Het geheugengebruik laag houden is belangrijk op low-end toestellen. Een ander nadeel is het verspilde bandbreedte gebruik in het geval dat het afspelen voortijdig stopt.

Om de waarde te vinden die het beste werkt voor uw opstelling van VOD inhoud, raden we aan A/B testen te doen met verschillende waarden van de configuratie optie om degene te vinden die een goede afweging geeft tussen rebuffering rates en geheugen gebruik. We raden aan om conservatief te zijn door de waarde te verhogen naar, bijv,

De DefaultLoadControl configureren

We nemen aan dat u uw ExoPlayer instantie aanmaakt met de standaard LoadControl implementatie (zoals getoond in de vorige sectie over het verlagen van de opstarttijd – De DefaultLoadControl configureren).

U kunt de DefaultLoadControl configureren met behulp van een DefaultLoadControl.Builder:

/*Een DefaultLoadControl.Builder. */
DefaultLoadControl.Builder builder = new
DefaultLoadControl.Builder();
/* Maximum hoeveelheid te bufferen mediagegevens (in milliseconden). */
final long loadControlMaxBufferMs = 60000;
/*Configureer de DefaultLoadControl om onze instelling te gebruiken voor hoeveel
Milliseconden aan mediagegevens er gebufferd moeten worden. */
builder.setBufferDurationsMs(
DefaultLoadcontrol.DEFAULT MIN BUFFER MS,
loadControlMaxBufferMs,
/*Om de opstarttijd te verkorten, wijzigt u ook de regel hieronder */
DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_MS,
DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS);
/* Bouw de eigenlijke DefaultLoadControl-instantie */
DefaultLoadControl loadControl = builder.createDefaultLoadControl();
/*Start ExoPlayer met onze geconfigureerde DefaultLoadControl */
ExoPlayer player = ExoPlayerFactory.newSimpleInstance(
new DefaultRenderersFactory(this),
new DefaultTrackSelector(),
loadControl);

In het geval dat minBufferMs en maxBufferMs verschillende waarden hebben, zal ExoPlayer een bursty gedrag vertonen bij het bijvullen van de buffer. ExoPlayer zal bufferen tot zijn buffer is gevuld met maxBufferMs aan mediagegevens, en dan wachten tot het daalt tot minBufferMs (voornamelijk van toepassing op VOD). Zodra het bufferniveau daalt tot onder minBufferMs van mediadata, zal ExoPlayer opnieuw mediadata beginnen laden tot hij een buffer heeft met maxBufferMs van mediadata. Zo’n bursty gedrag kan leiden tot rebuffering problemen. Dit is het standaard gedrag in ExoPlayer v2.9.6 en eerder, omdat deze waarden verschillen. In v2.9.6, heeft minBufferMs een standaard waarde van 15000 en maxBufferMs is 50000.

Om de kans op rebuffering verder te verkleinen, raden we aan om te allen tijde een grote buffer in ExoPlayer te houden, door de minBufferMs op dezelfde waarde in te stellen als maxBufferMs. Het ExoPlayer team heeft experimenten uitgevoerd en ontdekte dat het instellen van minBufferMs op dezelfde waarde als maxBufferMs (en dus het veranderen van het buffergedrag van bursty naar drip-stijl) het aantal rebuffering events aanzienlijk verminderde, terwijl het batterijverbruik slechts licht toenam. In feite, vanaf v2.10, ExoPlayer heeft voor de video use-case de standaard minBufferMs gelijk aan maxBufferMs en ingesteld op 50s.

Hoe de DefaultLoadControl te configureren met behulp van een DefaultLoadControl.Builder:

/*Installeer een DefaultLoadControl.Builder. */
DefaultLoadControl.Builder builder = new
DefaultLoadControl.Builder();
/*Hoeveel milliseconden aan mediagegevens er op elk moment gebufferd moeten worden. */
final long loadControlBufferMs = DefaultloadControl.MAX_BUFFER_MS; /*Dit is 50000 milliseconden in ExoPlayer 2.9.6 */
/*Configureer de DefaultLoadControl om dezelfde waarde te gebruiken voor */
builder.setBufferDurationMs(
loadControlBufferMs,
loadControlBufferMs,
DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_MS,
DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS);

Summary

LoadControl is de ingang tot ExoPlayer’s buffering strategie. ExoPlayer komt met een standaard, maar configureerbare implementatie van de LoadControl interface die voldoende zou moeten zijn voor de meeste gebruikssituaties.

Gebaseerd op de discussies tot nu toe, volgt hieronder een korte recapitulatie van de aanbevelingen:

  1. Om de opstarttijd te verminderen, verlaag de waarde van bufferForPlaybackMs; effectief, het verlagen van de minimum hoeveelheid media data die gebufferd wordt voordat het afspelen start. Dit heeft het nadeel dat het aantal rebuffering events mogelijk toeneemt.
  2. Om de rebuffering metrics voor VOD inhoud te verminderen, verhoogt u de waarde van maxBufferMs; effectief, het verhogen van de maximale hoeveelheid gebufferde media data. Houd er echter rekening mee dat dit een negatieve invloed kan hebben op low-end apparaten.
  3. Om de rebuffering metriek te verminderen, stel minBufferMs en maxBufferMs in op dezelfde waarde. Dit zal het gedrag van ExoPlayer veranderen van een bursty naar een drip-stijl buffering.

We willen onze collega’s Christian Worm Mortensen en Laust Brock-Nannestad bedanken voor hun feedback bij het schrijven van deze post.

In de volgende blog post, zullen we kijken naar ExoPlayer’s Bitrate Selectie Strategie. Blijf op de hoogte!

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.