Get started with the IMA DAI SDK

IMA SDKs make it easy to integrate multimedia ads into your websites and apps. IMA SDKs can request ads from any VAST-compliant ad server and manage ad playback in your apps. With IMA DAI SDKs, apps make a stream request for ad and content video—either VOD or live content. The SDK then returns a combined video stream, so that you don't have to manage switching between ad and content video within your app.

Select the DAI solution you're interested in

Pod serving DAI

This guide demonstrates how to play a DAI Pod Serving live or VOD stream, using the IMA DAI SDK for iOS with a simple video player. If you would like to follow along with a completed sample, download the pod serving example.

IMA DAI Pod Serving overview

Implementing pod serving using the IMA DAI SDK for iOS involves two main components:

  • StreamRequest: An object that defines a stream request to Google's advertising servers. Must be created using either IMAPodStreamRequest or IMAPodVODStreamRequest to enable pod serving. These methods require a Network Code, and IMAPodStreamRequest also requires a Custom Asset Key, and an optional API key.

  • IMAStreamManager: An object that handles communication between the video stream and the IMA DAI SDK, such as firing tracking pings and forwarding stream events to the publisher.

Prerequisites

Before you begin, you need the following:

  • Xcode 13 or later.
  • CocoaPods (preferred), Swift Package Manager, or a downloaded copy of the IMA SDK for iOS.
  • An iOS app already set up with the IMA DAI SDK to play video streams with DAI ads. If you don't already have such an app, we recommend using the iOS DAI BasicExample as a starting point. The BasicExample has the codebase referenced in this guide. For more information about how to implement the IMA DAI SDK, see the Quick Start Guide.

Set up your pod serving variables

All changes needed for pod serving are done in ViewController.swift in swift or ViewController.m in Objective-C. The snippets in this guide default to using the Swift language. The first step is to update the constant variables.

Here are the ad pod stream request constants to be added:

  • STREAM_URL: Only used for Livestreams - The video stream URL provided by your manifest manipulator or third-party partner using pod serving. It should require you to insert the stream ID provided by the IMA DAI SDK, before you make a request. In this case, the stream URL includes a placeholder, "[[STREAMID]]", which is replaced with the stream ID, before making a request.
  • NETWORK_CODE: The network code for your Ad Manager 360 account.
  • CUSTOM_ASSET_KEY: Only used for Livestreams - The custom asset key that identifies your pod serving event in Ad Manager 360. This can be created by your manifest manipulator or 3rd party pod serving partner.
  • API_KEY: Only used for Livestreams - An optional API key that can be required to retrieve a stream ID from the IMA DAI SDK.

Change the example's variable section to match the following:

...
class ViewController:
  UIViewController,
  IMAAdsLoaderDelegate,
  IMAStreamManagerDelegate,
  AVPlayerViewControllerDelegate
{
  static let streamUrl =
    "https://encodersim.sandbox.google.com/masterPlaylist/9c654d63-5373-4673-8c8d-6d92b66b9d46/master.m3u8?gen-seg-redirect=true&network=51636543&event=google-sample&pids=devrel4628000,devrel896000,devrel3528000,devrel1428000,devrel2628000,devrel1928000&seg-host=dai.google.com&stream_id=[[STREAMID]]"
  static let networkCode = "51636543"
  static let customAssetKey = "google-sample"
  static let APIKey = ""
  static let backupStreamURLString =
    "http://googleimadev-vh.akamaihd.net/i/big_buck_bunny/bbb-,480p,720p,1080p,.mov.csmil/master.m3u8"

  var adsLoader: IMAAdsLoader?
  ...

Create either a live or VOD pod stream request

Live stream pod serving

Modify the requestStream method to create a live Pod Stream request by instantiating IMAPodStreamRequest.

  ...

  func requestStream() {
    guard let playerViewController = self.playerViewController else return
    guard let adContainerView = self.adContainerView else return
    guard let adsLoader = self.adsLoader else return

    self.videoDisplay = IMAAVPlayerVideoDisplay(avPlayer: playerViewController.player)
    adDisplayContainer = IMAAdDisplayContainer(
      adContainer: adContainerView, viewController: self)

    // Create a podserving stream request.
    request = IMAPodStreamRequest(
      networkCode: self.networkCode,
      customAssetKey: self.customAssetKey,
      adDisplayContainer: adDisplayContainer,
      videoDisplay: self.videoDisplay,
      userContext: nil)

    adsLoader.requestStream(with: request)
  }

  ...

VOD stream pod serving

Modify the requestStream method to create a VOD Pod Stream request by instantiating IMAPodVODStreamRequest.

  ...

  func requestStream() {
    guard let playerViewController = self.playerViewController else return
    guard let adContainerView = self.adContainerView else return
    guard let adsLoader = self.adsLoader else return

    self.videoDisplay = IMAAVPlayerVideoDisplay(avPlayer: playerViewController.player)
    adDisplayContainer = IMAAdDisplayContainer(
      adContainer: adContainerView, viewController: self)

    // Create a podserving stream request.
    request = IMAPodVODStreamRequest(
      networkCode: self.networkCode,
      adDisplayContainer: adDisplayContainer,
      videoDisplay: self.videoDisplay,
      userContext: nil)

    adsLoader.requestStream(with: request)
  }

  ...

Edit and set the stream URL

Live stream pod serving

Modify the IMAAdsLoaderDelegate methods, using streamManager.streamId to get the stream ID. Then insert the stream ID into the STREAM_URL, replacing "[[STREAMID]]". Once this change has been made, the new stream URL can be set using videoDisplay.loadStream().

  ...

  // MARK: - IMAAdsLoaderDelegate

  func adsLoader(_ loader: IMAAdsLoader!, adsLoadedWith adsLoadedData: IMAAdsLoadedData!) {
    let streamManager = adsLoadedData.streamManager
    let streamId = streamManager.streamId
    let urlString = streamUrl.replacingOccurrences(of: "[[STREAMID]]", with: streamId)
    let loadedStreamUrl = URL(string:urlString)
    self.videoDisplay.loadStream(loadedStreamUrl, subtitles:@[])
    self.videoDisplay.play()
    streamManager.delegate = self
    streamManager.initialize(with: nil)
    self.streamManager = streamManager
  }

  ...

VOD stream pod serving

Modify the IMAAdsLoaderDelegate methods, using streamManager.streamId to get the stream ID. Then, request a stream URL from your video technology partner (VTP). Then call IMAStreamManager.loadThirdPartyStream() to have IMA load the stream URL and any subtitles returned by your TVP.

  ...

  // MARK: - IMAAdsLoaderDelegate

  func adsLoader(_ loader: IMAAdsLoader!, adsLoadedWith adsLoadedData: IMAAdsLoadedData!) {
    let streamManager = adsLoadedData.streamManager
    let streamId = streamManager.streamId
    // 'vtpInterface' is a place holder for your own video technology partner
    // (VTP) API calls.
    let streamUrl = vtpInterface.requestStreamURL(streamID)
    self.streamManager = streamManager
    self.streamManager.initialize(with: nil)
    self.streamManager.loadThirdPartyStream(streamUrl, streamSubtitles:@[])
  }

  ...

  // MARK: - IMAStreamManagerDelegate
  func streamManager(_ streamManager: IMAStreamManager!, didReceive event: IMAAdEvent!) {
    print("StreamManager event \(event.typeString!).")
    switch event.type {
    case IMAAdEventType.LOADED:
      self.videoDisplay.play()
      self.streamManager.delegate = self
      self.streamManager.initialize(with: nil)
    case IMAAdEventType.STREAM_STARTED:

  ...

That's it! You're now requesting and displaying ads in a pod serving stream with the IMA DAI SDK for iOS. To see other examples of the IMA DAI SDK being used, look to the samples on GitHub.