API en direct : Points de repère et balises publicitaires avec SSAI
Aperçu
L'insertion d'annonces côté serveur vous (SSAI) permet d'afficher des annonces lors d'un événement de diffusion en direct à des heures spécifiées. Pour des informations générales, consultez le API en direct : Insertion d'annonces côté serveur (SSAI) document.
Points de repère
Les coupures publicitaires sont déclenchées par des points de repère, qui peuvent être spécifiés de deux manières :
- Envoyé à Brightcove par l'encodeur
- Points de repère immédiats créés via le Live API
De l'encodeur
Le système de diffusion en direct Brightcove peut interpréter les points de repère soumis par l'encodeur au format AMF :
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
}
}
Remarques :
- Comme les codes temporels sont exprimés en HH:MM:SS, il n'est pas possible de savoir de quel jour il s'agit. Cela peut entraîner des problèmes tels que l'envoi d'un point de repère à 23h55:00 pour qu'une pause publicitaire commence à 00:01:00 et que le serveur interprète cela comme s'il s'agissait d'il y a presque 24 heures. Brightcove a mis en œuvre le correctif suivant : pour les points de repère arrivant entre 23 h 50 h 00 et 00 h 00 uniquement, nous supposerons que vous planifiez une pause publicitaire pour le jour suivant.
- Il est possible d'empiler jusqu'à 128 marqueurs dans une seule demande, mais compte tenu des règles de "report" expliquées ci-dessus, les marqueurs ne peuvent pas être envoyés de cette manière pour le jour suivant.
- Les timecodes SMPTE étant associés au flux, il est possible qu'un cue arrive après l'heure prévue dans le flux. Brightcove autorise une tolérance de 5 secondes après le signal pour l'insertion d'un point de repère.
- Seuls
avail_in
les pointsavail_out
de repère et de type sont actuellement pris en charge dans les entrées RTMP. - Les points de repère SCTE-35 sont pris en charge dans les entrées RTP et SRT.
Insertion manuelle de points de repère
Vous pouvez créer des points de repère immédiats pour une tâche ou un groupe redondant à l'aide du Live API en envoyant une POST
demande :
Méthode | POST |
---|---|
URL (pour un emploi) | https://api.bcovlive.io/v1/jobs/{Job_ID}/cue point |
URL (pour un groupe redondant) | https://api.bcovlive.io/v1/jobs/{Redundant_Group_ID}/cue point |
Entête | X-API-KEY: {your API KEY} |
Incluez un corps de requête spécifiant les éléments suivants :
Champ | Type | Description |
---|---|---|
duration |
Entier | Durée de la pause en secondes. La durée du point de repère inséré doit être au moins deux fois la longueur des segments de la tâche. Voir le exemple de durée. |
timecode |
Format SMPTE | FACULTATIF : Un code temporel au format SMPTE, HH:MM:SS:FF (FF = frames), pour spécifier quand un ensemble de variables (paires clé/valeur) doit être transmis à l'AdServer. S' il est omis, le point de repère sera inséré immédiatement. Si vous utilisez la propriété Timecode, l'encodeur doit envoyer le code temporel SMPTE formatted ( HH:MM:SS:FF ) stocké dans la tc propriété via OnFI . Les codes temporels sont à partir du début du flux en direct. |
ad_server_data |
Objet | FACULTATIF : Les paires clé/valeur que vous transmettez dépendent du serveur publicitaire que vous utilisez. Pour plus de détails, consultez la documentation de votre serveur publicitaire et le Ciblage d'annonces à l'aide de macros d'annonces section. |
cuepoint_id |
Chaîne | FACULTATIF : Facultatif. ID à utiliser lors de la création d'un point de repère. Si cancel tel est le cas true , ce champ est obligatoire et correspond à l'identifiant du point de repère à annuler. |
cancel |
Booléen | FACULTATIF : Facultatif. Par défaut : false . Quand true , le point de repère spécifié par cuepoint_id sera annulé. Si la coupure publicitaire est déjà en cours, un crash-out se produira, ramenant au contenu principal. |
Exemple de durée
La durée du point de repère inséré doit être au moins deux fois la longueur des segments dans le travail.
Par exemple, l'insertion d'un point de repère de 10 secondes dans une tâche avec "segment_seconds"=4
, fonctionnera correctement. Cependant, l'insertion du même point de repère dans un travail avec "segment_seconds"=6
entraînera l'erreur suivante :
"error": "The parameter duration should be greater than
or equal to (2 * target duration) of the job"
Exemple de corps de requête
{
"duration": 30,
"timecode": "15:50:49:16",
"ad_server_data" : {
"adbreakid": 12312
"breaktheme": "fitness"
}
}
Remarques
- Les encodeurs logiciels tels que Wirecast et OBS ne prennent pas en charge l'envoi de timecode via
OnFI
paquets dans le flux RTMP - Les encodeurs matériels élémentaires prennent en charge l'envoi de timecode via
OnFI
paquets dans le flux RTMP
Exemple de réponse
{
"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]
},
}
Balises
Les balises sont des points de données sur la lecture envoyés à des analyses tierces pour savoir si et combien d'annonces ont été lues. Dans cette section, nous allons examiner les types de balise qui peuvent être définis à l'aide des variables Live API, et qui peuvent être utilisées pour fournir les données. La section suivante détaillera les requêtes API utilisées pour créer et gérer des ensembles de balises.
Types de balises
Type de balise | Description |
---|---|
Load |
Lancé une fois par session et déclenché uniquement lorsque le manifeste de niveau supérieur est demandé |
Play |
Le contenu a été demandé et le premier segment renvoyé |
Heartbeat |
Durée cible (segment en secondes) |
AdStart |
Annonce individuelle lancée |
AdFirstQuartile |
Premier quartile publicitaire (25 %) |
AdMidpoint |
Deuxième quartile publicitaire (50 %) |
AdThirdQuartile |
Troisième quartile publicitaire (75 %) |
AdComplete |
Annonce individuelle terminée |
AdBreakStart |
La coupure publicitaire a commencé |
AdBreakComplete |
la coupure publicitaire est terminée |
Variables balise/annonce
Le tableau ci-dessous montre les variables que vous pouvez utiliser pour fournir des données pour les URL de balise. Pour inclure une variable, entourez-la d'accolades doubles, comme ceci : {{job.job_id}}
. Voir la section suivante sur la gestion des jeux de balises pour des exemples complets.
Variable |
Description
|
---|---|
session.session_id |
identifiant de session unique
|
job.job_id |
identifiant de travail unique
|
videocloud.video_id |
Uniquement disponible pour les travaux créés avec une vidéo VideoCloud.
|
application_ad_configuration.description |
valeur de l'application à la création de la session
|
random.int32 |
entier aléatoire 32 bits signé
|
random.int64 |
entier aléatoire 64 bits signé
|
random.uint32 |
entier aléatoire 32 bits non signé
|
random.uint64 |
entier aléatoire 64 bits non signé
|
random.uuid |
uuid aléatoire
|
server.timestamputc |
temps d'époque en millisecondes lorsque l'appel de l'ads-api a été effectué
|
client.useragent |
valeur de l'en-tête de l'agent utilisateur http lors de la création de la session
|
client.ipaddress |
http x-forwarded-for valeur d'en-tête à la création de la session, si fournie, sinon l'adresse distante
|
client.referrer |
valeur de l'en-tête du référent http lors de la création de la session (remarque : c'est l'orthographe correcte)
|
client.referer |
valeur de l'en-tête de référence HTTP lors de la création de la session (orthographe HTTP)
|
client.ipuaid |
valeur de hachage de client.ipaddress et client.useragent
|
live.adbreak |
(actuellement inutilisé)
|
live.adbreakdurationms |
Durée de la coupure publicitaire en millisecondes
|
live.adbreakduration |
Durée de la coupure publicitaire en secondes à virgule flottante double précision
|
live.adbreakdurationint |
Durée de la coupure publicitaire en nombre entier de secondes
|
live.adbreak.timestamputc.wallclock |
temps d'époque en millisecondes lorsque l'appel au serveur d'annonces a été effectué
|
live.adbreak.timestamputc.origin |
temps d'époque en millisecondes à partir de la liste de morceaux d'origine. Cette valeur indique l'heure à laquelle le morceau de sortie de repère a été créé dans la liste de morceaux d'origine.
|
live.adbreak.timestamputc.session |
temps d'époque en millisecondes à partir de la liste de morceaux ssai. Cette valeur indique l'heure du morceau de sortie dans la liste de morceaux ssai. Étant donné que le contenu de l'adbreak et l'écart d'adbreak ne sont généralement PAS les mêmes, après le premier adbreak,
live.adbreak.timestamputc.origin il est différent de live.adbreak.timestamputc.session . Cette valeur tient compte des ajustements de temps qui ont été effectués dans la SSAI liste de morceaux. |
Variables publicitaires SCTE-35
Les Société des ingénieurs en télécommunications par câble (SCTE) définit une norme pour l'insertion dynamique d'annonces pour les flux en direct. Un marqueur publicitaire SCTE-35 définit l'heure et la durée pendant lesquelles une publicité peut être insérée dans le flux.
Si elles sont analysées à partir de SCTE-35, les variables de configuration suivantes peuvent être appliquées à vos balises publicitaires :
Variable |
Description
|
---|---|
{{scte35_eventID}} |
un identifiant d'événement unique transmis avec un message SCTE35.
|
{{scte35_programID}} |
Un identifiant de programme unique est transmis avec un message SCTE35.
|
{{scte35_availNum}} |
Un identifiant pour une heure d'épissure spécifique disponible pour les publicités, envoyé via un message SCTE35.
|
{{scte35_breakDuration}} |
Durée de la pause publicitaire, exprimée en fonction de l'horloge à 90 kHz du programme, transmise par un message SCTE35.
|
{{scte35_spliceTime}} |
Temps d'épissage nécessaire à une pause publicitaire, exprimé en termes de temps de fonctionnement de l'horloge à 90 kHz du programme, transmis avec un message SCTE35.
|
Dans le cadre des manifestes HLS, les messages SCTE-35 sont également base64 avec les variables en JSON. Par exemple :
{"scte35_eventID": somevalue, "scte35_programID": somevalue}
Gestion des jeux de balises
Cette section fournit des détails sur les demandes d'API pour gérer les ensembles de balises. Voir la section précédente pour les types et les variables de balise.
Pour ajouter un jeu de balises à une tâche en direct, créez d'abord le jeu de balises, puis incluez l'ID lorsque vous créez la tâche, comme ceci :
{
"live_stream": true,
"region": "us-west-2",
"reconnect_time": 30,
"ad_insertion": true,
"beacon_set": "beacon_set_id", ...
Créer un jeu de balises
Pour créer un ensemble de balises, envoyez une POST
demande :
Méthode | POST |
---|---|
URL | https://api.bcovlive.io/v1/ssai/beaconsets |
Entête | X-API-KEY: your API KEY |
Exemple de corps de requête
{
"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"
}
]
}
Exemple de réponse
{
"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
}
Mettre à jour un jeu de balises
La mise à jour d'un jeu de balises est similaire à la création d'un. Soumettez une PUT
demande :
Méthode | PUT |
---|---|
URL | https://api.bcovlive.io/v1/ssai/beaconsets/beaconset/beacon_set_id |
Entête | X-API-KEY: your API KEY |
Exemple de corps de requête
{
"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"
}
]
}
Exemple de réponse
{
"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"
}
}
}
Obtenez des ensembles de balises
Pour récupérer les ensembles de balises d'un compte, soumettez une GET
demande :
Méthode | GET |
---|---|
URL | https://api.bcovlive.io/v1/ssai/beaconsets/account/Account ID |
Entête | X-API-KEY: your API KEY |
Exemple de réponse
[{
"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"
}]
}]
Obtenir des ensembles de balises pour l'utilisateur demandeur
Vous pouvez également obtenir les jeux de balises pour le compte de l'utilisateur demandeur sans inclure l'identifiant du compte dans l'URL de la demande :
Méthode | GET |
---|---|
URL | https://api.bcovlive.io/v1/ssai/beaconsets |
Entête | X-API-KEY: your API KEY |
Exemple de réponse
[{
"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"
}]
}]
Obtenir une balise définie par id
Pour récupérer une seule balise définie par son identifiant, soumettez une GET
demande :
Méthode | GET |
---|---|
URL | https://api.bcovlive.io/v1/ssai/beaconsets/beaconset/beacon_set_id |
Entête | X-API-KEY: your API KEY |
Exemple de réponse
{
"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"
}]
}
Supprimer un jeu de balises
Enfin, pour supprimer un ensemble de balises, envoyez une DELETE
demande :
Méthode | DELETE |
---|---|
URL | https://api.bcovlive.io/v1/ssai/beaconsets/beaconset/beacon_set_id |
Entête | X-API-KEY: your API KEY |
Exemple de réponse
La réponse ressemblera à ceci :
{
"beacon_set_id": "Beacon set ID",
"deleted": true
}
Annexe
Vous trouverez ci-dessous une capture d'écran montrant un exemple de configuration de point de repère pour l'encodeur Elemental.