Strategia de bufferizare a ExoPlayer

Versiunea ExoPlayer investigată: 2.9.6

Classele care implementează interfața LoadControl definesc strategia de tamponare a ExoPlayer. Strategia de tamponare răspunde la întrebări de genul:

  • trebuie să încărcăm mai multe date media?
  • avem suficiente date media pentru a începe redarea?

Strategia de tamponare nu este responsabilă de gestionarea tampoanelor sau de descărcarea datelor media (care este MediaSource), sau de redarea datelor media (care este Renderer). Strategia de tamponare este agnostică față de formatul media care este redat și are doar un rol „consultativ”. Se poate întâmpla ocazional ca ExoPlayer să „întrebe” LoadControl dacă trebuie încărcate noi date media și să ignore răspunsul (de exemplu, ExoPlayer este deja în procesul de descărcare a datelor media).

ExoPlayer vine cu o implementare implicită, DefaultLoadControl. Aceasta este o implementare personalizabilă a interfeței LoadControl.

DefaultLoadControl poate fi utilizată pentru a configura, de exemplu :

  • Câte milisecunde (ms) de date media trebuie să stocheze ExoPlayer înainte de a începe redarea (denumit bufferForPlaybackMs). ExoPlayer va începe redarea de îndată ce are cel puțin bufferForPlaybackMs de date media, chiar dacă ExoPlayer nu a pus în buffer întregul segment.
  • Cantitatea minimă de date media puse în buffer (în ms) înainte ca ExoPlayer să înceapă să încarce mai multe date (denumită minBufferMs).
  • Cantitatea maximă de date media (în ms) pe care ExoPlayer ar trebui să o pună în buffer înainte de a se opri pentru a încărca mai mult (denumit maxBufferMs).
  • Câte milisecunde de date media ExoPlayer ar trebui să pună în buffer înainte de a reîncepe redarea după un eveniment de rebuffering (denumit bufferForPlaybackAfterRebufferMs).

DefaultLoadControl are valori implicite pentru fiecare dintre aceste setări. În v2.9.6, aceste valori sunt:

.

bufferForPlaybackMs

minBufferMs

maxBufferMs

bufferForPlaybackAfterRebufferMs

Cu toate acestea, valorile variază de la o versiune la alta a ExoPlayer. De exemplu, între ExoPlayer v2.7.3 și v2.8.0, valoarea maxBufferMs pentru fluxurile video s-a modificat de la 30 de secunde la 50 de secunde.

Arhitectura modulară a lui ExoPlayer vă permite, de asemenea, să vă implementați propria strategie de bufferizare (care implementează interfața LoadControl) și să o conectați în ExoPlayer. Dar acesta este un subiect pentru o altă postare.

Diminuarea timpului de pornire

În ExoPlayer, este ușor de configurat cât de multe date media sunt necesare înainte de a începe redarea. În prima parte a acestei serii de bloguri, am evidențiat importanța timpului de pornire ca metrică QoE. Un raport Akamai publicat în 2016 a constatat că „telespectatorii vor începe să abandoneze un videoclip dacă pornirea durează mai mult de două secunde pentru a începe redarea și pentru fiecare secundă suplimentară de întârziere, aproximativ 6 % în plus din audiență pleacă. cu o întârziere de 10 secunde, aproape jumătate din audiență a plecat”.

ExoPlayer versiunea 2.9.6 necesită în mod implicit 2,5 secunde de date media stocate în buffer înainte de a iniția redarea. Este posibil să se scadă timpul de pornire cerând ca mai puține date să fie puse în buffer. Pe de o parte, scăderea valorii de tamponare a datelor media ar duce la scăderea timpului de pornire video, însă dezavantajul este că acest lucru ar putea duce, de asemenea, la creșterea metricilor de rebuffering la pornire.

În prima parte a acestei serii de bloguri, am folosit un grafic radar pentru a vizualiza impactul diferitelor compromisuri asupra celor 5 metrici QoE. Graficul de mai jos arată impactul scăderii cantității minime necesare de date media înainte de a iniția redarea.

enhancing one.pngDin moment ce valoarea implicită pentru bufferForPlaybackMs de 2,5 secunde este o valoare conservatoare, considerăm că este o alegere bună să o micșorăm.

Graficul de mai jos arată impactul asupra timpului de pornire pentru un flux de 3 Mbps atunci când se variază valoarea acestei opțiuni de configurare (fără a lua în considerare timpul de călătorie dus-întors către server și nici dacă serverul trebuie să aducă conținutul din altă parte). De exemplu, pe o conexiune de 4 Mbps care redă un flux de 3 Mbps, configurarea ExoPlayer pentru a începe redarea după ce a pus în memorie tampon 1,5 s de date media înseamnă că timpul de pornire teoretic va fi de 1,1 s, în loc de 1,9 s cu configurația implicită de punere în memorie tampon de 2,5 s de date media.

enhancing two.pngSecțiunea următoare vorbește despre cum se poate configura ExoPlayer pentru a reduce timpul de pornire și latența de fluturare a mâinii. Dacă nu sunteți familiarizați cu ExoPlayer, vă recomandăm să urmăriți mai întâi Codelabs de la Google privind streamingul media cu ExoPlayer.

Configurarea DefaultLoadControl

Să presupunem că ați creat instanța ExoPlayer cu implementarea implicită LoadControl folosind următorul cod (sau unul similar):

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

Puteți configura DefaultLoadControl folosind un DefaultLoadControl.Builder:

/* Instanțiați un DefaultLoadControl.Builder. */
DefaultLoadControl.Builder builder = new DefaultLoadControl.Builder();
/* Milisecunde de date media stocate în memoria tampon înainte de începerea sau reluarea redării. */
final long loadControlStartBufferMs = 1500;

Configurați noul DefaultLoadControl pentru a utiliza setarea noastră pentru câte milisecunde de date media trebuie să fie stocate în memoria tampon înainte ca redarea să înceapă sau să se reia după un eveniment de acțiune a utilizatorului.

builder.setBufferDurationMs(
DefaultLoadControl.DEFAULT MAX BUFFER MS,
loadControlStartBufferMs,
DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS);
/* Construiește instanța efectivă DefaultLoadControl */
DefaultLoadControl loadControl = builder.createDefaultLoadControl();
/* Instanțiază ExoPlayer cu DefaultLoadControl-ul nostru configurat */
ExoPlayer player = ExoPlayerFactory.newSimpleInstance(
new DefaultRenderersFactory(this),
new DefaultTrackSelector(), loadControl);

Diminuarea metricilor de rebuffering pentru conținutul VOD

În afară de configurarea setărilor care conduc la un timp de pornire mai mic, puteți configura DefaultLoadControl pentru a stabili cât de multe date media să fie puse în buffer, ceea ce poate avea un impact asupra metricilor de rebuffering pentru conținutul VOD.

ExoPlayer v2.9.6 va încărca în mod implicit 50 de secunde de date media în bufferul său intern dacă poate (setarea maxBufferMs). În cazul conținutului VOD, creșterea acestei valori va oferi jucătorului mai mult spațiu pentru a face față fluctuațiilor lățimii de bandă a rețelei și pentru a reduce metricile de rebuffering; dezavantajul este că va crește, de asemenea, utilizarea memoriei ExoPlayer. Menținerea unei utilizări reduse a memoriei este importantă pe dispozitivele low-end. Un alt dezavantaj este utilizarea irosită a lățimii de bandă în cazul în care redarea se oprește prematur.

Pentru a găsi valoarea care funcționează cel mai bine pentru configurația dvs. de conținut VOD, vă recomandăm să faceți teste A/B cu diferite valori ale opțiunii de configurare pentru a o găsi pe cea care oferă un compromis bun între ratele de rebuffering și utilizarea memoriei. Vă recomandăm să fiți conservatori, crescând valoarea la, de ex, 60 de secunde inițial, pentru a afla dacă oferă o diferență materială pentru metricile de rebuffering.

Configurarea DefaultLoadControl

Supunem că vă creați instanța ExoPlayer cu implementarea implicită a LoadControl (așa cum se arată în secțiunea anterioară privind Reducerea timpului de pornire – Configurarea DefaultLoadControl).

Puteți configura DefaultLoadControl folosind un DefaultLoadControl.Builder:

/* Instanțiați un DefaultLoadControl.Builder. */
DefaultLoadControl.Builder builder = new
DefaultLoadControl.Builder();
/* Cantitatea maximă de date media de pus în buffer (în milisecunde). */
final long loadControlMaxBufferMs = 60000;
/*Configurați DefaultLoadControl pentru a utiliza setarea noastră pentru câte
Milisecunde de date media trebuie puse în buffer. */
builder.setBufferDurationsMs(
DefaultLoadcontrol.DEFAULT MIN BUFFER MS,
loadControlMaxBufferMs,
/*Pentru a reduce timpul de pornire, modificați, de asemenea, linia de mai jos */
DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_MS,
DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS);
/* Construiți instanța efectivă DefaultLoadControl */
DefaultLoadControl loadControl = builder.createDefaultLoadControl();
/* Instanțiază ExoPlayer cu DefaultLoadControl-ul nostru configurat */
ExoPlayer player = ExoPlayerFactory.newSimpleInstance(
new DefaultRenderersFactory(this),
new DefaultTrackSelector(),
loadControl);

În cazul în care minBufferMs și maxBufferMs au valori diferite, ExoPlayer va avea un comportament exploziv de reumplere a bufferului. ExoPlayer va tampona până când își umple bufferul cu maxBufferMs de date media, apoi va aștepta până când acesta scade la minBufferMs (aplicabil în principal la VOD). Odată ce nivelul bufferului scade sub minBufferMs de date media, ExoPlayer va începe din nou să încarce date media până când va avea un buffer în valoare de maxBufferMs de date media. Un astfel de comportament exploziv poate duce la probleme de rebuffering. Acesta este comportamentul implicit în ExoPlayer v2.9.6 și versiunile anterioare, deoarece aceste valori diferă. În v2.9.6, minBufferMs are o valoare implicită de 15000, iar maxBufferMs este de 50000.

Pentru a reduce și mai mult șansele de rebuffering, vă recomandăm să mențineți în permanență un buffer mare în ExoPlayer, prin setarea valorii minBufferMs la aceeași valoare ca și maxBufferMs. Echipa ExoPlayer a efectuat experimente și a constatat că setarea minBufferMs la aceeași valoare ca și maxBufferMs (și, astfel, schimbarea comportamentului de tamponare de la stilul bursty la stilul drip) a redus semnificativ evenimentele de rebuffering, în timp ce a crescut doar puțin utilizarea bateriei. De fapt, începând cu v2.10, ExoPlayer are pentru cazul de utilizare video valoarea implicită minBufferMs egală cu maxBufferMs și setată la 50s.

Cum se configurează DefaultLoadControl folosind un DefaultLoadControl.Builder:

/* Instanțiați un DefaultLoadControl.Builder. */
DefaultLoadControl.Builder builder = new
DefaultLoadControl.Builder();
/*Câte milisecunde de date media se pun în buffer în orice moment. */
final long loadControlBufferMs = DefaultloadControl.MAX_BUFFER_MS; /* Aceasta este de 50000 milisecunde în ExoPlayer 2.9.6 */
/* Configurați DefaultLoadControl pentru a utiliza aceeași valoare pentru */
builder.setBufferDurationMs(
loadControlBufferMs,
loadControlBufferMs,
DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_MS,
DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS);

Summary

LoadControl este punctul de intrare în strategia de bufferizare a ExoPlayer. ExoPlayer vine cu o implementare implicită, dar configurabilă, a interfeței LoadControl care ar trebui să fie suficientă pentru majoritatea cazurilor de utilizare.

Pe baza discuțiilor de până acum, iată mai jos o scurtă recapitulare a recomandărilor:

  1. Pentru a reduce timpul de pornire, reduceți valoarea bufferForPlaybackMs; în mod eficient, reduceți cantitatea minimă de date media stocate în buffer înainte de a începe redarea. Acest lucru are dezavantajul creșterii potențiale a numărului de evenimente de rebuffering.
  2. Pentru a reduce metricile de rebuffering pentru conținutul VOD, creșteți valoarea lui maxBufferMs; crescând efectiv cantitatea maximă de date media stocate în buffer. Cu toate acestea, rețineți că poate avea un impact negativ asupra dispozitivelor low-end.
  3. Pentru a reduce metricile de rebuffering, setați minBufferMs și maxBufferMs la aceeași valoare. Acest lucru va schimba comportamentul lui ExoPlayer de la o tamponare în rafală la o tamponare de tip „drip”.

Am dori să le mulțumim colegilor noștri Christian Worm Mortensen și Laust Brock-Nannestad pentru feedback-ul primit la scrierea acestei postări.

În următoarea postare de pe blog, vom analiza Strategia de selecție a ratei de biți a ExoPlayer. Rămâneți pe recepție!

Lasă un răspuns

Adresa ta de email nu va fi publicată.