시작하기

IMA SDK를 사용하면 멀티미디어 광고를 웹사이트와 앱에 쉽게 통합할 수 있습니다. IMA SDK는 VAST 호환 광고 서버에서 광고를 요청하고 앱에서 광고 재생을 관리할 수 있습니다. IMA 클라이언트 측 SDK를 사용하면 SDK가 광고 재생을 처리하는 동안 콘텐츠 동영상 재생은 계속 제어할 수 있습니다. 광고는 앱의 콘텐츠 동영상 플레이어 상단에 위치한 별도의 동영상 플레이어에서 재생됩니다.

이 가이드에서는 IMA SDK를 간단한 동영상 플레이어 앱에 통합하는 방법을 설명합니다. 완료된 샘플 통합을 확인하거나 예시를 살펴보려면 GitHub에서 간단한 예를 다운로드하세요. SDK가 사전 통합된 HTML5 플레이어에 관심이 있는 경우 Video.js용 IMA SDK 플러그인을 확인하세요.

IMA 클라이언트 측 개요

IMA 클라이언트 측 구현에는 이 가이드에 설명된 네 가지 주요 SDK 구성요소가 포함됩니다.

  • AdDisplayContainer: 광고가 렌더링되는 컨테이너 객체입니다.
  • AdsLoader: 광고를 요청하고 광고 요청 응답에서 발생한 이벤트를 처리하는 객체입니다. 애플리케이션의 수명 주기 내내 재사용할 수 있는 하나의 광고 로더만 인스턴스화해야 합니다.
  • AdsRequest: 광고 요청을 정의하는 객체입니다. 광고 요청은 VAST 광고 태그의 URL 및 광고 측정기준과 같은 추가 매개변수를 지정합니다.
  • AdsManager: 광고 요청에 대한 응답을 포함하고 광고 재생을 제어하며 SDK에서 시작한 광고 이벤트를 리슨하는 객체입니다.

기본 요건

시작하기 전에 다음이 필요합니다.

  • 빈 파일 3개:
    • index.html
    • style.css
    • ads.js
  • 컴퓨터에 설치된 Python 또는 테스트에 사용할 웹 서버

1. 개발 서버 시작하기

IMA SDK는 로드된 페이지와 동일한 프로토콜을 통해 종속 항목을 로드하므로 웹 서버를 사용하여 앱을 테스트해야 합니다. 로컬 개발 서버를 시작하는 가장 간단한 방법은 Python의 내장 서버를 사용하는 것입니다.

  1. index.html 파일이 있는 디렉터리에서 명령줄을 사용하여 다음을 실행합니다.
      python -m http.server 8000
    
  2. 웹브라우저에서 http://localhost:8000/으로 이동합니다.

Apache HTTP 서버와 같은 기타 웹 서버도 사용할 수 있습니다.

2. 간단한 동영상 플레이어 만들기

먼저 index.html을 수정하여 래핑 요소에 포함된 간단한 HTML5 동영상 요소와 재생을 트리거하는 버튼을 만듭니다. 또한 style.cssads.js 파일을 로드하는 데 필요한 태그를 추가합니다. 그런 다음 styles.css를 수정하여 동영상 플레이어가 휴대기기에 맞게 반응하도록 만듭니다. 마지막으로 ads.js에서 재생 버튼을 클릭하면 동영상 재생이 트리거됩니다.

index.html

<!doctype html>
<html lang="en">
  <head>
    <title>IMA HTML5 Simple Demo</title>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <link rel="stylesheet" href="style.css">
  </head>
  <body>
    <div id="page-content">
      <div id="video-container">
        <video id="video-element">
          <source src="https://storage.googleapis.com/interactive-media-ads/media/android.mp4">
          <source src="https://storage.googleapis.com/interactive-media-ads/media/android.webm">
        </video>
      </div>
      <button id="play-button">Play</button>
    </div>
    <script src="ads.js"></script>
  </body>
</html>

style.css
#page-content {
  position: relative;
  /* this element's width controls the effective height */
  /* of the video container's padding-bottom */
  max-width: 640px;
  margin: 10px auto;
}

#video-container {
  position: relative;
  /* forces the container to match a 16x9 aspect ratio */
  /* replace with 75% for a 4:3 aspect ratio, if needed */
  padding-bottom: 56.25%;
}

#video-element {
  /* forces the contents to fill the container */
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
}
ads.js
var videoElement;

// On window load, attach an event to the play button click
// that triggers playback on the video element
window.addEventListener('load', function(event) {
  videoElement = document.getElementById('video-element');
  var playButton = document.getElementById('play-button');
  playButton.addEventListener('click', function(event) {
    videoElement.play();
  });
});

이 단계를 완료한 후 브라우저에서 index.html을 열면 (개발 서버를 통해) 동영상 요소가 표시되며 재생 버튼을 클릭하면 동영상이 시작됩니다.

3. IMA SDK 가져오기

그런 다음 index.html의 스크립트 태그를 사용하여 ads.js 태그 앞에 IMA 프레임워크를 추가합니다.

index.html
...

        </video>
      </div>
      <button id="play-button">Play</button>
    </div>
    <script src="//imasdk.googleapis.com/js/sdkloader/ima3.js"></script>
    <script src="ads.js"></script>
  </body>
</html>

4. 페이지 및 동영상 플레이어 핸들러 연결

자바스크립트로 동영상 플레이어의 동작을 수정하려면 다음 작업을 트리거하는 이벤트 핸들러를 추가합니다.

  • 페이지 로드가 완료되면 IMA SDK를 초기화합니다.
  • 동영상 재생 버튼을 클릭하면 광고를 로드합니다 (이미 로드된 광고가 있는 경우 제외).
  • 브라우저 창 크기를 조절하면 페이지가 휴대기기에 맞게 반응하도록 동영상 요소와 adsManager 크기를 업데이트합니다.
ads.js
var videoElement;
// Define a variable to track whether there are ads loaded and initially set it to false
var adsLoaded = false;

window.addEventListener('load', function(event) {
  videoElement = document.getElementById('video-element');
  initializeIMA();
  videoElement.addEventListener('play', function(event) {
    loadAds(event);
  });
  var playButton = document.getElementById('play-button');
  playButton.addEventListener('click', function(event) {
    videoElement.play();
  });
});

window.addEventListener('resize', function(event) {
  console.log("window resized");
});

function initializeIMA() {
  console.log("initializing IMA");
}

function loadAds(event) {
  // Prevent this function from running on if there are already ads loaded
  if(adsLoaded) {
    return;
  }
  adsLoaded = true;

  // Prevent triggering immediate playback when ads are loading
  event.preventDefault();

  console.log("loading ads");
}

5. 광고 컨테이너 만들기

대부분의 브라우저에서 IMA SDK는 광고와 광고 관련 UI 요소를 모두 표시하기 위해 전용 광고 컨테이너 요소를 사용합니다. 이 컨테이너는 왼쪽 상단에서 동영상 요소를 오버레이하도록 크기가 설정되어야 합니다. 이 컨테이너에 배치된 광고의 높이와 너비는 adsManager 객체에 의해 설정되므로 이러한 값을 수동으로 설정할 필요가 없습니다.

이 광고 컨테이너 요소를 구현하려면 먼저 video-container 요소 내에 새 div를 만듭니다. 그런 다음 요소를 video-element의 왼쪽 상단에 배치하도록 CSS를 업데이트합니다. 마지막으로, 페이지가 로드될 때 실행되는 initializeIMA() 함수 내에서 컨테이너의 변수를 정의합니다.

index.html
...

  <div id="video-container">
    <video id="video-element" controls>
      <source src="https://storage.googleapis.com/interactive-media-ads/media/android.mp4">
      <source src="https://storage.googleapis.com/interactive-media-ads/media/android.webm">
    </video>
    <div id="ad-container"></div>
  </div>

...
style.css
...

#ad-container {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
}
ads.js
var videoElement;
var adsLoaded = false;
var adContainer;

...

function initializeIMA() {
  console.log("initializing IMA");
  adContainer = document.getElementById('ad-container');
}

6. AdsLoader 초기화 및 광고 요청

광고 세트를 요청하려면 ima.AdsLoader 인스턴스를 만듭니다. 이 인스턴스는 AdDisplayContainer 객체를 입력으로 취하며, 지정된 광고 태그 URL과 연결된 ima.AdsRequest 객체를 처리하는 데 사용할 수 있습니다. 이 예에서 사용되는 광고 태그에는 10초의 프리롤 광고가 포함됩니다. IMA 동영상 제품군 검사기를 사용하여 이 URL 또는 광고 태그 URL을 테스트할 수 있습니다.

페이지의 전체 수명 주기 동안 ima.AdsLoader 인스턴스를 하나만 유지하는 것이 좋습니다. 추가 광고 요청을 하려면 새 ima.AdsRequest 객체를 만들되 동일한 ima.AdsLoader를 재사용하세요. 자세한 내용은 IMA SDK FAQ를 참조하세요.

ads.js
var videoElement;
var adsLoaded = false;
var adContainer;
var adDisplayContainer;
var adsLoader;

...

function initializeIMA() {
  console.log("initializing IMA");
  adContainer = document.getElementById('ad-container');
  adDisplayContainer = new google.ima.AdDisplayContainer(adContainer, videoElement);
  adsLoader = new google.ima.AdsLoader(adDisplayContainer);

  // Let the AdsLoader know when the video has ended
  videoElement.addEventListener('ended', function() {
    adsLoader.contentComplete();
  });

  var adsRequest = new google.ima.AdsRequest();
  adsRequest.adTagUrl = 'https://pubads.g.doubleclick.net/gampad/ads?' +
      'iu=/21775744923/external/single_ad_samples&sz=640x480&' +
      'cust_params=sample_ct%3Dlinear&ciu_szs=300x250%2C728x90&' +
      'gdfp_req=1&output=vast&unviewed_position_start=1&env=vp&impl=s&correlator=';

  // Specify the linear and nonlinear slot sizes. This helps the SDK to
  // select the correct creative if multiple are returned.
  adsRequest.linearAdSlotWidth = videoElement.clientWidth;
  adsRequest.linearAdSlotHeight = videoElement.clientHeight;
  adsRequest.nonLinearAdSlotWidth = videoElement.clientWidth;
  adsRequest.nonLinearAdSlotHeight = videoElement.clientHeight / 3;

  // Pass the request to the adsLoader to request ads
  adsLoader.requestAds(adsRequest);
}

7. AdsLoader 이벤트 수신 대기

광고가 성공적으로 로드되면 ima.AdsLoader에서 ADS_MANAGER_LOADED 이벤트를 내보냅니다. 콜백에 전달된 이벤트를 파싱하여 AdsManager 객체를 초기화합니다. AdsManager는 광고 태그 URL에 대한 응답으로 정의된 대로 개별 광고를 로드합니다.

또한 로드 프로세스 중에 발생할 수 있는 모든 오류를 처리해야 합니다. 광고가 로드되지 않으면 사용자 환경을 방해하지 않도록 광고 없이 미디어가 계속 재생되는지 확인하세요.

ads.js
var videoElement;
var adsLoaded = false;
var adContainer;
var adDisplayContainer;
var adsLoader;
var adsManager;

...

function initializeIMA() {
  console.log("initializing IMA");
  adContainer = document.getElementById('ad-container');
  adDisplayContainer = new google.ima.AdDisplayContainer(adContainer, videoElement);
  adsLoader = new google.ima.AdsLoader(adDisplayContainer);
  adsLoader.addEventListener(
      google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,
      onAdsManagerLoaded,
      false);
  adsLoader.addEventListener(
      google.ima.AdErrorEvent.Type.AD_ERROR,
      onAdError,
      false);

...

function onAdsManagerLoaded(adsManagerLoadedEvent) {
  // Instantiate the AdsManager from the adsLoader response and pass it the video element
  adsManager = adsManagerLoadedEvent.getAdsManager(
      videoElement);
}

function onAdError(adErrorEvent) {
  // Handle the error logging.
  console.log(adErrorEvent.getError());
  if(adsManager) {
    adsManager.destroy();
  }
}

8. DVD 시작

광고 재생을 시작하려면 AdsManager를 시작해야 합니다. 모바일 브라우저를 완벽하게 지원하려면 사용자 상호작용으로 트리거되어야 합니다.

ads.js
...

function loadAds(event) {
  // prevent this function from running on every play event
  if(adsLoaded) {
    return;
  }
  adsLoaded = true;

  // prevent triggering immediate playback when ads are loading
  event.preventDefault();

  console.log("loading ads");

  // Initialize the container. Must be done via a user action on mobile devices.
  videoElement.load();
  adDisplayContainer.initialize();

  var width = videoElement.clientWidth;
  var height = videoElement.clientHeight;
  try {
    adsManager.init(width, height, google.ima.ViewMode.NORMAL);
    adsManager.start();
  } catch (adError) {
    // Play the video without ads, if an error occurs
    console.log("AdsManager could not be started");
    videoElement.play();
  }
}

...

9. kubectl을 반응형으로 만들기

동영상 플레이어 크기에 맞게 광고 크기가 동적으로 조정되도록 하려면 화면의 크기나 방향이 변경되는 경우 창 크기 조절 이벤트에서 adsManager.resize()를 호출해야 합니다.

ads.js
...

window.addEventListener('resize', function(event) {
  console.log("window resized");
  if(adsManager) {
    var width = videoElement.clientWidth;
    var height = videoElement.clientHeight;
    adsManager.resize(width, height, google.ima.ViewMode.NORMAL);
  }
});

...

10. DVD 이벤트 수신

AdsManager는 처리해야 하는 여러 이벤트도 실행합니다. 이러한 이벤트는 상태 변경을 추적하고, 콘텐츠 동영상에서 재생 및 일시중지를 트리거하고, 오류를 등록하는 데 사용됩니다.

오류 처리

AdsLoader용으로 생성된 오류 핸들러는 동일한 콜백 함수가 포함된 새 이벤트 핸들러를 추가하여 AdsManager의 오류 핸들러 역할을 할 수 있습니다.

ads.js
...

function onAdsManagerLoaded(adsManagerLoadedEvent) {
  adsManager = adsManagerLoadedEvent.getAdsManager(
      videoElement);

  adsManager.addEventListener(
      google.ima.AdErrorEvent.Type.AD_ERROR,
      onAdError);
}

...

재생 및 일시중지 이벤트 트리거

AdsManager에서 디스플레이 광고를 삽입할 준비가 되면 CONTENT_PAUSE_REQUESTED 이벤트를 실행합니다. 기본 동영상 플레이어에서 일시중지를 트리거하여 이 이벤트를 처리합니다. 마찬가지로 광고가 완료되면 AdsManager에서 CONTENT_RESUME_REQUESTED 이벤트를 실행합니다. 기본 콘텐츠 동영상에서 재생을 다시 시작하여 이 이벤트를 처리합니다.

ads.js
...

function onAdsManagerLoaded(adsManagerLoadedEvent) {
  adsManager = adsManagerLoadedEvent.getAdsManager(
      videoElement);

  adsManager.addEventListener(
      google.ima.AdErrorEvent.Type.AD_ERROR,
      onAdError);
  adsManager.addEventListener(
      google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED,
      onContentPauseRequested);
  adsManager.addEventListener(
      google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED,
      onContentResumeRequested);
}

...

function onContentPauseRequested() {
  videoElement.pause();
}

function onContentResumeRequested() {
  videoElement.play();
}

휴대기기에서 클릭하여 일시중지 트리거

AdContainer가 동영상 요소를 오버레이하므로 사용자가 기본 플레이어와 직접 상호작용할 수 없습니다. 따라서 동영상 플레이어를 탭하여 재생을 일시중지할 수 있기를 기대하는 휴대기기 사용자에게 혼란을 줄 수 있습니다. 이 문제를 해결하기 위해 IMA SDK는 IMA에서 처리하지 않는 모든 클릭을 광고 오버레이에서 AdContainer 요소로 전달하여 처리할 수 있습니다. 광고를 클릭하면 클릭연결 링크가 열리므로 모바일 외 브라우저의 선형 광고에는 적용되지 않습니다.

클릭하여 일시중지를 구현하려면 AdContainer에 클릭 핸들러를 추가하고 기본 동영상에서 재생 또는 일시중지 이벤트를 트리거합니다.

ads.js
...

function initializeIMA() {
  console.log("initializing IMA");
  adContainer = document.getElementById('ad-container');
  adContainer.addEventListener('click', adContainerClick);
  adDisplayContainer = new google.ima.AdDisplayContainer(adContainer, videoElement);
  adsLoader = new google.ima.AdsLoader(adDisplayContainer);

...

function adContainerClick(event) {
  console.log("ad container clicked");
  if(videoElement.paused) {
    videoElement.play();
  } else {
    videoElement.pause();
  }
}

...

비선형 광고에서 재생 트리거

AdsManager는 광고를 재생할 준비가 되면 콘텐츠 동영상을 일시중지하지만, 이 동작은 광고가 표시되는 동안 콘텐츠가 계속 재생되어야 하는 비선형 광고는 고려하지 않습니다. 비선형 광고를 지원하려면 AdsManager를 수신 대기하여 LOADED 이벤트를 내보냅니다. 그런 다음 광고가 선형인지 확인하고 그렇지 않은 경우 동영상 요소에서 재생을 재개합니다.

ads.js
...

function onAdsManagerLoaded(adsManagerLoadedEvent) {
  adsManager = adsManagerLoadedEvent.getAdsManager(
      videoElement);

  adsManager.addEventListener(
      google.ima.AdErrorEvent.Type.AD_ERROR,
      onAdError);
  adsManager.addEventListener(
      google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED,
      onContentPauseRequested);
  adsManager.addEventListener(
      google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED,
      onContentResumeRequested);
  adsManager.addEventListener(
      google.ima.AdEvent.Type.LOADED,
      onAdLoaded);
}

...

function onAdLoaded(adEvent) {
  var ad = adEvent.getAd();
  if (!ad.isLinear()) {
    videoElement.play();
  }
}

이제 완료됐습니다. 이제 IMA SDK를 사용하여 광고를 요청하고 게재합니다. 고급 SDK 기능에 대한 자세한 내용은 다른 가이드 또는 GitHub의 샘플을 참조하세요.