即時 API:使用 SSAI 的提示點和廣告信標
概覽
服務器端廣告插入(SSAI)允許您在直播活動期間的指定時間展示廣告。有關一般信息,請參閱實時 API:服務器端廣告插入(SSAI)文檔。
提示點
廣告休息時間由提示點觸發,可以通過兩種方式指定:
- 編碼器發送給Brightcove
- 通過創建的即時提示點Live API
從編碼器
Brightcove實時投放系統可以解釋編碼器以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
}
}
注意事項:
- 由於時間碼以 HH:MM:SS 表示,因此沒有日期的概念。這可能會導致問題,例如在 23:55:00 發送提示點以讓廣告中斷從 00:01:00 開始,並讓服務器將其解釋為將近 24 小時前。Brightcove 已為此實施瞭如下修復:對於 僅在 23:50:00 和 00:00:00 之間到達的提示點,我們假設您正在安排第二天的廣告時段。
- 單個請求中最多可堆疊 128 個提示點,但考慮到上述關於“滾動”的規則,第二天不能以這種方式發送提示點。
- 由於 SMPTE 時間碼與流相關聯,因此提示可能會在流中的預定時間之後到達。Brightcove 將在提示後允許最多 5 秒的容差以仍然插入提示點。
- 僅有的
avail_in
和avail_out
RTMP 輸入目前支持類型提示點。 - RTP 和 SRT 輸入支持 SCTE-35 提示點。
手動插入提示點
您可以使用Live API通過發送一個POST
要求:
方法 | POST |
---|---|
網址(用於工作) | https://api.bcovlive.io/v1/jobs/{Job_ID}/cue point |
URL(用於冗餘組) | https://api.bcovlive.io/v1/jobs/{Redundant_Group_ID}/cue point |
標頭 | X-API-KEY: {your API KEY} |
包括指定以下內容的請求正文:
欄位 | 類型 | 描述 |
---|---|---|
duration |
整數 | 休息時間(以秒為單位)。 插入的提示點的持續時間需要至少是片段長度的兩倍在工作。見持續時間示例 . |
timecode |
SMPTE格式 | 選用性:SMPTE 格式的時間碼,高:MM:SS:FF(FF = 幀),用於指定何時應將一組變量(鍵/值對)傳遞給 adServer。 如果省略,將立即插入提示點。 如果使用時間碼屬性,編碼器必鬚髮送 SMPTE 格式的 ( HH:MM:SS:FF )時間碼存儲在tc 財產通過OnFI .時間碼是從直播開始的。 |
ad_server_data |
物件 | 選用性:您傳遞的鍵/值對將取決於您使用的廣告服務器。有關詳細信息,請參閱您的廣告服務器文檔和使用廣告宏定位廣告部分。 |
cuepoint_id |
字串 | 選用性:可選。創建提示點時使用的 ID。如果cancel 是true , 那麼這個字段就是必需的並且是要取消的提示點的 ID。 |
cancel |
布林值 | 選用性:可選。默認:false .什麼時候true , 由指定的提示點cuepoint_id 將被取消。如果廣告中斷已經在進行中,則會發生崩潰,返回到主要內容。 |
持續時間示例
插入的提示點的持續時間需要至少是片段長度的兩倍在工作。
例如,插入一個10秒提示點在一份工作中"segment_seconds"=4
, 將正常工作。但是,在作業中插入相同的提示點"segment_seconds"=6
將導致以下錯誤:
"error": "The parameter duration should be greater than
or equal to (2 * target duration) of the job"
請求主體範例
{
"duration": 30,
"timecode": "15:50:49:16",
"ad_server_data" : {
"adbreakid": 12312
"breaktheme": "fitness"
}
}
注意事項
- Wirecast 和 OBS 等軟件編碼器不支持通過
OnFI
RTMP 流中的數據包 - Elemental 硬件編碼器確實支持通過以下方式發送時間碼
OnFI
RTMP 流中的數據包
範例回應
{
"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]
},
}
信標
信標是發送到第三方分析的回放數據點,以跟踪是否播放了廣告以及播放了多少廣告。在本節中,我們將查看可以使用Live API,以及可用於提供數據的變量。下一部分將詳細介紹用於創建和管理信標集的API請求。
信標類型
信標類型 | 描述 |
---|---|
Load |
每個會話觸發一次,僅在請求頂級清單時觸發 |
Play |
已請求內容,並且返回了第一段 |
Heartbeat |
目標持續時間(段秒) |
AdStart |
個別廣告已開始 |
AdFirstQuartile |
前四分位(25%) |
AdMidpoint |
廣告四分位數(50%) |
AdThirdQuartile |
第三四分位(75%) |
AdComplete |
個別廣告已完成 |
AdBreakStart |
廣告中斷已開始 |
AdBreakComplete |
廣告中斷已結束 |
信標/廣告變量
下表顯示了可用於為信標URL提供數據的變量。要包含變量,請用雙花括號括起來,如下所示:{{job.job_id}}
.有關完整的示例,請參見下一部分有關管理信標集的部分。
變數 |
描述
|
---|---|
session.session_id |
唯一的會話ID
|
job.job_id |
唯一的工作ID
|
videocloud.video_id |
僅適用於使用VideoCloud視頻創建的作業。
|
application_ad_configuration.description |
會話創建時應用程序的價值
|
random.int32 |
隨機的32位有符號整數
|
random.int64 |
隨機的64位有符號整數
|
random.uint32 |
隨機32位無符號整數
|
random.uint64 |
隨機的64位無符號整數
|
random.uuid |
隨機uuid
|
server.timestamputc |
調用ads-api的時間間隔(以毫秒為單位)
|
client.useragent |
會話創建時的http用戶代理標頭值
|
client.ipaddress |
會話創建時的http x-forwarded-for標頭值(如果提供),否則為遠程地址
|
client.referrer |
會話創建時的http Referer標頭值(注意:這是正確的拼寫)
|
client.referer |
會話創建時的http Referer標頭值(http拼寫)
|
client.ipuaid |
client.ipaddress和client.useragent的哈希值
|
live.adbreak |
(當前未使用)
|
live.adbreakdurationms |
廣告休息時間(以毫秒為單位)
|
live.adbreakduration |
廣告中斷持續時間(以雙精度浮點秒為單位)
|
live.adbreakdurationint |
廣告休息時間(以整數秒為單位)
|
live.adbreak.timestamputc.wallclock |
調用廣告服務器的時間間隔(以毫秒為單位)
|
live.adbreak.timestamputc.origin |
從原始塊列表開始的時間(以毫秒為單位)。該值指示在原始塊列表中創建提示塊的時間。
|
live.adbreak.timestamputc.session |
ssai塊列表中的時間間隔(以毫秒為單位)。此值指示ssai塊列表中提示塊的時間。由於廣告中斷內容和廣告中斷間隙通常不相同,因此在第一個廣告中斷之後
live.adbreak.timestamputc.origin 不同於live.adbreak.timestamputc.session .該值考慮了在SSAI塊列表。 |
SCTE-35廣告變量
這有線電信工程師協會 (SCTE)定義了實時流的動態廣告插入標準。SCTE-35 廣告標記定義可將廣告插入流中的時間戳和持續時間。
如果從 SCTE-35 解析,則可以將以下配置變量應用於您的廣告代碼:
變數 |
描述
|
---|---|
{{scte35_eventID}} |
隨SCTE35消息傳遞的唯一事件ID。
|
{{scte35_programID}} |
隨SCTE35消息傳遞的唯一程序ID。
|
{{scte35_availNum}} |
廣告可用的特定拼接時間的ID,通過SCTE35消息發送。
|
{{scte35_breakDuration}} |
廣告中斷的中斷時間(以程序的90 kHz時鐘的滴答度表示)隨SCTE35消息傳遞。
|
{{scte35_spliceTime}} |
廣告中斷的拼接時間(以程序的90 kHz時鐘的滴答度表示)隨SCTE35消息一起傳遞。
|
作為 HLS 清單的一部分,SCTE-35 消息也是帶有 JSON 變量的 base64。例如:
{"scte35_eventID": somevalue, "scte35_programID": somevalue}
管理信標集
本節提供有關管理信標集的API請求的詳細信息。有關信標類型和變量,請參見上一節。
要將信標集添加到實時作業中,請先創建信標集,然後在創建作業時添加標識,如下所示:
{
"live_stream": true,
"region": "us-west-2",
"reconnect_time": 30,
"ad_insertion": true,
"beacon_set": "beacon_set_id", ...
創建信標集
要創建信標集,請發送POST
要求:
方法 | POST |
---|---|
URL | https://api.bcovlive.io/v1/ssai/beaconsets |
標頭 | X-API-KEY: your API KEY |
請求主體範例
{
"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"
}
]
}
範例回應
{
"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
}
更新信標集
更新信標集與創建信標集相似。提交一個PUT
要求:
方法 | PUT |
---|---|
URL | https://api.bcovlive.io/v1/ssai/beaconsets/beaconset/beacon_set_id |
標頭 | X-API-KEY: your API KEY |
請求主體範例
{
"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"
}
]
}
範例回應
{
"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"
}
}
}
獲取信標集
要檢索帳戶的信標集,請提交GET
要求:
方法 | GET |
---|---|
URL | https://api.bcovlive.io/v1/ssai/beaconsets/account/Account ID |
標頭 | X-API-KEY: your API KEY |
範例回應
[{
"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"
}]
}]
獲取請求用戶的信標集
您還可以獲取請求用戶帳戶的信標集,而無需在請求URL中包含帳戶ID:
方法 | GET |
---|---|
URL | https://api.bcovlive.io/v1/ssai/beaconsets |
標頭 | X-API-KEY: your API KEY |
範例回應
[{
"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"
}]
}]
獲取ID設置的信標
要檢索由其 id 設置的單個信標,請提交GET
要求:
方法 | GET |
---|---|
URL | https://api.bcovlive.io/v1/ssai/beaconsets/beaconset/beacon_set_id |
標頭 | X-API-KEY: your API KEY |
範例回應
{
"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"
}]
}
刪除信標集
最後,要刪除一個信標集,發送一個DELETE
要求:
方法 | DELETE |
---|---|
URL | https://api.bcovlive.io/v1/ssai/beaconsets/beaconset/beacon_set_id |
標頭 | X-API-KEY: your API KEY |
範例回應
響應將如下所示:
{
"beacon_set_id": "Beacon set ID",
"deleted": true
}
附錄
下面的屏幕截圖顯示了Elemental編碼器的示例提示點設置。