ExoPlayer’s Buffering Strategy
ExoPlayer Version Investigated: 2.9.6
Třídy implementující rozhraní LoadControl definují strategii vyrovnávací paměti přehrávače ExoPlayer. Strategie vyrovnávací paměti odpovídá na otázky typu:
- potřebujeme načíst další mediální data?
- máme dostatek mediálních dat pro zahájení přehrávání?
Strategie vyrovnávací paměti není zodpovědná za správu vyrovnávací paměti nebo stahování mediálních dat (to je MediaSource) nebo přehrávání mediálních dat (to je Renderer). Strategie vyrovnávací paměti je agnostická vůči formátu přehrávaných médií a má pouze „poradní“ roli. Občas se může stát, že se ExoPlayer „zeptá“ LoadControl, zda se mají načíst nová mediální data, a odpověď bude ignorovat (např. ExoPlayer je již v procesu stahování mediálních dat).
ExoPlayer je dodáván s výchozí implementací DefaultLoadControl. Jedná se o přizpůsobitelnou implementaci rozhraní LoadControl.
DefaultLoadControl lze použít např. ke konfiguraci :
- Kolik milisekund (ms) mediálních dat má ExoPlayer uložit do vyrovnávací paměti před zahájením přehrávání (označováno jako bufferForPlaybackMs). Přehrávač ExoPlayer zahájí přehrávání, jakmile bude mít k dispozici alespoň bufferForPlaybackMs mediálních dat, a to i v případě, že přehrávač ExoPlayer neměl ve vyrovnávací paměti celý segment.
- Minimální množství vyrovnávací paměti mediálních dat (v ms), než přehrávač ExoPlayer začne načítat další data (označováno jako minBufferMs).
- Maximální množství mediálních dat (v ms), které by měl přehrávač ExoPlayer uložit do vyrovnávací paměti, než přestane načítat další (označováno jako maxBufferMs).
- Kolik milisekund mediálních dat by měl přehrávač ExoPlayer uložit do vyrovnávací paměti před opětovným spuštěním přehrávání po události rebufferování (označováno jako bufferForPlaybackAfterRebufferMs).
DefaultLoadControl má pro každé z těchto nastavení výchozí hodnoty. Ve verzi 2.9.6 jsou tyto hodnoty následující:
bufferForPlaybackMs |
|
minBufferMs |
|
maxBufferMs |
|
bufferForPlaybackAfterRebufferMs |
Však, se hodnoty v jednotlivých verzích přehrávače ExoPlayer liší. Např. mezi verzemi ExoPlayer 2.7.3 a 2.8.0 se hodnota maxBufferMs pro videostreamy změnila z 30 sekund na 50 sekund.
Modulární architektura přehrávače ExoPlayer také umožňuje implementovat vlastní strategii vyrovnávací paměti (která implementuje rozhraní LoadControl) a zapojit ji do přehrávače ExoPlayer. Ale to je téma na jiný příspěvek.
Snížení doby spouštění
V přehrávači ExoPlayer lze snadno nastavit, kolik dat médií je potřeba před spuštěním přehrávání. V první části této série blogů jsme zdůraznili význam doby spuštění jako metriky QoE. Zpráva společnosti Akamai zveřejněná v roce 2016 zjistila, že „diváci začnou opouštět video, pokud spuštění trvá déle než dvě sekundy, než se začne přehrávat, a s každou další sekundou zpoždění odchází zhruba dalších 6 % diváků. při 10sekundovém zpoždění odešla téměř polovina diváků.“
ExoPlayer verze 2.9.6 vyžaduje ve výchozím nastavení 2,5 sekundy mediálních dat ve vyrovnávací paměti před zahájením přehrávání. Dobu spuštění je možné snížit tím, že se bude vyžadovat méně dat do vyrovnávací paměti. Na jedné straně by snížení hodnoty vyrovnávací paměti pro mediální data vedlo ke snížení doby spuštění videa, nicméně nevýhodou je, že to může mít za následek také zvýšení metrik odezvy při spuštění.
V první části tohoto seriálu blogu jsme použili radarový graf pro vizualizaci dopadu různých kompromisů na 5 metrik QoE. Následující graf ukazuje dopad snížení minimálního požadovaného množství mediálních dat před zahájením přehrávání.
Protože výchozí hodnota bufferForPlaybackMs ve výši 2,5 sekundy je konzervativní, domníváme se, že je dobrou volbou ji snížit.
Níže uvedený graf ukazuje dopad na dobu spuštění streamu o rychlosti 3 Mb/s při změně hodnoty této konfigurační možnosti (nezohledňuje dobu cesty na server ani to, zda server musí obsah načítat odjinud). Například u připojení o rychlosti 4 Mb/s, které přehrává stream o rychlosti 3 Mb/s, znamená konfigurace přehrávače ExoPlayer pro spuštění přehrávání po vyrovnávací paměti 1,5 s mediálních dat teoretickou dobu spuštění 1,1 s místo 1,9 s při výchozí konfiguraci vyrovnávací paměti 2,5 s mediálních dat.
Další část pojednává o tom, jak nakonfigurovat přehrávač ExoPlayer, aby se snížila doba spuštění a latence mávání rukou. Pokud s přehrávačem ExoPlayer nejste obeznámeni, doporučujeme nejprve sledovat Codelabs společnosti Google o streamování médií pomocí přehrávače ExoPlayer.
Konfigurace DefaultLoadControl
Předpokládáme, že jste vytvořili instanci přehrávače ExoPlayer s výchozí implementací LoadControl pomocí následujícího kódu (nebo podobného):
ExoPlayer player = ExoPlayerFactory.newSimpleInstance(
new DefaultRenderersFactory(this),
new DefaultTrackSelector(),
new DefaultLoadControl())
Můžete nakonfigurovat DefaultLoadControl pomocí DefaultLoadControl.Builder:
/* Instancujte DefaultLoadControl.Builder. */
DefaultLoadControl.Builder builder = new DefaultLoadControl.Builder();
/* Milisekundy mediálních dat ve vyrovnávací paměti před zahájením nebo obnovením přehrávání. */
final long loadControlStartBufferMs = 1500;
Nakonfigurujeme nový DefaultLoadControl tak, aby používal naše nastavení, kolik milisekund mediálních dat musí být uloženo do vyrovnávací paměti před spuštěním nebo obnovením přehrávání po události uživatelské akce.
builder.setBufferDurationMs(
DefaultLoadControl.DEFAULT MAX BUFFER MS,
loadControlStartBufferMs,
DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS);
/* Sestavte vlastní instanci DefaultLoadControl */
DefaultLoadControl loadControl = builder.createDefaultLoadControl();
/* Instancujte ExoPlayer s naším nakonfigurovaným DefaultLoadControl */
ExoPlayer player = ExoPlayerFactory.newSimpleInstance(
new DefaultRenderersFactory(this),
new DefaultTrackSelector(), loadControl);
Snížení metrik přepočítávání pro obsah VOD
Kromě konfigurace nastavení, která vedou ke snížení doby spuštění, můžete nakonfigurovat DefaultLoadControl, abyste určili, kolik dat médií se má ukládat do vyrovnávací paměti, což může ovlivnit metriky přepočítávání pro obsah VOD.
Přehrávač ExoPlayer v2.9.6 ve výchozím nastavení načte do své interní vyrovnávací paměti 50 sekund mediálních dat, pokud je to možné (nastavení maxBufferMs). V případě obsahu VOD poskytne zvýšení této hodnoty přehrávači více prostoru pro zvládání výkyvů v šířce pásma sítě a nižší metriku rebufferingu; nevýhodou je, že se tím také zvýší využití paměti přehrávače ExoPlayer. U zařízení nižší třídy je důležité udržet nízké využití paměti. Další nevýhodou je zbytečné využití šířky pásma v případě, že se přehrávání předčasně zastaví.
Chcete-li najít hodnotu, která nejlépe vyhovuje vašemu nastavení obsahu VOD, doporučujeme provést A/B testování s různými hodnotami konfigurační možnosti a najít tu, která poskytuje dobrý kompromis mezi mírou odezvy a využitím paměti. Doporučujeme být konzervativní a zvýšit hodnotu na např, 60 sekund, abyste zjistili, zda to přinese podstatný rozdíl v metrikách přepočítávání.
Konfigurace výchozího řízení zatížení
Předpokládáme, že jste vytvořili instanci přehrávače ExoPlayer s výchozí implementací řízení zatížení (jak je uvedeno v předchozí části Snížení doby spouštění – konfigurace výchozího řízení zatížení).
Můžete nakonfigurovat DefaultLoadControl pomocí DefaultLoadControl.Builder:
/* Instancujte DefaultLoadControl.Builder. */
DefaultLoadControl.Builder builder = new
DefaultLoadControl.Builder();
/* Maximální množství mediálních dat do vyrovnávací paměti (v milisekundách). */
final long loadControlMaxBufferMs = 60000;
/*Konfigurujeme DefaultLoadControl tak, aby používal naše nastavení, kolik
milisekund mediálních dat se má ukládat do vyrovnávací paměti. */
builder.setBufferDurationsMs(
DefaultLoadcontrol.DEFAULT MIN BUFFER MS,
loadControlMaxBufferMs,
/* Chcete-li zkrátit dobu spouštění, změňte také řádek níže */
DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_MS,
DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS);
/* Sestavte vlastní instanci DefaultLoadControl */
DefaultLoadControl loadControl = builder.createDefaultLoadControl();
/* Instancujte ExoPlayer s naším nakonfigurovaným DefaultLoadControl */
ExoPlayer player = ExoPlayerFactory.newSimpleInstance(
new DefaultRenderersFactory(this),
new DefaultTrackSelector(),
loadControl);
V případě, že minBufferMs a maxBufferMs mají různé hodnoty, ExoPlayer bude mít burst chování doplňující buffer. Přehrávač ExoPlayer bude bufferovat, dokud nenaplní vyrovnávací paměť maxBufferMs mediálními daty, a pak počká, až se sníží na minBufferMs (platí hlavně pro VOD). Jakmile úroveň vyrovnávací paměti klesne pod minBufferMs mediálních dat, začne přehrávač ExoPlayer znovu načítat mediální data, dokud nebude mít vyrovnávací paměť v hodnotě maxBufferMs mediálních dat. Takovéto burstové chování může vést k problémům s rebufferingem. Toto je výchozí chování v přehrávači ExoPlayer v2.9.6 a předchozích verzích, protože tyto hodnoty se liší. Ve verzi v2.9.6 má minBufferMs výchozí hodnotu 15000 a maxBufferMs je 50000.
Pro další snížení pravděpodobnosti rebufferingu doporučujeme udržovat v přehrávači ExoPlayer vždy velkou vyrovnávací paměť nastavením minBufferMs na stejnou hodnotu jako maxBufferMs. Tým přehrávače ExoPlayer provedl experimenty a zjistil, že nastavení minBufferMs na stejnou hodnotu jako maxBufferMs (a tedy změna chování vyrovnávací paměti z bursty na drip-style) výrazně snížilo výskyt rebufferingu a zároveň jen mírně zvýšilo spotřebu baterie. Ve skutečnosti má ExoPlayer od verze 2.10 pro případ použití videa výchozí minBufferMs rovný maxBufferMs a nastavený na 50s.
Jak nakonfigurovat DefaultLoadControl pomocí DefaultLoadControl.Builder:
/* Instancujte DefaultLoadControl.Builder. */
DefaultLoadControl.Builder builder = new
DefaultLoadControl.Builder();
/*Kolik milisekund mediálních dat se má v každém okamžiku uložit do vyrovnávací paměti. */
final long loadControlBufferMs = DefaultloadControl.MAX_BUFFER_MS; /* V ExoPlayeru 2.9.6 je to 50000 milisekund */
/* Nastavte DefaultLoadControl tak, aby používal stejnou hodnotu pro */
builder.setBufferDurationMs(
loadControlBufferMs,
loadControlBufferMs,
DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_MS,
DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS);
Summary
LoadControl je vstupním bodem strategie vyrovnávací paměti přehrávače ExoPlayer. Přehrávač ExoPlayer je dodáván s výchozí, avšak konfigurovatelnou implementací rozhraní LoadControl, která by měla být pro většinu případů použití dostačující.
Na základě dosavadních diskusí níže uvádíme stručnou rekapitulaci doporučení:
- Chcete-li zkrátit dobu spuštění, snižte hodnotu bufferForPlaybackMs; efektivně tak snížíte minimální množství mediálních dat ukládaných do vyrovnávací paměti před zahájením přehrávání. To má nevýhodu v potenciálním zvýšení počtu událostí obnovení.
- Chcete-li snížit metriku obnovení pro obsah VOD, zvyšte hodnotu maxBufferMs; efektivně zvýšíte maximální množství dat médií uložených ve vyrovnávací paměti. Mějte však na paměti, že to může mít negativní dopad na zařízení nižší třídy.
- Chcete-li snížit metriky rebufferingu, nastavte minBufferMs a maxBufferMs na stejnou hodnotu. Tím změníte chování přehrávače ExoPlayer z bursty na drip-style buffering.
Rádi bychom poděkovali kolegům Christianu Worm Mortensenovi a Laustu Brock-Nannestadovi za zpětnou vazbu při psaní tohoto příspěvku.
V příštím příspěvku na blogu se podíváme na strategii výběru datového toku přehrávače ExoPlayer. Zůstaňte naladěni!