2019년 10월 22일에 출시된 브라이트코브 SDK v6.9.0에는 몇 가지 변경 사항이 포함되어 있습니다( 릴리스 노트 참조). 하지만 이 글에서는 SSAI 플러그인의 변경 사항, 특히 라이브 SSAI에 대한 추가 지원에 대해 구체적으로 이야기하고자 합니다.
라이브 SSAI 개요
라이브 SSAI란 무엇인가요? 간단히 말해, Live SSAI는 동적으로 삽입된 광고가 포함된 라이브 스트림입니다. 라이브 SSAI API에 대한 자세한 내용은 라이브 API에서확인할 수 있습니다: 서버 측 광고 삽입(SSAI)")에서 자세한 내용을 확인할 수 있으며, SSAI 전반에 대한 자세한 내용은 비디오 클라우드 SSAI 개요를 참조하세요.
모든 플레이어에서 라이브 SSAI 스트림을 재생하면 콘텐츠와 광고가 동일한 스트림의 일부로 표시되며, 둘 사이에 시각적으로 표시되지 않습니다. 이때 브라이트코브 SDK와 SSAI 플러그인이 유용하게 사용됩니다. SSAI 플러그인은 광고 중단이 재생되는 시점을 감지하고 컨트롤러가 변경되어 광고 중단 시간, 개별 광고의 지속 시간 및 광고 횟수 카운트다운과 같은 유용한 정보를 표시합니다.
시작하기
Android 및 SSAI 플러그인 코드에 대해 설명하기 전에 다음 작업을 수행해야 합니다:
- 라이브 광고 구성 만들기
- 라이브 스트림 설정
- 라이브 광고ConfigId 찾기 및 복사하기
라이브 광고 구성 만들기
VOD 동영상과 동일한 방식으로 광고 구성을 만들어야 합니다. 그러려면 다음 가이드를 따르세요: 라이브 광고 구성 만들기를 참조하세요. 라이브 모듈에서 서버 측 광고 구현하기를 살펴볼 수도 있습니다.
라이브 스트림 설정
SSAI를 지원하는 라이브 스트림을 만들려면 다음을 따르세요: 서버 측 광고를 지원하는 라이브 이벤트 만들기.
라이브 애드컨피지드 찾기 및 복사
1단계에서 라이브 광고 구성을 만들면 Id가 생성되며, VOD SSAI와 동일한 방식으로 이를 광고ConfigId로 사용하고 싶을 수 있습니다. 하지만 이는 라이브 SSAI에 필요한 Id가 아닙니다.
라이브 찾기 adConfigId의 단계를 따라야 합니다. 라이브 이벤트 게시하기. 마지막 단계에서 플레이어 URL을 확인할 수 있습니다. 이 플레이어 URL에는 adConfigId. 다음과 같은 이유로 차별화할 수 있습니다. adConfigId 로 시작합니다. “live.”
ㅆ사이 플러그인으로 라이브 ㅆ사이 동영상 요청하기
이제 동영상을 요청하고 재생할 준비가 되었습니다.
가장 먼저 해야 할 일은 다음과 같이 HttpRequestConfig
객체를 사용하여 라이브 adConfigId.
String adConfigIdKey = "ad_config_id";
String adConfigIdValue = "live.eb5YO2S2Oqdzlhc3BCHAoXKYJJl4JZlWXeiH49VFaYO2qdTkNe_GdEBSJjir";
HttpRequestConfig httpRequestConfig = new HttpRequestConfig.Builder()
.addQueryParameter(adConfigIdKey, adConfigIdValue)
.build();
둘째, 우리는 SSAIComponent
객체를 생성하여 라이브 SSAI 스트림을 VOD SSAI 스트림과 동일한 방식으로 처리합니다.
SSAIComponent plugin = new SSAIComponent(this, brightcoveVideoView);
그런 다음 Catalog
객체입니다.
Catalog catalog = new Catalog(eventEmitter, accountId, policyKey);
마지막으로, 동영상 요청은 HttpRequestConfig
를 생성하고 수신된 비디오를 SSAI 플러그인으로 처리합니다. SSAI 플러그인은 자동으로 브라이트코브 비디오 보기에 비디오를 추가합니다.
catalog.findVideoByID(videoId, httpRequestConfig, new VideoListener() {
@Override
public void onVideo(Video video) {
plugin.processVideo(video);
}
});
이 프로세스는 VOD SSAI와 완전히 동일하다는 것을 알 수 있습니다. 유일한 차이점은 사용되는 adConfigId입니다.
획기적인 변화
SSAI 플러그인 v6.9.0에서는 라이브 동영상을 중단했다가 다시 시작할 때 저장된 재생 헤드 위치와 관련된 문제로 인해 잠재적인 중단 변경을 도입해야 했습니다. 이 변경 사항은 라이브 동영상 재생을 중단하고 다시 시작할 때 Event.PLAYHEAD_POSITION
속성 중 하나에서 EventType.PROGRESS
또는 EventType.AD_PROGRESS
이벤트.
그리고 Event.PLAYHEAD_POSITION
이전 버전에서는 광고 또는 메인 콘텐츠에 대한 상대적 재생 위치가 포함되었지만 6.9.0에서는 절대 재생 위치가 추가되었습니다.
예를 들어 설명하겠습니다. 다음 그림에는 총 길이가 43초인 VOD SSAI 동영상이 있습니다. 메인 콘텐츠 시간은 15초이며, 6초의 프리롤, 14초의 미드롤, 8초의 포스트롤 등 3개의 광고가 포함되어 있습니다. 미드 롤 재생을 시작하면 절대 재생 헤드 위치는 11초가 되지만 미드 롤에 대한 상대 재생 헤드 위치는 0이 됩니다. 중간 롤의 Event.PLAYHEAD_POSITION
값은 이전 버전에서는 0이지만 6.9.0 버전에서는 11초입니다.
참고: 모든 실제 재생 위치 값은 브라이트코브 SDK에서 밀리초 단위로 제공됩니다.
한편, 새로운 이벤트 속성인 Event.PROGRESS_BAR_PLAYHEAD_POSITION
상대적인 재생 위치를 포함합니다. 이 이름은 궁극적으로 진행률 표시줄을 통해 사용자에게 재생 블록(광고 또는 콘텐츠)의 재생 헤드 위치를 표시하는 목적을 더 잘 설명합니다. 그렇긴 하지만 Event.PLAYHEAD_POSITION
값만 사용하면 됩니다. Event.PROGRESS_BAR_PLAYHEAD_POSITION
대신
그리고 Event.ORIGINAL_PLAYHEAD_POSITION
는 호환성을 위해 변경되지 않았으며, 여전히 절대 재생 헤드 위치를 포함하고 있습니다.
다음 표에는 변경 사항이 요약되어 있습니다:
이벤트 속성 | 6.9.0 이전 버전 | 6.9.0 이상 |
Event.PLAYHEAD_POSITION |
상대적인 재생 헤드 위치 | 절대 재생 헤드 위치 |
Event.ORIGINAL_PLAYHEAD_POSITION |
절대 재생 헤드 위치 | 절대 재생 헤드 위치 |
Event.PROGRESS_BAR_PLAYHEAD_POSITION |
N/A | 상대적인 재생 헤드 위치 |
진행 상황 이벤트 청취 시 고려 사항
들을 때 주의해야 할 몇 가지 사항이 있습니다. EventType.PROGRESS
이벤트를 추가합니다. 리스너를 추가하는 시점이 중요합니다.
먼저 브라이트코브 SDK와 SSAI 플러그인의 기능에 대해 몇 가지 배경 지식을 알려드리고자 합니다.
1. 먼저 EventType.PROGRESS
는 원래 ExoPlayerVideoDisplayComponent
클래스와 Event.PLAYHEAD_POSITION
프로퍼티에는 ExoPlayer에서 검색된 재생 헤드 위치가 있으며, 이는 SSAI 컨텍스트에서 절대적인 재생 헤드 위치입니다(ExoPlayer를 사용 중이라고 가정합니다).
2. 그런 다음 SSAI 플러그인이 EventType.PROGRESS
이벤트를 수신하고 재생 위치를 SSAI 타임라인과 비교하여 콘텐츠 재생인지 광고 재생인지 판단합니다. 두 경우 모두 상대적인 재생 위치를 계산하고 새로운 Event.PROGRESS_BAR_PLAYHEAD_POSITION
속성을 이 값으로 설정합니다.
- 콘텐츠를 재생하는 경우 나머지 청취자에게 이벤트가 전파되도록 합니다.
- 광고를 재생하는 경우, 광고의 전파를 중지합니다.
EventType.PROGRESS
이벤트를 발생시키고EventType.AD_PROGRESS
동일한 속성을 가진
3. 마지막으로, 모든 리스너가 SSAIEventType.AD_DATA_READY
가 방출되거나 @Default
주석은 EventType.PROGRESS
이벤트.
왜냐하면 EventType.PROGRESS
가 처리될 때 리스너를 추가하는 시점에 따라 예상되는 값을 얻지 못할 수 있습니다. 예를 들어 EventType.PROGRESS
리스너 앞에 SSAIEventType.AD_DATA_READY
가 방출되면 리스너가 SSAI 플러그인에 의해 처리되기 전에 호출되므로 리스너가 Event.PROGRESS_BAR_PLAYHEAD_POSITION
값입니다.
참고: 이것은 이전 버전에서도 발생하지만 대신
Event.PROGRESS_BAR_PLAYHEAD_POSITION
값, 즉Event.PLAYHEAD_POSITION
는 예상되는 상대 재생 헤드 위치 대신 절대 재생 헤드 위치를 갖습니다(다시 말하지만, 이전 버전용입니다).참고: 이 문제는
EventType.AD_PROGRESS
이벤트.
이러한 상황이 발생할 경우 시도해 볼 수 있는 몇 가지 방법이 있습니다:
- 추가
@Default
주석을 추가할 수 있습니다. - 다음에 리스너를 추가하세요.
SSAIEventType.AD_DATA_READY
가 방출됩니다.
추가 @DEFAULT
리스너에게 주석 달기
내부적으로 특정 청취자에게는 @Default
어노테이션을 추가합니다. 이렇게 하면 모든 기본 주석이 있는 리스너가 기본 주석이 없는 모든 리스너가 먼저 호출될 때까지 기다렸다가 기본 주석이 있는 리스너를 호출합니다.
이 어노테이션을 추가하면 EventType.PROGRESS
리스너를 사용하면 기본값이 아닌 SSAI 플러그인인 EventType.PROGRESS
리스너가 이벤트를 처리합니다. 한 가지 주의할 점은 이 동작이 SSAI 플러그인 EventType.PROGRESS
리스너에 주석이 달린 @Default
주석을 추가할 예정입니다(현재로서는 그렇게 될 것으로 예상하지 않습니다).
예제는 다음과 같습니다:
eventEmitter.on(EventType.PROGRESS, new EventListener() {
@Default
@Override
public void processEvent(Event event) {
int absolutePlayheadPosition = event.getIntegerProperty(Event.PLAYHEAD_POSITION);
int relativePlayheadPosition = event.getIntegerProperty(Event.PROGRESS_BAR_PLAYHEAD_POSITION);
}
});
다음에 리스너를 추가합니다. SSAIEVENTTYPE.AD_DATA_READY
방출됨
또는 청취자를 추가하는 방법은 SSAIEventType.AD_DATA_READY
이벤트가 발생하면 SSAI 플러그인이 이벤트를 처리할 기회를 얻은 후에 리스너가 호출되도록 보장합니다.
예제는 다음과 같습니다:
eventEmitter.once(SSAIEventType.AD_DATA_READY, adDataReady -> {
eventEmitter.on(EventType.PROGRESS, progressEvent -> {
int absolutePlayheadPosition = progressEvent.getIntegerProperty(Event.PLAYHEAD_POSITION);
int relativePlayheadPosition = progressEvent.getIntegerProperty(Event.PROGRESS_BAR_PLAYHEAD_POSITION);
});
});
한 가지 주의할 점이 있습니다. 이후 SSAIEventType.AD_DATA_READY
이벤트가 SSAI 동영상(라이브 및 VOD)이 열릴 때마다 발생하므로 추가하지 않았는지 확인해야 합니다. EventType.``PROGRESS
리스너를 여러 번 클릭합니다.
이를 방지하는 한 가지 방법은 추가할 때 토큰을 저장하는 것입니다. EventType.PROGRESS
이벤트 리스너를 이벤트 이미터에 추가하고 매번 이벤트 리스너를 제거할 때마다 SSAIEventType.AD_DATA_READY
이벤트. 예를 들어
// Declare member variable
private int mCurrentProgressToken = -1;
// Code called every time a SSAI video is processed with the SSAI plugin
eventEmitter.once(SSAIEventType.AD_DATA_READY, adDataReady -> {
if (mCurrentProgressToken != -1) {
eventEmitter.off(EventType.PROGRESS, mCurrentProgressToken);
}
mCurrentProgressToken = eventEmitter.on(EventType.PROGRESS, progressEvent -> {
int absolutePlayheadPosition = progressEvent.getIntegerProperty(Event.PLAYHEAD_POSITION);
int relativePlayheadPosition = progressEvent.getIntegerProperty(Event.PROGRESS_BAR_PLAYHEAD_POSITION);
});
});
요약
SSAI 플러그인 6.9.0은 라이브 SSAI를 지원하기 위해 많은 작업을 수행합니다. 라이브 SSAI 스트림 재생을 시작하는 데 사용되는 플러그인 API는 VOD SSAI와 비교해 크게 달라진 점이 없습니다. 어려운 부분은 라이브 SSAI 스트림을 설정하고 올바른 광고 설정 ID를 식별하여 HttpRequestConfig
를 입력하세요.
잠재적으로 깨질 수 있는 변경 사항이 있으므로 주의해야 하지만, 영향을 받는지 확인하면 코드를 수정하는 것은 매우 간단합니다. 그리고 EventType.PROGRESS
이벤트를 추가할 때는 진행 리스너를 추가할 때 특별히 주의를 기울여야 하며 예상되는 값을 얻고 있는지 확인해야 합니다.