Live-API: Cue Points und Ad Beacons mit SSAI
Überblick
Serverseitige Anzeigeneinfügung (SSAI) Ermöglicht die Anzeige von Anzeigen während eines Live-Streaming-Ereignisses zu bestimmten Zeiten. Allgemeine Informationen finden Sie im Live-API: Serverseitige Anzeigeneinfügung (SSAI) Dokument.
Cue-Punkte
Werbeunterbrechungen werden durch Cue-Points ausgelöst, die auf zwei Arten angegeben werden können:
- Vom Encoder an Brightcove gesendet
- Sofortige Cue-Points, die über das erstellt wurden Live API
Vom Encoder
Das Brightcove-Live-Delivery-System kann vom Encoder übermittelte Cue-Punkte im AMF-Format interpretieren:
AMFDataList
[0]:onCuePoint
[1]:{Obj[]:
time: 1.9889, //Difference from PTS of THIS packet to the first PTS of the 1st video frame in the adbreak
name: "scte35",
type: "event",
ad_server_data: "eyJrZXkiOiJ2YWx1ZSJ9", // optional introduced by Brightcove. It is a base64 encoded json map of parameters e.g. {"key":"value"}
parameters: {Obj[]:
type: "avail_in",
duration: 12.0
}
}
Hinweise:
- Da Timecodes in HH:MM:SS ausgedrückt werden, gibt es keine Vorstellung davon, welcher Tag gemeint ist. Dies kann zu Problemen führen, z. B. wenn ein Cue-Point um 23:55:00 Uhr gesendet wird, damit eine Werbeunterbrechung um 00:01:00 Uhr beginnt und der Server das so interpretiert, als wäre es fast 24 Stunden her. Brightcove hat eine Lösung für dieses Problem wie folgt implementiert: Für Cue-Points, die nur zwischen 23:50:00 und 00:00:00 Uhr ankommen, gehen wir davon aus, dass Sie eine Werbepause für den darauffolgenden Tag planen.
- Bis zu 128 Cue-Points können in einer einzigen Anfrage gestapelt werden, aber aufgrund der oben erläuterten "Rollover"-Regeln können Cue-Points nicht auf diese Weise für den nächsten Tag gesendet werden.
- Da SMPTE-Timecodes mit dem Stream verbunden sind, ist es möglich, dass ein Cue nach der geplanten Zeit im Stream ankommt. Brightcove lässt eine Toleranz von bis zu 5 Sekunden nach dem Cue-Punkt zu, um noch einen Cue-Punkt einzufügen.
- Nur
avail_in
Undavail_out
Typ Cue-Punkte werden derzeit in der RTMP-Eingabe unterstützt. - SCTE-35-Cue-Punkte werden in RTP- und SRT-Eingängen unterstützt.
Manuelles Einfügen von Cue-Punkten
Sie können sofortige Cue-Points für einen Job oder eine redundante Gruppe erstellen, Live API indem Sie eine POST
Anfrage senden:
Methode | POST |
---|---|
URL (für einen Job) | https://api.bcovlive.io/v1/jobs/{Job_ID}/cue point |
URL (für eine redundante Gruppe) | https://api.bcovlive.io/v1/jobs/{Redundant_Group_ID}/cue point |
Kopfzeile | X-API-KEY: {your API KEY} |
Fügen Sie einen Anfragetext ein, der Folgendes angibt:
Feld | Typ | Beschreibung |
---|---|---|
duration |
Ganze Zahl | Dauer der Pause in Sekunden. Die Dauer des eingefügten Cue-Points muss sein mindestens doppelt so lang wie die Segmente in der Arbeit. Siehe die Dauer Beispiel. |
timecode |
SMPTE-Format | FAKULTATIV: Ein Timecode im SMPTE-Format, HH:MM:SS:FF (FF = Frames), um anzugeben, wann ein Satz beliebiger Variablen (Schlüssel/Wert-Paare) an den AdServer übergeben werden soll. Wenn nicht angegeben, wird der Cue-Point sofort eingefügt. Wenn Sie die Timecode-Eigenschaft verwenden, muss der Encoder SMPTE-formatierte ( HH:MM:SS:FF ) Zeitcode gespeichert in der tc Eigentum über OnFI . Timecodes sind vom Beginn des Livestreams an. |
ad_server_data |
Objekt | FAKULTATIV: Welche Schlüssel/Wert-Paare Sie übergeben, hängt vom verwendeten Ad-Server ab. Weitere Informationen finden Sie in Ihrer Ad-Server-Dokumentation und in der Targeting von Anzeigen mithilfe von Anzeigenmakros Sektion. |
cuepoint_id |
Zeichenfolge | FAKULTATIV: fakultativ. ID, die bei der Erstellung des Cue-Points zu verwenden ist. cancel Ist dies der true Fall, ist dieses Feld erforderlich und entspricht der ID des Cue-Points, der storniert werden soll. |
cancel |
Boolescher Wert | FAKULTATIV: fakultativ. Standard: false . Wann true cuepoint_id wird der von angegebene Cue-Point storniert. Ist die Werbeunterbrechung bereits im Gange, erfolgt ein Abbruch und die Rückkehr zum Hauptinhalt. |
Dauerbeispiel
Die Dauer des eingefügten Cue-Punkts muss mindestens die doppelte Länge der Segmente in der Arbeit.
Beispielsweise funktioniert das Einfügen eines 10-Sekunden-Cue-Points in einen Job mit "segment_seconds"=4
, problemlos. Das Einfügen desselben Cue-Points in einen Job jedoch mit "segment_seconds"=6
führt zu folgendem Fehler:
"error": "The parameter duration should be greater than
or equal to (2 * target duration) of the job"
Beispielanfragetext
{
"duration": 30,
"timecode": "15:50:49:16",
"ad_server_data" : {
"adbreakid": 12312
"breaktheme": "fitness"
}
}
Hinweise
- Software-Encoder wie Wirecast und OBS unterstützen das Senden von Timecode über
OnFI
Pakete im RTMP-Stream nicht - Elementale Hardware-Encoder unterstützen das Senden von Timecode über
OnFI
Pakete im RTMP-Stream
Beispielantwort
{
"id": "Job_ID",
"cue_point": {
"id": "adBreak-2f58393ada1442d98eca0817fa565ba4",
"duration": 30,
"accuracy": "segment", [Can be segment
or frame
]
"inserted_at": "2017-07-21T09:30:46.307Z" [ Time when the cue point was inserted in the stream]
},
}
Leuchtfeuer
Beacons sind Datenpunkte bei der Wiedergabe, die an Drittanbieter-Analysen gesendet werden, um zu verfolgen, ob und wie viele Anzeigen abgespielt wurden. In diesem Abschnitt werden wir uns die Beacon-Typen ansehen, die mit dem eingestellt werden können Live API und Variablen, die zur Bereitstellung der Daten verwendet werden können. Im nächsten Abschnitt werden die API-Anfragen beschrieben, die zum Erstellen und Verwalten von Beacon-Sets verwendet werden.
Beacon-Typen
Beacon-Typ | Beschreibung |
---|---|
Load |
Wird einmal pro Sitzung ausgelöst und wird nur ausgelöst, wenn das Manifest der obersten Ebene angefordert wird |
Play |
Inhalt wurde angefordert und das erste Segment zurückgegeben |
Heartbeat |
Zieldauer (Segmentsekunden) |
AdStart |
Einzelanzeige gestartet |
AdFirstQuartile |
Erstes Anzeigenquartil (25 %) |
AdMidpoint |
Zweites Anzeigenquartil (50 %) |
AdThirdQuartile |
Drittes Anzeigenquartil (75 %) |
AdComplete |
Einzelanzeige abgeschlossen |
AdBreakStart |
Werbepause hat begonnen |
AdBreakComplete |
Die Werbepause ist beendet |
Beacon-/Anzeigenvariablen
Die folgende Tabelle zeigt die Variablen, die Sie verwenden können, um Daten für die Beacon-URLs bereitzustellen. Um eine Variable einzuschließen, umgeben Sie mit doppelten geschweiften Klammern wie folgt: {{job.job_id}}
. Vollständige Beispiele finden Sie im nächsten Abschnitt zum Verwalten von Beacon-Sets.
Variabel |
Beschreibung
|
---|---|
session.session_id |
eindeutige Sitzungs-ID
|
job.job_id |
einzigartige Job-ID
|
videocloud.video_id |
Nur verfügbar für Jobs, die mit einem VideoCloud-Video erstellt wurden.
|
application_ad_configuration.description |
Wert der Anwendung bei der Sitzungserstellung
|
random.int32 |
zufällige 32-Bit-Ganzzahl mit Vorzeichen
|
random.int64 |
zufällige 64-Bit-Ganzzahl mit Vorzeichen
|
random.uint32 |
zufällige 32-Bit-Ganzzahl ohne Vorzeichen
|
random.uint64 |
zufällige 64-Bit-Ganzzahl ohne Vorzeichen
|
random.uuid |
zufällige uuid
|
server.timestamputc |
Epochenzeit in Millisekunden, zu der der Aufruf von der Ads-API getätigt wurde
|
client.useragent |
HTTP-User-Agent-Header-Wert bei der Sitzungserstellung
|
client.ipaddress |
http x-forwarded-for Header-Wert bei Sitzungserstellung, falls angegeben, andernfalls die Remote-Adresse
|
client.referrer |
HTTP-Referer-Header-Wert bei der Sitzungserstellung (Hinweis: Das ist die korrekte Schreibweise)
|
client.referer |
HTTP-Referer-Header-Wert bei der Sitzungserstellung (HTTP-Schreibweise)
|
client.ipuaid |
Hashwert von client.ipaddress und client.useragent
|
live.adbreak |
(derzeit unbenutzt)
|
live.adbreakdurationms |
Dauer der Werbeunterbrechung in Millisekunden
|
live.adbreakduration |
Dauer der Werbeunterbrechung in Gleitkomma-Sekunden mit doppelter Genauigkeit
|
live.adbreakdurationint |
Dauer der Werbeunterbrechung in ganzzahligen Sekunden
|
live.adbreak.timestamputc.wallclock |
Epochenzeit in Millisekunden, zu der der Aufruf an den Ads-Server getätigt wurde
|
live.adbreak.timestamputc.origin |
Epochenzeit in Millisekunden aus der Quell-Chunklist. Dieser Wert gibt den Zeitpunkt an, zu dem der Cue-Out-Chunk in der Origin-Chunklist erstellt wurde.
|
live.adbreak.timestamputc.session |
Epochenzeit in Millisekunden aus der Ssai-Chunklist. Dieser Wert gibt die Zeit des Cue-Out-Chunks in der ssai-Chunkliste an. Da der Adbreak-Inhalt und die Adbreak-Lücke normalerweise NICHT identisch sind,
live.adbreak.timestamputc.origin ist der nach dem 1. Adbreak anders als live.adbreak.timestamputc.session . Dieser Wert berücksichtigt die Zeitanpassungen, die in der vorgenommen wurden SSAI Chunklist. |
SCTE-35-Anzeigenvariablen
Die Society of Cable Telecommunications Engineers (SCTE) definiert einen Standard für die dynamische Anzeigeneinfügung für Livestreams. Ein SCTE-35-Anzeigenmarker definiert den Zeitstempel und die Dauer, zu der eine Anzeige in den Stream eingefügt werden kann.
Wenn sie von SCTE-35 geparst werden, können die folgenden Konfigurationsvariablen auf Ihre Anzeigen-Tags angewendet werden:
Variabel |
Beschreibung
|
---|---|
{{scte35_eventID}} |
eine eindeutige Ereignis-ID, die mit einer SCTE35-Nachricht übergeben wurde.
|
{{scte35_programID}} |
Eine eindeutige Programm-ID, die mit einer SCTE35-Nachricht übergeben wird.
|
{{scte35_availNum}} |
Eine für Anzeigen verfügbare ID für eine bestimmte Spleißzeit, die über eine SCTE35-Nachricht gesendet wird.
|
{{scte35_breakDuration}} |
Pausendauer für die Werbeunterbrechung, ausgedrückt in Ticks des 90-kHz-Takts des Programms, die mit einer SCTE35-Nachricht übergeben wird.
|
{{scte35_spliceTime}} |
Die Spleißzeit für eine Werbeunterbrechung, ausgedrückt in Ticks des 90-kHz-Takts des Programms, wird mit einer SCTE35-Nachricht übergeben.
|
Als Teil der HLS-Manifeste sind die SCTE-35-Nachrichten ebenfalls base64 mit den Variablen in JSON. Zum Beispiel:
{"scte35_eventID": somevalue, "scte35_programID": somevalue}
Beacon-Sets verwalten
Dieser Abschnitt enthält Details zu den API-Anfragen zum Verwalten von Beacon-Sets. Informationen zu Beacon-Typen und -Variablen finden Sie im vorherigen Abschnitt.
Um einem Live-Job ein Beacon-Set hinzuzufügen, erstellen Sie zuerst das Beacon-Set und fügen Sie dann die ID beim Erstellen des Jobs ein, wie folgt:
{
"live_stream": true,
"region": "us-west-2",
"reconnect_time": 30,
"ad_insertion": true,
"beacon_set": "beacon_set_id", ...
Erstellen Sie ein Beacon-Set
Um ein Beacon-Set zu erstellen, senden Sie a POST
Anfrage:
Methode | POST |
---|---|
URL | https://api.bcovlive.io/v1/ssai/beaconsets |
Kopfzeile | X-API-KEY: your API KEY |
Beispielanfragetext
{
"account_id": "User's Account ID [Optional]",
"beacon_urls": [
{
"beacon_url": "https://myserver.com/beaconRX/{{job.job_id}}/load?position=load&sid={{session.session_id}}&jid={{job.job_id}}&app={{application_ad_configuration.description}}&rnd32={{random.int32}}&rnd64={{random.int64}}&bid={{random.uuid}}&t={{server.timestamputc}}&ua={{client.useragent}}&ip={{client.ipaddress}}&ref={{client.referrer}}&ref={{client.referer}}&ab={{live.adbreak}}&abd={{live.adbreakduration}}&abdi={{live.adbreakdurationint}}",
"beacon_type": "Load"
},
{
"beacon_url": "https://myserver.com/beaconRX/{{job.job_id}}/play?position=play&sid={{session.session_id}}&jid={{job.job_id}}&app={{application_ad_configuration.description}}&rnd32={{random.int32}}&rnd64={{random.int64}}&bid={{random.uuid}}&t={{server.timestamputc}}&ua={{client.useragent}}&ip={{client.ipaddress}}&ref={{client.referrer}}&ref={{client.referer}}&ab={{live.adbreak}}&abd={{live.adbreakduration}}&abdi={{live.adbreakdurationint}}",
"beacon_type": "Play"
}
]
}
Beispielantwort
{
"beacon_set": {
"beacon_urls": [{
"beacon_url": "https://myserver.com/beaconRX/{{job.job_id}}/load?position=load&sid={{session.session_id}}&jid={{job.job_id}}&app={{application_ad_configuration.description}}&rnd32={{random.int32}}&rnd64={{random.int64}}&bid={{random.uuid}}&t={{server.timestamputc}}&ua={{client.useragent}}&ip={{client.ipaddress}}&ref={{client.referrer}}&ref={{client.referer}}&ab={{live.adbreak}}&abd={{live.adbreakduration}}&abdi={{live.adbreakdurationint}}",
"beacon_type": "Load"
},
{
"beacon_url": "https://myserver.com/beaconRX/{{job.job_id}}/play?position=play&sid={{session.session_id}}&jid={{job.job_id}}&app={{application_ad_configuration.description}}&rnd32={{random.int32}}&rnd64={{random.int64}}&bid={{random.uuid}}&t={{server.timestamputc}}&ua={{client.useragent}}&ip={{client.ipaddress}}&ref={{client.referrer}}&ref={{client.referer}}&ab={{live.adbreak}}&abd={{live.adbreakduration}}&abdi={{live.adbreakdurationint}}",
"beacon_type": "Play"
}],
"beacon_set_id": "Inserted Beacon Set ID",
"account_id": "USER's ACCOUNT ID"
}
"inserted": true
}
Aktualisieren Sie ein Beacon-Set
Das Aktualisieren eines Beacon-Sets ähnelt dem Erstellen eines Beacon-Sets. Sende ein PUT
Anfrage:
Methode | PUT |
---|---|
URL | https://api.bcovlive.io/v1/ssai/beaconsets/beaconset/beacon_set_id |
Kopfzeile | X-API-KEY: your API KEY |
Beispielanfragetext
{
"account_id": "User's Account ID [Optional]",
"beacon_urls": [
{
"beacon_url": "https://myserver.com/beaconRX/load",
"beacon_type": "Load"
},
{
"beacon_url": "https://myserver.com/beaconRX/play",
"beacon_type": "Play"
}
]
}
Beispielantwort
{
"beacon_set": {
"account_id": "User's Account ID",
"beacon_set_id": "Beacon set ID",
"beacon_urls": [{
"beacon_url": "https://myserver.com/beaconRX/load",
"beacon_type": "Load"
},
{
"beacon_url": "https://myserver.com/beaconRX/play",
"beacon_type": "Play"
}],
"updated_beacon_set": {
"beacon_set_id": "Beacon set ID",
"beacon_urls": [{
"beacon_url": "https://myserver.com/beaconRX/load",
"beacon_type": "Load"
},
{
"beacon_url": "https://myserver.com/beaconRX/play",
"beacon_type": "Play"
}],
"account_id": "User's Account ID"
}
}
}
Beacon-Sets erhalten
Um die Beacon-Sets für ein Konto abzurufen, senden Sie a GET
Anfrage:
Methode | GET |
---|---|
URL | https://api.bcovlive.io/v1/ssai/beaconsets/account/Account ID |
Kopfzeile | X-API-KEY: your API KEY |
Beispielantwort
[{
"account_id": "User's Account ID",
"beacon_set_id": "Beacon set ID1",
"beacon_urls": [{
"beacon_url": "https://myserver.com/beaconRX/load",
"beacon_type": "Load"
}]
},
{
"account_id": "User's Account ID",
"beacon_set_id": "Beacon set ID2",
"beacon_urls": [{
"beacon_url": "https://myserver.com/beaconRX2/load",
"beacon_type": "Load"
},
{
"beacon_url": "https://myserver.com/beaconRX2/play",
"beacon_type": "Play"
}]
}]
Beacon-Sets für anfragende Benutzer abrufen
Sie können die Beacon-Sets auch für das Konto des anfordernden Benutzers abrufen, ohne die Konto-ID in die Anforderungs-URL aufzunehmen:
Methode | GET |
---|---|
URL | https://api.bcovlive.io/v1/ssai/beaconsets |
Kopfzeile | X-API-KEY: your API KEY |
Beispielantwort
[{
"account_id": "User's Account ID",
"beacon_set_id": "Beacon set ID1",
"beacon_urls": [{
"beacon_url": "https://myserver.com/beaconRX/load",
"beacon_type": "Load"
}]
},
{
"account_id": "User's Account ID",
"beacon_set_id": "Beacon set ID2",
"beacon_urls": [{
"beacon_url": "https://myserver.com/beaconRX2/load",
"beacon_type": "Load"
},
{
"beacon_url": "https://myserver.com/beaconRX2/play",
"beacon_type": "Play"
}]
}]
Holen Sie sich ein Beacon-Set von id
Um ein einzelnes Beacon-Set anhand seiner ID abzurufen, senden Sie a GET
Anfrage:
Methode | GET |
---|---|
URL | https://api.bcovlive.io/v1/ssai/beaconsets/beaconset/beacon_set_id |
Kopfzeile | X-API-KEY: your API KEY |
Beispielantwort
{
"account_id": "User account ID",
"beacon_set_id": "Beacon set ID",
"beacon_urls": [{
"beacon_type": "Load",
"beacon_url": "https://myserver.com/beaconRX2/load"
},
{
"beacon_type": "Play",
"beacon_url": "https://myserver.com/beaconRX2/play"
}]
}
Beacon-Set löschen
Um schließlich ein Beacon-Set zu löschen, senden Sie a DELETE
Anfrage:
Methode | DELETE |
---|---|
URL | https://api.bcovlive.io/v1/ssai/beaconsets/beaconset/beacon_set_id |
Kopfzeile | X-API-KEY: your API KEY |
Beispielantwort
Die Antwort wird wie folgt aussehen:
{
"beacon_set_id": "Beacon set ID",
"deleted": true
}
Anhang
Unten ist ein Screenshot, der ein Beispiel für ein Cue-Point-Setup für den Elemental-Encoder zeigt.