Programmgesteuertes Implementieren von Cue-Points
Überblick
Cue-Points können für ein Video festgelegt werden. Während der Videowiedergabe wird ein Ereignis ausgelöst, wenn jeder Cue-Punkt getroffen wird.
Spielen Sie das folgende Video ab, um zu sehen, wie der Player die Cue-Point-Informationen vor, während des Würfels (5 Sekunden, 10 Sekunden, 12 Sekunden) und nach dem Würfeln anzeigt.
******** Cue Point Information ********
****** End Cue Point Information ******
Wenn Sie dieses Video abspielen, werden Informationen zu vier Cue-Punkten unter dem Player angezeigt.
Schlüssel Konzepte
Einige Konzepte müssen verstanden werden, um Cue-Points in Brightcove Player effektiv nutzen zu können. Diese Konzepte werden in diesem Abschnitt des Dokuments erläutert.Das folgende Konzept muss verstanden werden, um Cue-Points in Brightcove Player effektiv nutzen zu können.
Video Cloud-Katalog-Cue-Points
Das erste zu verstehende Konzept hat mit Terminologie zu tun. In Brightcove Player werden Cue-Punkte gemäß dem HTML-Standard als Textspurelemente gespeichert. Dies bedeutet, dass bei Verwendung eines Video Cloud-Videos alle Cue-Punkte im "Video Cloud-Stil" in Textspuren konvertiert werden.
Diese Cue-Punkte im "Video Cloud-Stil" können auch als "Katalog" -Cue-Punkte bezeichnet werden, da sie aus dem Video Cloud-Katalog gelesen werden (siehe die Spielerkatalog Dokument für weitere Informationen zum Katalog). Wenn diese Konvertierung stattfindet, werden einige Informationen im Katalog-Cue-Point, wie Typ und Cue-Point-Zeit, in die Textspur konvertiert.
Struktur des Katalog-Cue-Points
Das nächste zu verstehende Konzept ist, dass es einen signifikanten Unterschied zwischen Katalog-Cue-Points und dem HTML-Standard in der Struktur gibt. Der Unterschied besteht darin, dass ein HTML-Cue-Point eine Dauer haben kann. Dies bedeutet, dass für jeden Cue-Punkt zwei Cue-Punkt-Änderungsereignisse ausgelöst werden: eines am Anfang des Cue-Punkts und eines am Ende des Cue-Punkts.
Beim Konvertierungsprozess wird jeder Katalog-Cue-Point in einen Cue-Point mit identischen Start- und Stoppzeiten konvertiert. Dies bedeutet, dass für jeden Katalog-Cue-Point zwei Cue-Point-Ereignisse ausgelöst werden und im Code berücksichtigt werden müssen.
activecues
array
Ein weitererEin Ein wichtiger konzeptioneller Punkt, der beim Umgang mit HTML-Cue-Points zu verstehen ist, ist der activeCues
Array. Alle Cue-Points werden in einem Array definiert. Es gibt ein anderes Array, activeCues
, das die Cue-Punkte enthält, die "aktiv" sind, was bedeutet, dass die Wiedergabezeit zwischen den Start- und Stoppzeiten des Cue-Punkts liegt.
Bei Verwendung von Katalog-Cue-Points sind die Start- und Stoppzeiten identisch, sodass sie nur für die definierte Sekunde aktiv sind. Bei Katalog-Cue-Punkten ist es außerdem sehr unwahrscheinlich, dass zwei Cue-Punkte gleichzeitig aktiv sind, da sie sich nicht überlappen.
Cue-Point-Typen
In diesem Dokument sehen Sie Cue-Points mit a type
Eigenschaft einen Wert zugewiesen. Diese Typwerte werden beim Erstellen von Cue-Points in der Studio-Benutzeroberfläche zugewiesen. Es gibt zwei Arten von Cue-Points, aber beide liefern einfach einen String-Wert an type
Eigentum. Der entsprechende Wert ist nur hilfreich, wenn er in benutzerdefiniertem JavaScript verwendet wird, während die Cue-Point-Informationen verarbeitet werden. Die Typen werden hier detailliert beschrieben:
- Anzeige - Weist den Zeichenfolgenwert von zu
AD
zumtype
Eigentum - Code - Weist den Zeichenfolgenwert von zu
CODE
zumtype
Eigentum
Video Cloud Cue Points
In diesem Abschnitt des Dokuments erfahren Sie, wie Sie Katalog-Cue-Punkte festlegen und auf Ereignis-Dispatches für Katalog-Cue-Punkte warten.
Festlegen von Video Cloud-Cue-Punkten
Video Cloud-Cue-Points können mithilfe von Video Cloud Studio und auf verschiedene andere in diesem Dokument beschriebene Arten mit einem Video verknüpft werden: Arbeiten mit Cue-Points im Medienmodul.
Auf Video Cloud-Cue-Points reagieren - Video statisch an den Player gebunden
In diesem Abschnitt des Dokuments erfahren Sie, wie Sie Katalog-Cue-Points verarbeiten, wenn das Video statisch an den Player gebunden wurde. Dies bedeutet, dass das Video entweder in Studio oder direkt über die Player-Verwaltungs-API in den Player geladen wurde.
Um zu verhindern, dass eine Race-Bedingung versucht, Cue-Punkte zu verarbeiten, bevor sie geladen werden, müssen Sie die verwenden loadedmetadata
Ereignis, das vor dem Umgang mit den Cue-Points ausgelöst werden soll. Sobald die richtige Textspur gelesen wurde, verwenden Sie die oncuechange
Ereignis zum Abhören von Cue-Points-Ereignissen, die ausgelöst werden sollen.
Der folgende Code zeigt das Abhören von Cue-Punkten und das Anzeigen der Daten vom Cue-Punkt. Beachten Sie, dass in diesem Beispiel das Video statisch an den Player gebunden ist.
- Zeile 11: Erstellen Sie ein Absatzelement als Ort, an dem dynamisch erstelltes HTML injiziert werden soll.
- Zeilen 18,30: Verwenden Sie die
one()
Methode zum Hinzufügen eines Ereignis-Listeners für dieloadedmetadata
Veranstaltung nur einmal. Die Event-Handler-Funktion wird hier anonym definiert. - Zeile 19: Rufen Sie das TextTracks-Array mit der
textTracks()
Methode ab und weisen Sie dann das Nullloth-Element, das die Cue-Points enthält, der Variablen zutt
. Beachten Sie, dass es in einigen Implementierungen möglicherweise möglich ist, dass sich die Cue-Points in einem anderen Array-Element befinden könnten. Weitere Informationen finden Sie im Abschnitt „Richtige Spur suchen“ unten. - Zeilen 20,28: Legt die Ereignishandler-Funktion fest, wenn das
oncuechange
Ereignis ausgelöst wird. - Zeile 21: Stellen Sie sicher, dass Sie den ersten Cue-Point-Versand (nulltes Array-Element) erhalten. Ohne diese Bedingung würden Sie sehen, dass jeder Cue-Punkt zweimal bearbeitet wird. Beachten Sie, dass diese Bedingung unterschiedlich sein müsste, wenn Sie Cue-Points verwenden, die sich überlappen.
- Zeilen 22-26: Erstellen Sie dynamisch HTML mit Informationen vom Cue-Point und injizieren Sie sie in die HTML-Seite.
- Zeile 29: Spielen Sie das Video ab.
<video-js id="myPlayerID"
data-account="1507807800001"
data-player="zN3V18ZPEu"
data-embed="default"
controls=""
data-video-id="1507781667001"
data-playlist-id=""
data-application-id=""
width="960" height="540"></video-js>
<p id="insertionPoint"></p>
<script src="https://players.brightcove.net/1507807800001/zN3V18ZPEu_default/index.min.js"></script>
<script>
videojs.getPlayer('myPlayerID').ready(function() {
var player = this;
player.one("loadedmetadata", function () {
var tt = player.textTracks()[0];
tt.oncuechange = function () {
if (tt.activeCues[0] !== undefined) {
var dynamicHTML = "id: " + tt.activeCues[0].id + ", ";
dynamicHTML += "text: " + tt.activeCues[0].text + ", ";
dynamicHTML += "startTime: " + tt.activeCues[0].startTime + ", ";
dynamicHTML += "endTime: " + tt.activeCues[0].endTime;
document.getElementById("insertionPoint").innerHTML += dynamicHTML + "<br/>";
}
}
player.play();
});
});
</script>
Aktivieren von Video Cloud-Cue-Points - Laden Sie Videos dynamisch in den Player
In diesem Abschnitt des Dokuments erfahren Sie, wie Sie Katalog-Cue-Points verarbeiten, wenn das Video mithilfe von dynamisch in den Player geladen wird catalog.getVideo()
und catalog.load()
Methoden.
Wenn Sie den Player-Katalog zum Abrufen und Laden des Videos verwenden, ist die Verarbeitung von Cue-Points etwas einfacher als bei Verwendung eines statisch gebundenen Videos, da Sie das nicht verwenden müssen loadedmetadata
Veranstaltung.
- Zeile 11: Erstellen Sie ein Absatzelement als Ort, an dem dynamisch erstelltes HTML injiziert werden soll.
- Zeilen 17,31: Verwenden Sie die
catalog.getVideo()
Methode zum Abrufen eines Videos. Die Rückruffunktion wird hier anonym definiert. - Zeile 19: Verwenden Sie die
catalog.load()
Methode zum Laden des Videos in den Player. - Zeile 21: Rufen Sie das TextTracks-Array mit der
textTracks()
Methode ab und weisen Sie dann das Nullloth-Element, das die Cue-Points enthält, der Variablen zutt
. Beachten Sie, dass es in einigen Implementierungen möglicherweise möglich ist, dass sich die Cue-Points in einem anderen Array-Element befinden könnten. Weitere Informationen finden Sie im Abschnitt „Richtige Spur suchen“ unten. - Zeilen 22-30: Legt die Ereignishandler-Funktion fest, wenn das
oncuechange
Ereignis ausgelöst wird. - Zeile 23: Stellen Sie sicher, dass der erste Cue-Punkt (nulltes Array-Element) definiert ist. Ohne diese Bedingung würden Sie sehen, dass jeder Cue-Punkt zweimal bearbeitet wird, das zweite Mal ohne definierte Elemente in der
activecues
Array (da die zweite Cue-Änderung für das Cue-Point-Ende gilt). Beachten Sie, dass diese Bedingung unterschiedlich sein müsste, wenn Sie Cue-Points verwenden, die sich überlappen. - Zeilen 24-28: Erstellen Sie dynamisch HTML mit Informationen vom Cue-Point und injizieren Sie sie in die HTML-Seite.
- Zeile 32: Spielen Sie das Video ab.
<video-js id="myPlayerID"
data-account="1507807800001"
data-player="zN3V18ZPEu"
data-embed="default"
controls=""
data-video-id=""
data-playlist-id=""
data-application-id=""
width="960" height="540"></video-js>
<p id="insertionPoint"></p>
<script src="https://players.brightcove.net/1507807800001/zN3V18ZPEu_default/index.min.js"></script>
<script>
videojs.getPlayer('myPlayerID').ready(function() {
var player = this;
player.catalog.getVideo('1507781667001', function (error, video) {
//deal with error
player.catalog.load(video);
player.one("loadedmetadata", function () {
var tt = player.textTracks()[0];
tt.oncuechange = function () {
if (tt.activeCues[0] !== undefined) {
var dynamicHTML = "id: " + tt.activeCues[0].id + ", ";
dynamicHTML += "text: " + tt.activeCues[0].text + ", ";
dynamicHTML += "startTime: " + tt.activeCues[0].startTime + ", ";
dynamicHTML += "endTime: " + tt.activeCues[0].endTime;
document.getElementById("insertionPoint").innerHTML += dynamicHTML + "<br/>";
}
}
});
player.play();
});
});
</script>
Rufen Sie alle Video Cloud-Cue-Point-Informationen ab
Wie Sie vielleicht bemerkt haben, stehen Ihnen nicht alle Informationen zum Video Cloud-Cue-Point direkt über das zur Verfügung activecues
Array. Dies lässt sich leicht beheben, indem Sie die gewünschten Informationen aus dem Internet abrufen mediainfo
Eigentum.
Der grundlegende Ansatz dieser Lösung lautet:
- Warten Sie auf die
loadstart
Veranstaltung für diemediainfo
zu besiedelnde Eigenschaft. - Weisen Sie die zu
cue_points
Array aus demmediainfo
Eigenschaft zu einer Variablen. Diese Variable enthält vollständige Informationen zum Video Cloud-Cue-Point. - Rufen Sie bei einem Cue-Point-Ereignis die entsprechenden Cue-Point-Daten basierend auf dem ab
time
Eigentumswert. Dies erfolgt mithilfe einer Hilfsfunktion, die ein Objekt basierend auf einem Eigenschaftswert im Objekt aus einem Array herausholt. - Verwenden Sie die Daten vom Cue-Point.
Das folgende Bild zeigt das gesamte Cue-Point-Array (oben links), die einzelne Cue-Point-Datenerfassung (oben rechts) und eine Eigenschaft aus dieser einzelnen Cue-Point-Datenerfassung (unten rechts).

Im folgenden Snippet wird nur der neue / geänderte Code aus den obigen Beispielen erläutert.
- Zeilen 452-463: Fügen Sie die Funktion hinzu, mit der eine einzelne Cue-Point-Datenerfassung aus dem Array aller Cue-Points extrahiert wird. Beachten Sie, dass Sie das Array aller Cue-Points, die Eigenschaft, in der Sie nach einem bestimmten Wert suchen, und zuletzt den Wert, nach dem Sie suchen, übergeben.
- Zeile 432: Hört auf die
loadstart
Veranstaltung. Wenn Ihr Video geladen wird, wird diemediainfo
Eigenschaft ist ausgefüllt. - Zeile 434: Weisen Sie das Array aller Video Cloud-Cue-Points einer Variablen zu.
- Zeile 443: Weisen Sie im Cue-Point-Dispatch-Ereignishandler die Datenerfassung des jeweiligen Cue-Points einer Variablen zu. Hier wird die im ersten Aufzählungspunkt erwähnte Funktion aufgerufen. Die verwendeten Argumente sind:
cuePointAra
: Die gesamte Sammlung von Video Cloud-Cue-Points.'time'
: Die Eigenschaft, in der nach einem Wert gesucht werden soll.tt.activeCues[0].startTime
: Die Startzeit des Cue-Points, der derzeit im Cue-Point-Dispatch-Event-Handler verarbeitet wird.
- Zeilen 444-445: Debuggen
console.log()
Methodenaufrufe, die im Produktionscode entfernt werden sollten.
<script>
videojs.getPlayer('myPlayerID').ready(function() {
var myPlayer = this,
cuePointAra = [],
allCuePointData;
myPlayer.on('loadstart', function () {
//console.log('mediainfo', myPlayer.mediainfo);
cuePointAra = myPlayer.mediainfo.cue_points;
var tt = myPlayer.textTracks()[0];
tt.oncuechange = function () {
if (tt.activeCues[0] !== undefined) {
var dynamicHTML = "id: " + tt.activeCues[0].id + ", ";
dynamicHTML += "text: " + tt.activeCues[0].text + ", ";
dynamicHTML += "startTime: " + tt.activeCues[0].startTime + ", ";
dynamicHTML += "endTime: " + tt.activeCues[0].endTime;
document.getElementById("insertionPoint").innerHTML += dynamicHTML + "<br/>";
allCuePointData = getSubArray(cuePointAra, 'time', tt.activeCues[0].startTime);
console.log('cue point data:', allCuePointData);
console.log('cue point metadata:', allCuePointData[0].metadata);
}
}
myPlayer.play();
myPlayer.muted(true);
});
function getSubArray(targetArray, objProperty, value) {
var i, totalItems = targetArray.length,
objFound = false,
idxArr = [];
for (i = 0; i < totalItems; i++) {
if (targetArray[i][objProperty] === value) {
objFound = true;
idxArr.push(targetArray[i]);
}
}
return idxArr;
};
});
</script>
HTML5-Standard-Cue-Points
HTML5-Standard-Cue-Points werden als Track-Elemente in einem vorgeschriebenen Format gespeichert. Gute Einführungsinhalte finden Sie im folgenden HTML5 Rocks-Tutorial: Erste Schritte mit dem Track-Element. In diesem Abschnitt des Dokuments erfahren Sie, wie WebVTT-Cue-Point-Dateien formatiert werden und wie diese Cue-Points verarbeitet werden.
WebVTT-Dateiformat für Cue-Points
Das WebVTT-Dateiformat ist streng definiert. Für Cue-Points besteht die Datei wie folgt:
- Die Saite WebVTT als erste Zeile der Datei
- Eine einzelne leere Zeile
- Die Kennung für einen bestimmten Cue-Point
- Die Dauer im Formular 00: 00: 00.000 -> 00: 00: 00.000 ;; Dies ist Stunden: Minuten: Sekunden. Millisekunden-Format und wird streng analysiert. Zahlen müssen bei Bedarf mit Nullen aufgefüllt werden
- Die Zeichen, die der Dauer bis zur nächsten Leerzeile folgen, werden in a eingefügt Text Wert; Wenn Sie hier mehrere unterschiedliche Werte speichern möchten, funktioniert JSON gut, da es leicht analysiert werden kann
- Eine einzelne leere Zeile
- Mit dem Format Bezeichner / Dauer / Text / Leerzeile können mehrere Cue-Punkte hinzugefügt werden
Das folgende Dokument ist ein gültiges WebVTT-Cue-Point-Dokument, das zwei Cue-Points definiert, einen mit einer Dauer von 2 bis 5 Sekunden und einen mit einer Dauer von 10 bis 15 Sekunden:
WEBVTT
Carry
00:00:03.000 --> 00:00:09.000
{
"id": "First cue point",
"title": "Carry the rim",
"description": "Getting ready to mount a tire on the rim."
}
Balance
00:00:10.000 --> 00:00:15.000
{
"id": "Second cue point",
"title": "Balance the tire and rim",
"description": "Spin the mounted tire to check the balance."
}
Wenn Sie das folgende Video abspielen, wird die oben gezeigte Cue-Point-WebVTT-Datei verarbeitet. Zu Beginn eines Cue-Points wird dynamisch erstelltes HTML in die Seite eingefügt, gefolgt von etwas analysiertem JSON aus dem Text Feld. Am Ende des Cue-Points die Nachricht Cue-Point-Dauer vorbei wird angezeigt.
******** Cue Point Information ********
****** End Cue Point Information ******
Prozess-Cue-Points-Übersicht
Die grundlegenden Schritte zur Verwendung von HTML5-Standard-Cue-Points sind:
- Lesen Sie die WebVTT-Datei mit den Cue-Points mit a ein
<track>
Tag als Kind der verschachtelt<video-js>
Etikett. - In einem
loadedmetadata
Ereignisbehandlungsroutine, rufen Sie das richtige Textspurelement ab. - Konfigurieren Sie im selben Ereignishandler einen zweiten Ereignishandler für das
oncuechange
Cue-Point-Ereignis. - In dem
oncuechange
Event-Handler, überprüfen Sie, ob dieactivecues
Für das Array-Objekt ist das nullte Element definiert. Wenn ja, wird auf den Start des Cue-Punkts reagiert. - In dem
oncuechange
Event-Handler, überprüfen Sie, ob dieactivecues
Für das Array-Objekt ist das nullte Element definiert. Wenn nein, wird auf den Cue-Point-Stopp gewirkt.
Cue-Point-Code verarbeiten
- Zeile 11: Erstellen Sie eine Textspur, indem Sie die webVTT-Datei mit dem
<track>
Tag einlesen. - Zeile 15: Erstellen Sie ein
<pre></pre >
-Element als Ort, an dem dynamisch erstelltes HTML eingefügt werden soll. Beachten Sie, dass ein<pre></pre>
Element anstelle eines Absatzelements verwendet wird, sodass die Backtick-Notation in JavaScript 5 verwendet werden kann. - Zeilen 22,50: Verwenden Sie die
one()
Methode, um nur einmal auf dasloadedmetadata
Ereignis zu hören. Die Ereignisbehandlungsfunktion wird hier als Pfeilfunktion definiert. - Zeile 23: Weisen Sie der Variablen
tt
die in der WebVTT-Datei definierten Textspuren zu. Die Datenstruktur sieht wie folgt aus: - Zeilen 31,49: Legt die Ereignishandler-Funktion fest, wenn das
oncuechange
Ereignis ausgelöst wird. - Zeilen 35 und 38: Wenn kein aktiver Cue-Punkt vorhanden ist, ist dies der Cue-Punkt-Stop, d. h. die Anzeige der Cue-Punkt-Dauer ist beendet.
- Zeilen 40-48: Erstellen Sie dynamisch HTML mit Informationen vom Cue-Point und injizieren Sie sie in die HTML-Seite. Dies beinhaltet das Analysieren von JSON und das Anzeigen verschiedener Felder dieses JSON. Beachten Sie, dass die JavaScript 5 Backtick-Notation verwendet wird.
<video-js id="myPlayerID"
data-account="1752604059001"
data-player="default"
data-embed="default"
controls=""
data-video-id="4607357817001"
data-playlist-id=""
data-application-id=""
width="640" height="360">
<track kind="metadata" label="external-metadata-vtt" src="https://solutions.brightcove.com/bcls/brightcove-player/cuepoints/cuepoints-2022.vtt" />
</video-js>
<pre id="insertionPoint"></pre>
<script src="https://players.brightcove.net/1752604059001/default_default/index.min.js"></script>
<script type="text/javascript">
const player = videojs.getPlayer('myPlayerID');
player.ready(() => {
player.one("loadedmetadata", () => {
const tt = [].find.call(player.textTracks(), ({ label }) => label === 'external-metadata-vtt');
if (!tt) {
return;
}
tt.mode = 'hidden';
tt.oncuechange = () => {
const outputEl = document.getElementById("insertionPoint");
const activeCue = tt.activeCues[0];
if (!activeCue) {
outputEl.innerHTML += `Cue point duration over\n\n`;
return;
}
const { id, text, startTime, endTime } = activeCue;
outputEl.innerHTML += `id: ${id}\ntext: ${text}\nstartTime: ${startTime}, endTime: ${endTime}\n`;
try {
const { title, description } = JSON.parse(text);
outputEl.innerHTML += `${title}: ${description}\n\n`
} catch (e) {
//ignore
}
}
});
});
</script>
Cue-Point-Code verarbeiten
- Zeile 270: Erstellen Sie eine Textspur, indem Sie die webVTT-Datei mit dem
<track>
Tag einlesen. - Zeile 273: Erstellen Sie ein Absatzelement als Ort, an dem dynamisch erstelltes HTML injiziert werden soll.
- Zeilen 285.309: Verwenden Sie die
one()
Methode, um nur einmal auf dasloadedmetadata
Ereignis zu hören. Die Event-Handler-Funktion wird hier anonym definiert. - Zeile 286: Weisen Sie einer Variablen den Index der zuletzt geladenen Textspur zu.
- Zeile 287: Rufen Sie das TextTracks-Array mit der
textTracks()
Methode ab, mit der das letzte Element des Arrays einer Variablen zugewiesen wird, indem Sie den im vorherigen Schritt festgelegten Index verwenden. Variationen dieser Logik finden Sie im Abschnitt „Richtige Spur suchen“ unten. - Zeilen 289.301: Legt die Ereignishandler-Funktion fest, wenn das
oncuechange
Ereignis ausgelöst wird. - Zeile 290: Stellen Sie sicher, dass der erste Cue-Point (Null-Array-Element) im ActiveCues-Array definiert ist. Dies sagt Ihnen, dass dies ein Start-Cue-Point-Ereignis ist.
- Zeilen 291-294: Erstellen Sie dynamisch HTML mit Informationen vom Cue-Point und injizieren Sie sie in die HTML-Seite. Dies beinhaltet das Analysieren von JSON und das Anzeigen verschiedener Felder dieses JSON.
- Zeilen 295-297: Zeigen Sie eine Notiz an, dass das Cue-Point-Ende erreicht wurde.
- Zeile 302: Spielen Sie das Video ab.
Man könnte annehmen, dass Sie die WebVTT-Datei programmgesteuert mit dem hinzufügen könnten addRemoteTextTrack()
Methode. In diesem Fall wäre dies nicht zuverlässig, da es zu einer Rennbedingung kommen kann, bei der die Cue-Punkte nicht verarbeitet werden können, bevor Sie versuchen, sie zu verwenden. Es ist sicher, die WebVTT-Datei mit dem hinzuzufügen <track>
Tag wie gezeigt.
Finde den richtigen Track
An mehreren Stellen in diesem Dokument kann ein mögliches Problem auftreten, wenn einem Player mehrere Textspuren zugeordnet sind. Es wurde angenommen, dass dem Player nur eine Textspur zugeordnet ist, sodass dieser Code verwendet wurde: var tt = myPlayer.textTracks()[0];
. Bei Auswahl des nullten Array-Elements wird eine einzelne Textspur vorausgesetzt, die dem Player zugeordnet ist.
Textspuren werden nicht nur für Cue-Points verwendet, sondern auch für andere Arten von Daten. Das nett Das Attribut kann die folgenden Werte enthalten:
- Untertitel
- Bildunterschriften
- Beschreibungen
- Kapitel
- Metadaten
Dies bedeutet, dass dem Player möglicherweise mehrere Textspuren zugeordnet werden können und dass ein Weg erforderlich ist, um die richtige für Ihre Anwendungslogik zu finden. Der folgende Code durchläuft die verfügbaren Textspuren bis zum Metadaten (Cue Point) Wert wird gefunden:
<script type="text/javascript">
videojs.getPlayer('myPlayerID').ready(function() {
var myPlayer = this,
allTextTacks,
attLength,
tt;
myPlayer.one("loadedmetadata", function () {
allTextTacks = myPlayer.textTracks();
attLength = allTextTacks.length;
for (var i = 0; i < attLength; i++) {
if (allTextTacks[i].kind === 'metadata') {
tt = allTextTacks[i];
break;
};
};
});
});
</script>
Die Logik aus vorherigen Beispielen könnte dann verwendet werden, um die Cue-Punkte unter Verwendung von zu verarbeiten tt
Variable, die die gewünschte Textspur enthält.
Programmatische Cue-Points
Es ist möglich, programmgesteuert Cue-Points hinzuzufügen. Die Schlüsselmethode stammt aus HTML5 VTTCue
Schnittstelle. Sie können Cue-Points mit der folgenden Syntax erstellen:
new VTTCue( startTime, endTime, text )
Die Logik der Verarbeitung der Cue-Points ist den vorherigen Beispielen sehr ähnlich, sodass nur der Code aufgeführt wird, der sich von dem oben verwendeten unterscheidet.
-
Zeilen 43,44: Fügt a hinzu
textTrack
Element für den Spieler mit dem SpieleraddRemoteTextTrack()
Methode. Präzisiere daskind
sein Metadaten , und einlabel
, in diesem Fall Zeitgesteuerter Cue-Point. -
Zeilen 45-48: Warten Sie 10 Millisekunden, bevor Sie mit dem Player zwei Cue-Points erstellen
addCue()
Methode. Die Cue-Points werden mithilfe von HTML5 instanziiertVTTCue()
Konstrukteur. - Zeile 22: Hört auf die
addtrack
Veranstaltung. - Zeile 23: Ruft alle dem Player zugeordneten Textspuren ab.
- Zeile 24: Legt die
attLength
variabel zur Anzahl der Textspuren. Dieser Wert wird in einer Schleife im nächsten Codesegment verwendet. - Zeilen 25-30: Durchlaufen Sie jede Textspur und prüfen Sie, ob die
label
gleich dem richtigen Wert sein. Wenn gefunden, weisen Sie die aktuelle Textspur einer Variablen zu und brechen Sie aus der Schleife aus.
<video-js id="myPlayerID"
data-video-id="4607746980001"
data-account="1507807800001"
data-player="default"
data-embed="default"
width="640" height="360"
controls=""></video-js>
<script src="https://players.brightcove.net/1507807800001/default_default/index.min.js"></script>
<p id="insertionPoint"></p>
<script type="text/javascript">
videojs.getPlayer("myPlayerID").ready(function () {
var myPlayer = this,
textTrack = [],
allTextTacks,
attLength,
tt;
myPlayer.one("loadedmetadata", function () {
myPlayer.textTracks().addEventListener('addtrack', function () {
allTextTacks = myPlayer.textTracks();
attLength = allTextTacks.length;
for (var i = 0; i < attLength; i++) {
if (allTextTacks[i].label === 'Timed Cue Point') {
tt = allTextTacks[i];
break;
}
}
tt.oncuechange = function () {
if (tt.activeCues[0] !== undefined) {
var dynamicHTML = "id: " + tt.activeCues[0].id + ", ";
dynamicHTML += "text: <strong>" + tt.activeCues[0].text + "</strong>, ";
dynamicHTML += "startTime: <strong>" + tt.activeCues[0].startTime + "</strong>, ";
dynamicHTML += "endTime: <strong>" + tt.activeCues[0].endTime + "</strong>";
document.getElementById("insertionPoint").innerHTML += dynamicHTML + "<br/><br/>";
} else {
document.getElementById("insertionPoint").innerHTML += "Cue point duration over" + "<br/><br/>";
}
}; //end oncuechange
}); // end playing
textTrack = myPlayer.addRemoteTextTrack({kind: 'metadata', label: 'Timed Cue Point', mode: 'hidden'}, false);
textTrack.track.mode = 'hidden';
setTimeout(function(){
textTrack.track.addCue(new window.VTTCue(2, 5, 'cue point 1 text'));
textTrack.track.addCue(new window.VTTCue(10, 15, 'cue point 2 text'));
}, 10);
}); //end on loadedmetadata
}); //end ready
</script>
Der Code generiert die Ausgabe wie im folgenden Screenshot gezeigt. Beachten Sie das Ich würde Bei Verwendung von wird kein Wert angegeben VTTCue()
Konstruktormethode.

ID3- und Media-Cue-Points
Wenn Sie ID3-Cue-Points oder Media-Cue-Points mit Ihren Medien verknüpft haben, können Sie diese mithilfe der id3CuePointsTrack()
und mediaCuePointsTrack()
Methoden. Um beispielsweise auf Cue-Point-Änderungen zu warten, verwenden Sie Folgendes:
videojs.getPlayer('myPlayerID').ready(function () {
var myPlayer = this;
myPlayer.one("canplay", function () {
myPlayer.id3CuePointsTrack().on('cuechange', function () {
// process cue point here
});
});
});
ID3 Details
Im Folgenden finden Sie weitere Informationen zur Verwendung von ID3-Cue-Points:
- ID3-Tags können verwendet werden, um zeitgesteuerte Metadaten in den Stream einzufügen.
- Sie können mehrere ID3-Frames pro Segment haben.
- Brightcove Player analysiert ID3-Cue-Punkte und macht sie mithilfe der oben genannten Informationen als Textspur verfügbar
id3CuePointsTrack()
Methode. - Es ist eine bewährte Methode, auf das zu warten
canplay
Ereignis oder es besteht die Möglichkeit, dass der Titel beim Versuch, darauf zuzugreifen, nicht abrufbar ist. - Es werden mehrere Frames pro Tag unterstützt.
Bekannte Probleme
- Auf Safari werden Cue-Punkte nicht ausgelöst, wenn die Endzeit der Startzeit entspricht. Wenn also die Safari-Kompatibilität ein Problem darstellt, benötigen die Cue-Points eine Dauer größer als Null.