Das Brightcove-SDK v6.9.0 wurde am 22. Oktober 2019 veröffentlicht und enthält mehrere Änderungen (wie in den Versionshinweisen angegeben). In diesem Beitrag möchte ich jedoch speziell auf die Änderungen am SSAI-Plugin eingehen, insbesondere auf die zusätzliche Unterstützung für Live SSAI.
LIVE SSAI ÜBERSICHT
Was ist Live SSAI? Kurz gesagt ist Live SSAI ein Live-Stream mit dynamisch eingefügten Anzeigen. Weitere Informationen über die Live SSAI API finden Sie unter Live API: Server-Side Ad Insertion (SSAI)") - und auch unter Video Cloud SSAI Overview, um mehr über SSAI im Allgemeinen zu erfahren.
Wenn Sie einen SSAI-Livestream in einem beliebigen Player wiedergeben, sehen Sie sowohl den Content als auch die Werbung als Teil desselben Streams, und es gibt keine visuelle Unterscheidung zwischen den beiden. An dieser Stelle kommen das Brightcove-SDK und das SSAI-Plugin ins Spiel. Das SSAI-Plugin erkennt, wenn eine Werbeunterbrechung abgespielt wird, und der Controller ändert sich, um nützliche Informationen anzuzeigen, z. B. die Dauer der Werbeunterbrechung, die Dauer der einzelnen Anzeige und den Countdown für die Anzeigenanzahl.
ERSTE SCHRITTE
Bevor ich über Android und den SSAI-Plugin-Code spreche, müssen Sie die folgenden Dinge tun:
- Eine Live-Anzeigenkonfiguration erstellen
- Einrichten Ihres Live-Streams
- Suchen und kopieren Sie Ihre Live adConfigId
EINE LIVE-ANZEIGENKONFIGURATION ERSTELLEN
Sie müssen eine Anzeigenkonfiguration auf die gleiche Weise wie bei einem VOD-Video erstellen. Befolgen Sie dazu bitte die folgende Anleitung: Erstellen einer Live-Anzeigenkonfiguration. Sie können auch einen Blick auf Implementieren von serverseitigen Anzeigen im Live-Modul werfen.
IHREN LIVE-STREAM EINRICHTEN
Um Ihren Live-Stream mit SSAI-Unterstützung zu erstellen, folgen Sie bitte den Anweisungen: Erstellen eines Live-Events, das serverseitige Anzeigen unterstützt.
SUCHEN UND KOPIEREN SIE IHRE LIVE-KONFIGURATIONSDATEI
Wenn Sie in Schritt 1 eine Live-Anzeigenkonfiguration erstellen, erhalten Sie eine Id, und Sie könnten versucht sein, diese als adConfigId zu verwenden, wie es bei VOD SSAI der Fall ist. Dies ist jedoch nicht die Id, die wir für Live SSAI benötigen.
So finden Sie die Live adConfigIdmüssen Sie die Schritte in Veröffentlichung der Live-Veranstaltung. Im letzten Schritt wird die URL des Players angezeigt. Diese Player-URL enthält die adConfigId. Sie werden es unterscheiden können, weil diese adConfigId beginnt mit “live.”
IHR LIVE-SSAI-VIDEO MIT DEM SSAI-PLUGIN ANFRAGEN
Jetzt können wir das Video anfordern und abspielen.
Als erstes müssen wir eine HttpRequestConfig
Objekt mit dem Live adConfigId.
String adConfigIdKey = "ad_config_id";
String adConfigIdValue = "live.eb5YO2S2Oqdzlhc3BCHAoXKYJJl4JZlWXeiH49VFaYO2qdTkNe_GdEBSJjir";
HttpRequestConfig httpRequestConfig = new HttpRequestConfig.Builder()
.addQueryParameter(adConfigIdKey, adConfigIdValue)
.build();
Zweitens: Wir erstellen die SSAIComponent
Objekt, das den Live-SSAI-Stream auf die gleiche Weise wie einen VOD-SSAI-Stream behandelt.
SSAIComponent plugin = new SSAIComponent(this, brightcoveVideoView);
Dann erstellen wir die Catalog
Objekt.
Catalog catalog = new Catalog(eventEmitter, accountId, policyKey);
Schließlich stellen wir die Videoanforderung mit der HttpRequestConfig
erstellt, und wir verarbeiten das empfangene Video mit dem SSAI-Plugin. Das SSAI-Plugin fügt das Video automatisch zur Brightcove-Videoansicht hinzu.
catalog.findVideoByID(videoId, httpRequestConfig, new VideoListener() {
@Override
public void onVideo(Video video) {
plugin.processVideo(video);
}
});
Sie werden feststellen, dass dieser Vorgang genau derselbe ist wie bei einer VOD SSAI. Der einzige Unterschied ist die verwendete adConfigId.
GRUNDLEGENDE ÄNDERUNGEN
Im SSAI-Plugin v6.9.0 mussten wir aufgrund eines Problems mit der gespeicherten Abspielposition beim Unterbrechen und Wiederaufnehmen des Live-Videos eine potenzielle Änderung vornehmen. Dies betrifft Sie nur, wenn Sie die Funktion Event.PLAYHEAD_POSITION
Eigenschaft von entweder der EventType.PROGRESS
oder EventType.AD_PROGRESS
Veranstaltung.
Die Event.PLAYHEAD_POSITION
enthielt in früheren Versionen die relative Abspielposition zur Anzeige oder zum Hauptinhalt, in Version 6.9.0 hat sie die absolute Abspielposition.
Lassen Sie es mich anhand eines Beispiels erklären. In der folgenden Abbildung haben wir ein VOD SSAI-Video mit einer Gesamtdauer von 43 Sekunden. Der Hauptinhalt dauert 15 Sekunden, und es gibt drei Anzeigen, einen Pre-Roll von 6 Sekunden, einen Mid-Roll von 14 Sekunden und einen Post-Roll von 8 Sekunden. Wenn wir mit der Wiedergabe des Mid-Rolls beginnen, beträgt die absolute Abspielkopfposition 11 Sekunden, aber die relative Abspielkopfposition zum Mid-Roll ist Null. Die Event.PLAYHEAD_POSITION
Wert ist in früheren Versionen Null, in Version 6.9.0 beträgt er 11 Sekunden.
HINWEIS: Alle tatsächlichen Werte für die Abspielkopfposition werden im Brightcove-SDK in Millisekunden angegeben.
Andererseits haben wir auch eine neue Ereigniseigenschaft namens Event.PROGRESS_BAR_PLAYHEAD_POSITION
die die relative Abspielkopfposition enthält. Dieser Name beschreibt seinen Zweck besser, der letztlich darin besteht, dem Benutzer über den Fortschrittsbalken die Abspielposition des abspielenden Blocks (Anzeige oder Inhalt) anzuzeigen. Wenn Sie sich jedoch auf die Event.PLAYHEAD_POSITION
Wert, müssen Sie nur noch mit Event.PROGRESS_BAR_PLAYHEAD_POSITION
stattdessen.
Die Event.ORIGINAL_PLAYHEAD_POSITION
wurde aus Kompatibilitätsgründen nicht verändert und enthält nach wie vor die absolute Abspielkopfposition.
In der folgenden Tabelle sind die Änderungen zusammengefasst:
Ereignis-Eigenschaft | Vor 6.9.0 | 6.9.0 und höher |
Event.PLAYHEAD_POSITION |
Relative Abspielkopfposition | Absolute Abspielkopfposition |
Event.ORIGINAL_PLAYHEAD_POSITION |
Absolute Abspielkopfposition | Absolute Abspielkopfposition |
Event.PROGRESS_BAR_PLAYHEAD_POSITION |
K.A. | Relative Abspielkopfposition |
ÜBERLEGUNGEN BEIM ABHÖREN DES FORTSCHRITTSEREIGNISSES
Es gibt ein paar Dinge, die Sie beachten müssen, wenn Sie sich die EventType.PROGRESS
Ereignis im SSAI-Plugin. Der Zeitpunkt, zu dem Sie Ihren Hörer hinzufügen, ist wichtig.
Zunächst möchte ich Ihnen einige Informationen über die Funktionen des Brightcove-SDK und des SSAI-Plugins geben.
1. Erstens, die EventType.PROGRESS
wird ursprünglich von der ExoPlayerVideoDisplayComponent
Klasse und die Event.PLAYHEAD_POSITION
Eigenschaft hat die Abspielkopfposition, die von ExoPlayer abgerufen wird (ich nehme an, Sie verwenden ExoPlayer), was die absolute Abspielkopfposition im SSAI-Kontext ist.
2. Dann fängt das SSAI-Plugin die EventType.PROGRESS
Ereignis und vergleicht die Position des Abspielkopfes mit der SSAI-Zeitleiste, um festzustellen, ob der Inhalt oder die Werbung abgespielt wird. In beiden Fällen berechnen wir die relative Abspielposition und fügen eine neue Event.PROGRESS_BAR_PLAYHEAD_POSITION
Eigenschaft mit diesem Wert.
- Wenn der Inhalt abgespielt wird, wird das Ereignis an die übrigen Zuhörer weitergegeben.
- Wenn eine Anzeige abgespielt wird, stoppen wir die Weitergabe der
EventType.PROGRESS
Ereignis, und senden Sie dieEventType.AD_PROGRESS
mit den gleichen Eigenschaften.
3. Schließlich werden alle Hörer, die nach SSAIEventType.AD_DATA_READY
emittiert wird, oder solche mit dem @Default
Annotation erhält die EventType.PROGRESS
Veranstaltung.
Aufgrund der Art und Weise, wie die EventType.PROGRESS
verarbeitet wird, erhalten Sie je nachdem, wann Sie Ihren Hörer hinzufügen, möglicherweise nicht die erwarteten Werte. Wenn Sie zum Beispiel den EventType.PROGRESS
Hörer vor dem SSAIEventType.AD_DATA_READY
ausgegeben wird, wird Ihr Listener aufgerufen, bevor er vom SSAI-Plugin verarbeitet wird, so dass Sie nicht in der Lage sein werden, die Event.PROGRESS_BAR_PLAYHEAD_POSITION
Wert.
ANMERKUNG: Dieses Problem tritt auch in älteren Versionen auf, aber anstatt die
Event.PROGRESS_BAR_PLAYHEAD_POSITION
Wert, derEvent.PLAYHEAD_POSITION
hat die absolute Abspielposition anstelle der erwarteten relativen Abspielposition (auch hier gilt, dass dies für ältere Versionen gilt).ANMERKUNG: Dieses Problem tritt nicht auf, wenn Sie die
EventType.AD_PROGRESS
Veranstaltung.
Für den Fall, dass Sie in diese Situation geraten, können Sie einige Dinge ausprobieren:
- Fügen Sie die
@Default
Bemerkung zu Ihrem Hörer. - Fügen Sie Ihren Hörer nach
SSAIEventType.AD_DATA_READY
emittiert wird.
ADD THE @DEFAULT
BEMERKUNG ZU IHREM HÖRER
Intern kommentieren wir bestimmte Hörer mit dem @Default
Bemerkung. Dadurch warten alle Hörer mit Standardkommentar darauf, dass zuerst alle Hörer ohne Standardkommentar aufgerufen werden, bevor die Hörer mit Standardkommentar aufgerufen werden.
Durch Hinzufügen dieser Bemerkung zu Ihrer EventType.PROGRESS
Listener, lassen Sie ihn warten, bis das nicht standardmäßige SSAI-Plugin EventType.PROGRESS
Hörer verarbeitet das Ereignis. Der einzige Vorbehalt ist, dass sich dieses Verhalten ändern kann, wenn das SSAI-Plugin EventType.PROGRESS
Hörer ist mit dem Attribut @Default
Anmerkung in einer zukünftigen Version (ich sehe dies derzeit nicht vor).
Das Beispiel sieht wie folgt aus:
eventEmitter.on(EventType.PROGRESS, new EventListener() {
@Default
@Override
public void processEvent(Event event) {
int absolutePlayheadPosition = event.getIntegerProperty(Event.PLAYHEAD_POSITION);
int relativePlayheadPosition = event.getIntegerProperty(Event.PROGRESS_BAR_PLAYHEAD_POSITION);
}
});
FÜGEN SIE IHREN HÖRER NACH SSAIEVENTTYPE.AD_DATA_READY
WIRD AUSGESTRAHLT
Alternativ können Sie Ihren Hörer auch nach der SSAIEventType.AD_DATA_READY
Das garantiert, dass Ihr Listener aufgerufen wird, nachdem das SSAI-Plugin die Chance hatte, das Ereignis zu verarbeiten.
Das Beispiel sieht wie folgt aus:
eventEmitter.once(SSAIEventType.AD_DATA_READY, adDataReady -> {
eventEmitter.on(EventType.PROGRESS, progressEvent -> {
int absolutePlayheadPosition = progressEvent.getIntegerProperty(Event.PLAYHEAD_POSITION);
int relativePlayheadPosition = progressEvent.getIntegerProperty(Event.PROGRESS_BAR_PLAYHEAD_POSITION);
});
});
Es gibt jedoch einen Vorbehalt. Da die SSAIEventType.AD_DATA_READY
Ereignis jedes Mal ausgelöst wird, wenn das SSAI-Video (Live und VOD) geöffnet wird, müssen Sie sicherstellen, dass Sie nicht Ihre EventType.``PROGRESS
Hörer mehrfach.
Eine Möglichkeit, dies zu vermeiden, ist das Speichern des Tokens beim Hinzufügen der EventType.PROGRESS
Ereignis-Listener für den Ereignis-Emitter und verwenden Sie ihn, um diesen Listener nach jedem SSAIEventType.AD_DATA_READY
Ereignis. Zum Beispiel:
// Declare member variable
private int mCurrentProgressToken = -1;
// Code called every time a SSAI video is processed with the SSAI plugin
eventEmitter.once(SSAIEventType.AD_DATA_READY, adDataReady -> {
if (mCurrentProgressToken != -1) {
eventEmitter.off(EventType.PROGRESS, mCurrentProgressToken);
}
mCurrentProgressToken = eventEmitter.on(EventType.PROGRESS, progressEvent -> {
int absolutePlayheadPosition = progressEvent.getIntegerProperty(Event.PLAYHEAD_POSITION);
int relativePlayheadPosition = progressEvent.getIntegerProperty(Event.PROGRESS_BAR_PLAYHEAD_POSITION);
});
});
ZUSAMMENFASSUNG
Das SSAI-Plugin 6.9.0 leistet die Schwerstarbeit, um Live SSAI zu unterstützen. Es gibt keine signifikanten Änderungen in der Plugin-API, die verwendet wird, um die Wiedergabe von Live SSAI-Streams im Vergleich zu VOD SSAI zu starten. Der schwierige Teil ist die Einrichtung Ihres Live SSAI-Streams und die Identifizierung der richtigen Ad-Config-Id, die Sie an das Plugin übergeben müssen. HttpRequestConfig
wenn Sie die Kataloganfrage stellen.
Es gibt potenzielle Änderungen, über die Sie sich im Klaren sein müssen, aber wenn Sie erst einmal festgestellt haben, ob Sie betroffen sind, ist es sehr einfach, Ihren Code zu korrigieren. Und für den Fall, dass Sie von der EventType.PROGRESS
Ereignis müssen Sie auch besonders darauf achten, wann Sie Ihren Progress Listener hinzufügen und überprüfen, ob Sie die erwarteten Werte erhalten.