Back to Bidding-Only Integration
Ads within video content are often called ‘in-stream’ video ads. See the IAB’s format guidelines for more information and the precise definition.
Integration example:
private fun createAd() {
// 1. Create VideoAdUnit
adUnit = InStreamVideoAdUnit(CONFIG_ID, WIDTH, HEIGHT)
// 2. Configure video parameters
adUnit?.videoParameters = configureVideoParameters()
// 3. Init player view
playerView = PlayerView(this)
val params = ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 600)
adWrapperView.addView(playerView, params)
// 4. Make a bid request to Prebid Server
adUnit?.fetchDemand { _: ResultCode?, keysMap: Map<String?, String?>? ->
// 5. Prepare the creative URI
val sizes = HashSet<AdSize>()
sizes.add(AdSize(WIDTH, HEIGHT))
val prebidURL = Util.generateInstreamUriForGam(
AD_UNIT_ID,
sizes,
keysMap
)
adsUri = Uri.parse(prebidURL)
// 6. Init player
initializePlayer()
}
}
Starting from PrebidMobile 2.1.0
the VideoAdUnit
class is deprecated. Use InStreamVideoAdUnit
instead.
Configure the video ad:
private fun configureVideoParameters(): VideoParameters {
return VideoParameters(listOf("video/x-flv", "video/mp4")).apply {
placement = Signals.Placement.InStream
api = listOf(
Signals.Api.VPAID_1,
Signals.Api.VPAID_2
)
maxBitrate = 1500
minBitrate = 300
maxDuration = 30
minDuration = 5
playbackMethod = listOf(Signals.PlaybackMethod.AutoPlaySoundOn)
protocols = listOf(
Signals.Protocols.VAST_2_0
)
}
}
Init and run IMA player:
private fun initializePlayer() {
adsLoader = ImaAdsLoader.Builder(this).build()
val playerBuilder = SimpleExoPlayer.Builder(this)
player = playerBuilder.build()
playerView!!.player = player
adsLoader!!.setPlayer(player)
val uri = Uri.parse("https://storage.googleapis.com/gvabox/media/samples/stock.mp4")
val mediaItem = MediaItem.fromUri(uri)
val dataSourceFactory: DataSource.Factory = DefaultDataSourceFactory(this, getString(R.string.app_name))
val mediaSourceFactory = ProgressiveMediaSource.Factory(dataSourceFactory)
val mediaSource: MediaSource = mediaSourceFactory.createMediaSource(mediaItem)
val dataSpec = DataSpec(adsUri!!)
val adsMediaSource = AdsMediaSource(
mediaSource, dataSpec, "ad", mediaSourceFactory,
adsLoader!!, playerView!!
)
player?.setMediaSource(adsMediaSource)
player?.playWhenReady = true
player?.prepare()
}
Initialize the VideoAdUnit with the following properties:
configId
- an ID of Stored Impression on the Prebid Serverwidth
- Width of the video ad unit.height
- Height of the video ad unitUsing the VideoParameters
object you can customize the bid request for video ads.
Not needed for Instream video integration, which uses placement=1 and plcmt=1.
The OpenRTB 2.6 Placement Type for the auction can be expressed as an integer array or you can use an enum for easier readability.
2
or InBanner
: In-Banner placement exists within a web banner that leverages the banner space to deliver a video experience as opposed to another static or rich media format. The format relies on the existence of display ad inventory on the page for its delivery.3
or InArticle
: In-Article placement loads and plays dynamically between paragraphs of editorial content; existing as a standalone branded message.4
or InFeed
: In-Feed placement is found in content, social, or product feeds.5
or Slider
, Floating
or Interstitial
: Open RTB supports one of three values for option 5 as either Slider, Floating or Interstitial. If an enum value is supplied in placement, bidders will receive value 5 for placement type and assume to be interstitial with the instl flag set to 1.Notes:
The api
property is dedicated to adding values for API Frameworks to bid response according to the OpenRTB 2.6 spec. The supported values for GMA SDK integration are:
1
or Signals.Api.VPAID_1
: VPAID 1.02
or Signals.Api.VPAID_2
: VPAID 2.03
or Signals.Api.MRAID_1
: MRAID-1 support signal5
or Signals.Api.MRAID_2
: MRAID-2 support signal6
or Signals.Api.MRAID_3
: MRAID-3 support signal7
or Signals.Api.OMID_1
: signals OMSDK supportInteger representing the OpenRTB 2.6 maximum bit rate in Kbps.
Integer representing the OpenRTB 2.6 minimum bit rate in Kbps.
Integer representing the OpenRTB 2.6 maximum video ad duration in seconds.
Integer representing the OpenRTB 2.6 minimum video ad duration in seconds.
Array of strings representing the supported OpenRTB 2.6 content MIME types (e.g., “video/x-ms-wmv”, “video/mp4”). Required property.
Array of OpenRTB 2.6 playback methods. If none are specified, any method may be used. Only one method is typically used in practice. It is strongly advised to use only the first element of the array.
1
or Signals.PlaybackMethod.AutoPlaySoundOn
: Initiates on Page Load with Sound On2
or Signals.PlaybackMethod.AutoPlaySoundOff
: Initiates on Page Load with Sound Off by Default3
or Signals.PlaybackMethod.ClickToPlay
: Initiates on Click with Sound On4
or Signals.PlaybackMethod.MouseOver
: Initiates on Mouse-Over with Sound On5
or Signals.PlaybackMethod.EnterSoundOn
: Initiates on Entering Viewport with Sound On6
or Signals.PlaybackMethod.EnterSoundOff
: Initiates on Entering Viewport with Sound Off by DefaultArray or enum of OpenRTB 2.6 supported Protocols. Values can be one of:
1
or Signals.Protocols.VAST_1_0
: VAST 1.02
or Signals.Protocols.VAST_2_0
: VAST 2.03
or Signals.Protocols.VAST_3_0
: VAST 3.04
or Signals.Protocols.VAST_1_0_Wrapper
: VAST 1.0 Wrapper5
or Signals.Protocols.VAST_2_0_Wrapper
: VAST 2.0 Wrapper6
or Signals.Protocols.VAST_3_0_Wrapper
: VAST 3.0 Wrapper7
or Signals.Protocols.VAST_4_0
: VAST 4.08
or Signals.Protocols.VAST_4_0_Wrapper
: VAST 4.0 WrapperCreate the instance of PlayerView
and display it in the app UI.
The fetchDemand
method makes a bid request to the Prebid Server. Use the methods which return the targeting map in the result closure.
Using Prebid util method, generate Google IMA URI for downloading the cached creative from the winning bid.
Follow the Google Guide for integrating IMA with ExoPlayer to run a video and show instream ad from the winning bid.