라이브 API: SSAI를 사용한 큐 포인트 및 광고 비콘

이 주제에서는 라이브 스트림 작업에 브라이트코브의 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_inavail_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입니다. canceltrue인 경우 이 필드는필수이며 취소할 큐 포인트의 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"
    }
  }

참고 사항

  1. Wirecast 및 OBS와 같은 소프트웨어 인코더는 다음을 통한 전송 타임 코드를 지원하지 않습니다. OnFI RTMP 스트림의 패킷
  2. 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에서 파싱된 경우 다음 구성 변수를 광고 태그에 적용할 수 있습니다.

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 인코더에 대한 샘플 큐 포인트 설정을 보여주는 스크린 샷입니다.

원소 큐 포인트 설정
원소 큐 포인트 설정