ExoPlayer’s Buffering Strategy

ExoPlayer Version Investigated: 2.9.6

Klassen, die die LoadControl-Schnittstelle implementieren, definieren die Pufferungsstrategie des ExoPlayers. Die Pufferungsstrategie beantwortet Fragen wie:

  • Müssen wir mehr Mediendaten laden?
  • Haben wir genug Mediendaten, um die Wiedergabe zu starten?

Die Pufferungsstrategie ist nicht für die Verwaltung der Puffer oder das Herunterladen von Mediendaten (das ist die MediaSource) oder die Wiedergabe von Mediendaten (das ist der Renderer) verantwortlich. Die Pufferungsstrategie ist unabhängig vom abgespielten Medienformat und hat nur eine „beratende“ Rolle. Es kann gelegentlich vorkommen, dass ExoPlayer das LoadControl „fragt“, ob neue Mediendaten geladen werden sollen, und die Antwort ignoriert (z.B. wenn ExoPlayer bereits dabei ist, Mediendaten herunterzuladen).

ExoPlayer wird mit einer Standardimplementierung geliefert, DefaultLoadControl. Dies ist eine anpassbare Implementierung der LoadControl-Schnittstelle.

DefaultLoadControl kann verwendet werden, um z.B. zu konfigurieren:

  • Wie viele Millisekunden (ms) an Mediendaten ExoPlayer puffern soll, bevor die Wiedergabe gestartet wird (bezeichnet als bufferForPlaybackMs). ExoPlayer startet die Wiedergabe, sobald mindestens bufferForPlaybackMs an Mediendaten vorhanden ist, auch wenn ExoPlayer das Segment nicht vollständig gepuffert hat.
  • Die Mindestmenge an gepufferten Mediendaten (in ms), bevor ExoPlayer mit dem Laden weiterer Daten beginnt (bezeichnet als minBufferMs).
  • Die maximale Menge an Mediendaten (in ms), die ExoPlayer zwischenspeichern sollte, bevor er anhält, um weitere Daten zu laden (bezeichnet als maxBufferMs).
  • Wie viele Millisekunden an Mediendaten ExoPlayer zwischenspeichern sollte, bevor die Wiedergabe nach einem Rebuffering-Ereignis neu gestartet wird (bezeichnet als bufferForPlaybackAfterRebufferMs).

DefaultLoadControl hat Standardwerte für jede dieser Einstellungen. In v2.9.6, sind diese Werte:

bufferForPlaybackMs

minBufferMs

maxBufferMs

bufferForPlaybackAfterRebufferMs

Doch, die Werte variieren von ExoPlayer-Version zu Version. So hat sich z.B. zwischen ExoPlayer v2.7.3 und v2.8.0 die maxBufferMs für Videostreams von 30 Sekunden auf 50 Sekunden geändert.

Die modulare Architektur von ExoPlayer erlaubt es auch, eine eigene Pufferstrategie zu implementieren (die die LoadControl-Schnittstelle implementiert) und in ExoPlayer einzubauen. Aber das ist ein Thema für einen anderen Beitrag.

Verringerung der Startzeit

In ExoPlayer ist es einfach zu konfigurieren, wie viele Mediendaten benötigt werden, bevor die Wiedergabe gestartet wird. Im ersten Teil dieser Blogserie haben wir die Bedeutung der Startzeit als QoE-Metrik hervorgehoben. Ein von Akamai im Jahr 2016 veröffentlichter Bericht ergab, dass „Zuschauer ein Video verlassen, wenn der Start länger als zwei Sekunden dauert, bevor die Wiedergabe beginnt, und für jede weitere Sekunde Verzögerung verlassen etwa 6 % der Zuschauer das Video. Bei einer Verzögerung von 10 Sekunden hat fast die Hälfte der Zuschauer das Video verlassen.“

ExoPlayer Version 2.9.6 benötigt standardmäßig 2,5 Sekunden gepufferte Mediendaten, bevor die Wiedergabe gestartet wird. Es ist möglich, die Startzeit zu verringern, indem weniger Daten gepuffert werden müssen. Einerseits würde eine Verringerung des Wertes für die Pufferung von Mediendaten zu einer Verringerung der Videostartzeit führen, andererseits könnte dies aber auch zu einer Erhöhung der Rebuffering-Metriken beim Start führen.

Im ersten Teil dieser Blogserie haben wir ein Radardiagramm verwendet, um die Auswirkungen der verschiedenen Kompromisse auf die 5 QoE-Metriken zu visualisieren. Das folgende Diagramm zeigt die Auswirkungen einer Senkung der minimal erforderlichen Mediendatenmenge, bevor die Wiedergabe gestartet wird.

enhancing one.pngDa der Standardwert für bufferForPlaybackMs von 2,5 Sekunden ein konservativer Wert ist, glauben wir, dass es eine gute Wahl ist, ihn zu senken.

Das nachstehende Diagramm zeigt die Auswirkungen auf die Startzeit für einen 3-Mbit/s-Stream, wenn der Wert dieser Konfigurationsoption variiert wird (ohne Berücksichtigung der Roundtrip-Zeit zum Server oder ob der Server den Inhalt von einem anderen Ort abrufen muss). Wenn Sie beispielsweise bei einer 4-Mbit/s-Verbindung einen 3-Mbit/s-Stream abspielen und ExoPlayer so konfigurieren, dass die Wiedergabe nach dem Puffern von 1,5 Sekunden Mediendaten beginnt, beträgt die theoretische Startzeit 1,1 Sekunden statt 1,9 Sekunden bei der Standardkonfiguration, bei der 2,5 Sekunden Mediendaten gepuffert werden.

enhancing two.pngIm nächsten Abschnitt erfahren Sie, wie Sie ExoPlayer so konfigurieren können, dass die Startzeit und die Latenzzeit beim Handwinken verringert werden. Wenn Sie mit ExoPlayer nicht vertraut sind, empfehlen wir Ihnen, zunächst die Codelabs von Google zum Thema Medienstreaming mit ExoPlayer zu verfolgen.

DefaultLoadControl konfigurieren

Angenommen, Sie erstellen Ihre ExoPlayer-Instanz mit der Standard-LoadControl-Implementierung unter Verwendung des folgenden Codes (oder ähnlich):

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

Sie können das DefaultLoadControl mit einem DefaultLoadControl.Builder konfigurieren:

/* Instanziieren Sie einen DefaultLoadControl.Builder. */
DefaultLoadControl.Builder builder = new DefaultLoadControl.Builder();
/* Millisekunden der Mediendaten, die gepuffert werden, bevor die Wiedergabe beginnt oder fortgesetzt wird. */
final long loadControlStartBufferMs = 1500;

Konfigurieren Sie das neue DefaultLoadControl so, dass es unsere Einstellung verwendet, wie viele Millisekunden an Mediendaten gepuffert werden müssen, bevor die Wiedergabe nach einem Benutzeraktionsereignis beginnt oder fortgesetzt wird.

builder.setBufferDurationMs(
DefaultLoadControl.DEFAULT MAX BUFFER MS,
loadControlStartBufferMs,
DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS);
/* Erstellen der eigentlichen DefaultLoadControl-Instanz */
DefaultLoadControl loadControl = builder.createDefaultLoadControl();
/* ExoPlayer mit unserem konfigurierten DefaultLoadControl instanziieren */
ExoPlayer player = ExoPlayerFactory.newSimpleInstance(
new DefaultRenderersFactory(this),
new DefaultTrackSelector(), loadControl);

Neben der Konfiguration von Einstellungen, die zu einer geringeren Startzeit führen, können Sie das DefaultLoadControl konfigurieren, um festzulegen, wie viele Mediendaten gepuffert werden sollen, was sich auf die Rebuffering-Metriken für VOD-Inhalte auswirken kann.

ExoPlayer v2.9.6 lädt standardmäßig 50 Sekunden an Mediendaten in seinen internen Puffer, wenn er dazu in der Lage ist (die Einstellung maxBufferMs). Im Falle von VOD-Inhalten gibt eine Erhöhung dieses Wertes dem Player mehr Spielraum, um mit Schwankungen der Netzwerkbandbreite umzugehen, und senkt die Rebuffering-Metriken; der Nachteil ist, dass dies auch die Speichernutzung des ExoPlayers erhöht. Auf Low-End-Geräten ist es wichtig, die Speichernutzung niedrig zu halten. Ein weiterer Nachteil ist die vergeudete Bandbreite, wenn die Wiedergabe vorzeitig beendet wird.

Um den Wert zu finden, der für Ihre Einrichtung von VOD-Inhalten am besten geeignet ist, empfehlen wir A/B-Tests mit verschiedenen Werten der Konfigurationsoption, um den Wert zu finden, der einen guten Kompromiss zwischen Rückpufferungsraten und Speichernutzung bietet. Wir empfehlen, den Wert konservativ zu erhöhen, z. B. auf,

Konfiguration des DefaultLoadControl

Wir gehen davon aus, dass Sie Ihre ExoPlayer-Instanz mit der Standard-LoadControl-Implementierung erstellen (wie im vorherigen Abschnitt über die Verringerung der Startzeit – Konfiguration des DefaultLoadControl).

Sie können das DefaultLoadControl mit einem DefaultLoadControl.Builder konfigurieren:

/* Instanziieren Sie einen DefaultLoadControl.Builder. */
DefaultLoadControl.Builder builder = new
DefaultLoadControl.Builder();
/* Maximale Menge der zu puffernden Mediendaten (in Millisekunden). */
final long loadControlMaxBufferMs = 60000;
/*Konfigurieren Sie das DefaultLoadControl so, dass es unsere Einstellung verwendet, wie viele
Millisekunden an Mediendaten gepuffert werden sollen. */
builder.setBufferDurationsMs(
DefaultLoadcontrol.DEFAULT MIN BUFFER MS,
loadControlMaxBufferMs,
/* Um die Startzeit zu reduzieren, ändern Sie auch die Zeile unter */
DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_MS,
DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS);
/* Erstellen der eigentlichen DefaultLoadControl-Instanz */
DefaultLoadControl loadControl = builder.createDefaultLoadControl();
/* ExoPlayer mit unserem konfigurierten DefaultLoadControl instanziieren */
ExoPlayer player = ExoPlayerFactory.newSimpleInstance(
new DefaultRenderersFactory(this),
new DefaultTrackSelector(),
loadControl);

Wenn minBufferMs und maxBufferMs unterschiedliche Werte haben, wird ExoPlayer ein sprunghaftes Verhalten beim Auffüllen des Puffers haben. ExoPlayer puffert so lange, bis der Puffer mit maxBufferMs an Mediendaten gefüllt ist, und wartet dann, bis er auf minBufferMs sinkt (gilt hauptsächlich für VOD). Sobald der Pufferstand unter minBufferMs an Mediendaten fällt, beginnt der ExoPlayer erneut mit dem Laden von Mediendaten, bis er einen Puffer im Wert von maxBufferMs an Mediendaten hat. Solch ein sprunghaftes Verhalten kann zu Rebuffering-Problemen führen. Dies ist das Standardverhalten in ExoPlayer v2.9.6 und früher, da sich diese Werte unterscheiden. In v2.9.6 hat minBufferMs einen Standardwert von 15000 und maxBufferMs einen Wert von 50000.

Um die Wahrscheinlichkeit eines Rebuffers weiter zu verringern, empfehlen wir, in ExoPlayer stets einen großen Puffer zu halten, indem minBufferMs auf denselben Wert wie maxBufferMs gesetzt wird. Das ExoPlayer-Team hat Experimente durchgeführt und festgestellt, dass die Einstellung von minBufferMs auf denselben Wert wie maxBufferMs (und damit die Änderung des Pufferungsverhaltens von bursty zu drip-style) die Rebuffering-Ereignisse deutlich reduziert, während der Batterieverbrauch nur geringfügig ansteigt. Tatsächlich hat ExoPlayer, beginnend mit v2.10, für den Anwendungsfall Video den Standardwert minBufferMs gleich maxBufferMs und auf 50s gesetzt.

Wie man das DefaultLoadControl mit einem DefaultLoadControl.Builder konfiguriert:

/* Instanziieren eines DefaultLoadControl.Builders. */
DefaultLoadControl.Builder builder = new
DefaultLoadControl.Builder();
/*Wie viele Millisekunden an Mediendaten zu jeder Zeit gepuffert werden sollen. */
final long loadControlBufferMs = DefaultloadControl.MAX_BUFFER_MS; /* Dies ist 50000 Millisekunden in ExoPlayer 2.9.6 */
/* Konfigurieren Sie das DefaultLoadControl so, dass es den gleichen Wert für */
Builder verwendet.setBufferDurationMs(
loadControlBufferMs,
loadControlBufferMs,
DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_MS,
DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS);

Summary

LoadControl ist der Einstiegspunkt für die Pufferungsstrategie von ExoPlayer. ExoPlayer wird mit einer standardmäßigen, aber konfigurierbaren Implementierung der LoadControl-Schnittstelle ausgeliefert, die für die meisten Anwendungsfälle ausreichen sollte.

Auf der Grundlage der bisherigen Diskussionen folgt eine kurze Zusammenfassung der Empfehlungen:

  1. Um die Startzeit zu verkürzen, sollte der Wert von bufferForPlaybackMs gesenkt werden, d.h. die Mindestmenge der gepufferten Mediendaten vor dem Start der Wiedergabe. Dies hat den Nachteil, dass die Anzahl der Rebuffering-Ereignisse erhöht wird.
  2. Um die Rebuffering-Metriken für VOD-Inhalte zu reduzieren, erhöhen Sie den Wert von maxBufferMs, wodurch die maximale Menge der gepufferten Mediendaten erhöht wird. Beachten Sie jedoch, dass sich dies negativ auf Low-End-Geräte auswirken kann.
  3. Um die Rückpufferungsmetriken zu reduzieren, setzen Sie minBufferMs und maxBufferMs auf denselben Wert. Dadurch ändert sich das Verhalten von ExoPlayer von einem bursty zu einem drip-style buffering.

Wir möchten uns bei unseren Kollegen Christian Worm Mortensen und Laust Brock-Nannestad für ihr Feedback beim Schreiben dieses Beitrags bedanken.

Im nächsten Blogbeitrag werden wir uns die Bitratenauswahlstrategie von ExoPlayer ansehen. Bleiben Sie dran!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.