라이브 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로 표시되므로 무슨 요일인지 알 수 없습니다. 이로 인해 광고 브레이크가 00:01:00 에 시작되도록 23:55:00 에 큐 포인트를 전송하면 서버가 이를 거의 24시간 전으로 해석하는 등의 문제가 발생할 수 있습니다. 브라이트코브는 이에 대한 수정 사항을 다음과 같이 구현했습니다. 23:50:00 ~ 00:00:00 사이에만큐 포인트가 도착하면 다음 날 광고 브레이크를 예약하는 것으로 간주합니다.
- 단일 요청에 최대 128개의 큐 포인트를 쌓을 수 있지만 위에서 설명한 "롤오버"에 대한 규칙이 주어지면 다음 날에 이 방식으로 큐 포인트를 보낼 수 없습니다.
- SMPTE 타임코드는 스트림과 연결되어 있으므로 큐가 스트림의 예약된 시간 이후에 도착할 수 있습니다. Brightcove는 큐 후 최대 5초의 허용 오차를 허용하여 여전히 큐 포인트를 삽입합니다.
- 현재 RTMP 입력에서는
avail_in
및avail_out
유형 큐 포인트만 지원됩니다. - SCTE-35 큐 포인트는 RTP 및 SRT 입력에서 지원됩니다.
수동 큐 포인트 삽입
다음을 사용하여 작업 또는 중복 그룹에 대한 즉각적인 큐 포인트를 생성할 수 있습니다. Live API보내서POST
요구:
방법 | POST |
---|---|
URL(작업용) | 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 형식의 타임코드, HH: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에서 호출이 이루어진 epoch 시간 (밀리 초)
|
client.useragent |
세션 생성시 http 사용자 에이전트 헤더 값
|
client.ipaddress |
세션 생성시 http x-forwarded-for 헤더 값 (제공된 경우), 그렇지 않으면 원격 주소
|
client.referrer |
세션 생성 시 http 리퍼러 헤더 값 (참고: 올바른 철자임)
|
client.referer |
세션 생성시 http 참조 자 헤더 값 (http 맞춤법)
|
client.ipuaid |
client.ipaddress 및 client.useragent의 해시 값
|
live.adbreak |
(현재 미사용)
|
live.adbreakdurationms |
광고 시간 (밀리 초)
|
live.adbreakduration |
배정 밀도 부동 소수점 초 단위 광고 시간
|
live.adbreakdurationint |
광고 시간 (정수 초)
|
live.adbreak.timestamputc.wallclock |
광고 서버를 호출 한 epoch 시간 (밀리 초)
|
live.adbreak.timestamputc.origin |
오리진 청크리스트의 epoch 시간 (밀리 초)입니다. 이 값은 원본 청크 목록에 큐 아웃 청크가 생성 된 시간을 나타냅니다.
|
live.adbreak.timestamputc.session |
ssai 청크리스트의 epoch 시간 (밀리 초). 이 값은 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}} |
SCTE35 메시지와 함께 전달 된 프로그램의 90kHz 클록 틱으로 표시되는 광고 시간의 휴식 시간입니다.
|
{{scte35_spliceTime}} |
SCTE35 메시지와 함께 전달 된 프로그램의 90kHz 클럭의 틱으로 표시되는 광고 시간의 연결 시간입니다.
|
HLS 매니페스트의 일부로 SCTE-35 메시지도 JSON의 변수가 포함된 base64입니다. 예:
{"scte35_eventID": somevalue, "scte35_programID": somevalue}
비콘 세트 관리
이 섹션에서는 비콘 세트를 관리하기위한 API 요청에 대해 자세히 설명합니다. 비콘 유형 및 변수는 이전 섹션을 참조하십시오.
라이브 작업에 비콘 세트를 추가하려면 먼저 비콘 세트를 만든 다음 다음과 같이 작업을 만들 때 ID를 포함합니다.
{
"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 인코더에 대한 샘플 큐 포인트 설정을 보여주는 스크린 샷입니다.