Monetization with Ads
Shaka Player provides an API for serving ads to make monetization easier for apps. Our current API is tailored for our integration with the Interactive Media Ads SDKs, but we plan to extend our support to other ad providers in v3.1+. Please note that the current API is likely to undergo significant changes as our support extends.
AWS Elemental MediaTailor Integration
Shaka Player provides an integration with the AWS Elemental MediaTailor. We support Client Side, Server Side and overlays ad insertion.
All ad insertion experiences are available through the shaka.extern.IAdManager object on the Player.
If you’re not using Shaka’s UI library, you will also need to create a over your video element to serve as an ad container.
Start by initializing the server side logic. With Shaka UI:
const video = document.getElementById('video'); const ui = video['ui']; const controls = video.ui.getControls(); // If you're using a non-UI build, this is the div you'll need to create // for your layout. const container = controls.getServerSideAdContainer(); const player = controls.getPlayer(); const netEngine = player.getNetworkingEngine(); const adManager = player.getAdManager(); adManager.initMediaTailor(container, netEngine, video);
Requesting a Client Side stream:
const mediaTailorUrl = 'https://d305rncpy6ne2q.cloudfront.net/v1/session/94063eadf7d8c56e9e2edd84fdf897826a70d0df/SFP-MediaTailor-VOD-HLS-DASH/out/v1/b94f3611978f419985a18335bac9d9cb/ddb73bf548a44551a0059c346226445a/eaa5485198bf497284559efb8172425e/index.mpd'; const mediaTailorAdsParams = < adsParams: < assetid: 'test2', podduration: '15', >, >; const uri = await adManager.requestMediaTailorStream(mediaTailorUrl, mediaTailorAdsParams); player.load(uri);
Requesting a Server Side stream:
const mediaTailorUrl = 'https://ad391cc0d55b44c6a86d232548adc225.mediatailor.us-east-1.amazonaws.com/v1/session/d02fedbbc5a68596164208dd24e9b48aa60dadc7/singssai/master.m3u8'; const uri = await adManager.requestMediaTailorStream(mediaTailorUrl); player.load(uri);
Note: overlays ad insertions is the same as server side.
IMA SDK Integration
Shaka Player provides an integration with the Interactive Media Ads SDKs. We support both Client Side and Server Side ad insertion.
Both the Client Side and the Server Side ad insertion experiences are available through the shaka.extern.IAdManager object on the Player.
const adManager = player.getAdManager();
First, you’ll need to include the IMA SDK(s) on your HTML page:
Streaming with Client Side Ads Insertion
To integrate Client Side ads into a presentation, you need to have your ad tag URIs. If you’re not using Shaka’s UI library, you will also need to create a over your video element to serve as an ad container.
Start by initializing the client side logic. With Shaka UI:
const adManager = player.getAdManager(); const video = document.getElementById('video'); const ui = video['ui']; // If you're using a non-UI build, this is the div you'll need to create // for your layout. The ad manager will clear this div, when it unloads, so // don't pass in a div that contains non-ad elements. const container = video.ui.getControls().getClientSideAdContainer(); adManager.initClientSide(container, video);
With the client side logic initialized, you can request ads at any time during the presentation.
const adsRequest = new google.ima.AdsRequest(); // Your ad tag url should go here. We are using a sample ad tag from the // IMA HTML5 SDK implementation guide for this tutorial. adsRequest.adTagUrl = 'https://pubads.g.doubleclick.net/gampad/ads?' + 'sz=640x480&iu=/124319096/external/single_ad_samples&ciu_szs=300x250&' + 'impl=s&gdfp_req=1&env=vp&output=vast&unviewed_position_start=1&' + 'cust_params=deployment%3Ddevsite%26sample_ct%3Dlinear&correlator='; adManager.requestClientSideAds(adsRequest);
See: google.ima.AdsRequest for details on the request object.
Control the rendering of ads:
const adsRenderingSettings = new google.ima.AdsRenderingSettings(); adsRenderingSettings.restoreCustomPlaybackStateOnAdBreakComplete = true; adManager.initClientSide(container, video, adsRenderingSettings); // Updates the ads rendering settings. adManager.updateClientSideAdsRenderingSettings(adsRenderingSettings);
See: google.ima.AdsRenderingSettings for details on the request object.
Streaming with Server Side Ads Insertion
To integrate Server Side ads into a presentation, you need to have a Google Ad Manager account and host your streams on Google Ad Manager’s servers. To find out more about the Google Ad Manager service or sign up for an account, visit https://admanager.google.com/
If you’re not using Shaka’s UI library, you will also need to create a over your video element to serve as an ad container.
Start by initializing the server side logic. With Shaka UI:
const adManager = player.getAdManager(); const video = document.getElementById('video'); const ui = video['ui']; // If you're using a non-UI build, this is the div you'll need to create // for your layout. const container = video.ui.getControls().getServerSideAdContainer(); adManager.initServerSide(container, video);
With server side logic initialized, you can request and load streams with dynamically inserted ads.
Requesting a VOD stream:
const streamRequest = new google.ima.dai.api.VODStreamRequest(); // Your stream information will go here. We are using IMA's sample stream info // in this tutorial. streamRequest.contentSourceId = '2528370'; streamRequest.videoId = 'tears-of-steel'; const uri = await adManager.requestServerSideStream(streamRequest); player.load(uri);
shaka.extern.IAdManager.requestServerSideStream() returns a Promise with a manifest URI that points to a stream with ads inserted.
See google.ima.dai.api.VODStreamRequest for details on the request object.
Requesting a LIVE stream:
const streamRequest = new google.ima.dai.api.LiveStreamRequest(); // Your stream information will go here. We are using IMA's sample stream info // in this tutorial. streamRequest.assetKey = 'sN_IYUG8STe1ZzhIIE_ksA'; const uri = await adManager.requestServerSideStream(streamRequest); player.load(uri);
See: google.ima.dai.api.LiveStreamRequest for details on the request object.
If you are using Shaka’s UI library, we will automatically hook up our ad UI.
Listening To Ad Events
We unify Server Side and Client Side ad events into our own Shaka ad events and objects. which your application can listen to and interact with. Check out the full list of ad events for details.
Let’s register a simple listener to Shaka’s AD_STARTED event. It will log the start of the ad in the console.
adManager.addEventListener(shaka.ads.AdManager.AD_STARTED, () => < console.log('An ad has started'); >);
Every shaka ad event contains an original SDK event and an ad object if those are available. Most apps are unlikely to need them, but if you have a use case that requires access to those, here is how to get them:
// Note that unlike in the previous example, we are capturing the AD_STARTED // event object here (the "e" parameter of the lambda function) so we can access // its properties. adManager.addEventListener(shaka.ads.AdManager.AD_STARTED, (e) => < const sdkAdObject = e['sdkAdObject']; const originalEvent = e['originalEvent']; >);
Accommodating IMA Power Users
If you have an existing IMA integration you want to plug into Shaka, or you want to use more intricate SDK capabilities not exposed through our API, we provide a way to do that. Listen to the shaka.ads.AdManager#event:ImaAdManagerLoadedEvent for Client Side or the shaka.ads.AdManager#event:ImaStreamManagerLoadedEvent for Server Side to get the IMA AdManager or StreamManager objects.
adManager.addEventListener(shaka.ads.AdManager.IMA_AD_MANAGER_LOADED, (e) => < const imaAdManager = e['imaAdManager']; >); adManager.addEventListener(shaka.ads.AdManager.IMA_STREAM_MANAGER_LOADED, (e) => < const imaStreamManager = e['imaStreamManager']; >);
Disabling Cookies For Serving Limited Ads
The server side IMA SDK allows limited ads to be served when the user does not give or denies consent to cookies. To allow this, set the ltd parameter using StreamRequest.adTagParameters as described in the IMA limited ads guide. To set up cookie-less manifest and segment requests, use an appropriate requestFilter . Please note that request.withCredentials flag is false by default, so you should only need to set this if you’ve enabled it in other parts of your code.
player.getNetworkingEngine().registerRequestFilter(function(type, request, context) < if (type == shaka.net.NetworkingEngine.RequestType.MANIFEST || type == shaka.net.NetworkingEngine.RequestType.SEGMENT) < request.withCredentials = false; >>);
Custom Ad Manager Implementations
Our architecture supports custom ad manager implementations. Every ad manager should implement the shaka.extern.IAdManager interface. To make the player use a custom ad manager implementation, invoke the code to set it before instantiating the player.
// myapp.CustomAdManager is a placeholder name for your ad manager implementation. shaka.Player.setAdManagerFactory(() => new myapp.CustomAdManager());
Documentation generated by JSDoc 3.6.10 on Wed Jan 24 2024 11:13:52 GMT+0000 (Coordinated Universal Time)
astein / html5_ima_sdk_example.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
| // video DOM inside creative |
| // |
| // |
| // |
| // load IMA SDK at init load time |
| $ . getScript ( ‘//imasdk.googleapis.com/js/sdkloader/ima3.js’ ) ; |
| // usage: startVideo( /* vast tag url */ ); |
| // set width and height according to video size in creative |
| var VIDEO_WIDTH = 600 ; |
| var VIDEO_HEIGHT = 380 ; |
| var adsManager ; |
| var adsLoader ; |
| var adDisplayContainer ; |
| var intervalTimer ; |
| var videoContent = document . getElementById ( ‘videoContainer’ ) ; |
| function startVideo ( vast_tag ) |
| requestAds ( vast_tag ) ; |
| > |
| function createAdDisplayContainer ( ) |
| // We assume the adContainer is the DOM id of the element that will house |
| // the ads. |
| adDisplayContainer = |
| new google . ima . AdDisplayContainer ( |
| document . getElementById ( ‘adContainer’ ) , videoContent ) ; |
| > |
| function requestAds ( vast_tag ) |
| // Create the ad display container. |
| createAdDisplayContainer ( ) ; |
| // Initialize the container. Must be done via a user action on mobile devices. |
| adDisplayContainer . initialize ( ) ; |
| videoContent . load ( ) ; |
| // Create ads loader. |
| adsLoader = new google . ima . AdsLoader ( adDisplayContainer ) ; |
| // Set VPAID Mode to Enabled |
| adsLoader . getSettings ( ) . setVpaidMode ( google . ima . ImaSdkSettings . VpaidMode . ENABLED ) ; |
| adsLoader . getSettings ( ) . setVpaidMode ( google . ima . ImaSdkSettings . VpaidMode . INSECURE ) ; |
| // Listen and respond to ads loaded and error events. |
| adsLoader . addEventListener ( |
| google . ima . AdsManagerLoadedEvent . Type . ADS_MANAGER_LOADED , |
| onAdsManagerLoaded , |
| false ) ; |
| adsLoader . addEventListener ( |
| google . ima . AdErrorEvent . Type . AD_ERROR , |
| onAdError , |
| false ) ; |
| // Request video ads. |
| var adsRequest = new google . ima . AdsRequest ( ) ; |
| // autoplay ad |
| adsRequest . setAdWillAutoPlay ( true ) ; |
| adsRequest . adTagUrl = vast_tag ; |
| // Specify the linear and nonlinear slot sizes. This helps the SDK to |
| // select the correct creative if multiple are returned. |
| adsRequest . linearAdSlotWidth = VIDEO_WIDTH ; |
| adsRequest . linearAdSlotHeight = VIDEO_HEIGHT ; |
| adsRequest . nonLinearAdSlotWidth = VIDEO_WIDTH ; |
| adsRequest . nonLinearAdSlotHeight = VIDEO_HEIGHT ; |
| adsLoader . requestAds ( adsRequest ) ; |
| > |
| function onAdsManagerLoaded ( adsManagerLoadedEvent ) |
| // Get the ads manager. |
| var adsRenderingSettings = new google . ima . AdsRenderingSettings ( ) ; |
| adsRenderingSettings . restoreCustomPlaybackStateOnAdBreakComplete = true ; |
| adsRenderingSettings . bitrate = 1000 ; |
| // videoContent should be set to the content video element. |
| adsManager = adsManagerLoadedEvent . getAdsManager ( |
| videoContent , adsRenderingSettings ) ; |
| // Add listeners to the required events. |
| 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 . ALL_ADS_COMPLETED , |
| onAdEvent ) ; |
| adsManager . addEventListener ( |
| google . ima . AdEvent . Type . CLICK , |
| onAdEvent ) ; |
| // Listen to any additional events, if necessary. |
| adsManager . addEventListener ( |
| google . ima . AdEvent . Type . LOADED , |
| onAdEvent ) ; |
| adsManager . addEventListener ( |
| google . ima . AdEvent . Type . STARTED , |
| onAdEvent ) ; |
| adsManager . addEventListener ( |
| google . ima . AdEvent . Type . COMPLETE , |
| onAdEvent ) ; |
| adsManager . addEventListener ( |
| google . ima . AdEvent . Type . FIRST_QUARTILE , |
| onAdEvent ) ; |
| adsManager . addEventListener ( |
| google . ima . AdEvent . Type . MIDPOINT , |
| onAdEvent ) ; |
| adsManager . addEventListener ( |
| google . ima . AdEvent . Type . THIRD_QUARTILE , |
| onAdEvent ) ; |
| try |
| // Initialize the ads manager. Ad rules playlist will start at this time. |
| adsManager . init ( VIDEO_WIDTH , VIDEO_HEIGHT , google . ima . ViewMode . NORMAL ) ; |
| // Call play to start showing the ad. Single video and overlay ads will |
| // start at this time; the call will be ignored for ad rules. |
| adsManager . start ( ) ; |
| > catch ( adError ) |
| // An error may be thrown if there was a problem with the VAST response. |
| videoContent . play ( ) ; |
| > |
| > |
| function onAdEvent ( adEvent ) |
| // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED) |
| // don’t have ad object associated. |
| var ad = adEvent . getAd ( ) ; |
| switch ( adEvent . type ) |
| case google . ima . AdEvent . Type . LOADED : |
| // console.log(‘loaded’); |
| // This is the first event sent for an ad — it is possible to |
| // determine whether the ad is a video ad or an overlay. |
| if ( ! ad . isLinear ( ) ) |
| // Position AdDisplayContainer correctly for overlay. |
| // Use ad.width and ad.height. |
| videoContent . play ( ) ; |
| > |
| break ; |
| case google . ima . AdEvent . Type . STARTED : |
| // only hide the content element (video overlay) when ad starts. |
| $ ( ‘#contentElement’ ) . hide ( ) ; |
| TXM . api . track ( ‘multimedia’ , ‘video_started’ , ‘vast_video’ ) ; |
| // This event indicates the ad has started — the video player |
| // can adjust the UI, for example display a pause button and |
| // remaining time. |
| if ( ad . isLinear ( ) ) |
| // For a linear ad, a timer can be started to poll for |
| // the remaining time. |
| intervalTimer = setInterval ( |
| function ( ) |
| var remainingTime = adsManager . getRemainingTime ( ) ; |
| > , |
| 300 ) ; // every 300ms |
| > |
| break ; |
| case google . ima . AdEvent . Type . COMPLETE : |
| TXM . api . track ( ‘multimedia’ , ‘video_completed’ , ‘vast_video’ ) ; |
| if ( ad . isLinear ( ) ) |
| clearInterval ( intervalTimer ) ; |
| > |
| break ; |
| case google . ima . AdEvent . Type . ALL_ADS_COMPLETED : |
| break ; |
| case google . ima . AdEvent . Type . CLICK : |
| ( function ( ) |
| var prop ; |
| var currentAd = adEvent . getAd ( ) ; |
| var clickThroughUrl ; |
| // Clickthrough parameter is obfuscated in IMA3. We loopthrough the properties of the |
| // ad and search for a «clickThroughUrl» attribute. We track it if we find one. |
| for ( prop in ad ) |
| clickThroughUrl = ad [ prop ] . clickThroughUrl ; |
| if ( clickThroughUrl !== undefined && clickThroughUrl !== null ) |
| break ; |
| > |
| > |
| if ( clickThroughUrl ) |
| TXM . api . track ( ‘navigation’ , ‘external_page’ , ‘vast_clickthrough’ ) ; |
| > |
| > ( ) ) ; |
| break ; |
| // video quartile tracking |
| case google . ima . AdEvent . Type . FIRST_QUARTILE : |
| TXM . api . track ( ‘multimedia’ , ‘video_first_quartile’ , ‘vast_video’ ) ; |
| break ; |
| case google . ima . AdEvent . Type . MIDPOINT : |
| TXM . api . track ( ‘multimedia’ , ‘video_second_quartile’ , ‘vast_video’ ) ; |
| break ; |
| case google . ima . AdEvent . Type . THIRD_QUARTILE : |
| TXM . api . track ( ‘multimedia’ , ‘video_third_quartile’ , ‘vast_video’ ) ; |
| break ; |
| > |
| > |
| function onAdError ( adErrorEvent ) |
| adsManager . destroy ( ) ; |
| > |
| function onContentPauseRequested ( ) |
| videoContent . pause ( ) ; |
| > |
diglez commented Mar 25, 2020 •
Hi! I am trying to get a VAST tag to autoplay on page load.
I have this for my video content:
and I have set:
adsRequest.setAdWillAutoPlay(true);
but the ad is not autoplaying. I have tried removing and keeping playsinline, I have tried camel case and all lowercase for both playsinline and autoplay, I have tried to add muted, but nothing seems to work.
Any ideas on what it could be?
(this is a react app by the way, if that makes a difference)
Начало работы
Оптимизируйте свои подборки Сохраняйте и классифицируйте контент в соответствии со своими настройками.
IMA SDK упрощают интеграцию мультимедийной рекламы на ваши веб-сайты и приложения. IMA SDK могут запрашивать рекламу с любого рекламного сервера , совместимого с VAST, и управлять воспроизведением рекламы в ваших приложениях. С помощью клиентских SDK IMA вы сохраняете контроль над воспроизведением видеоконтента, а SDK управляет воспроизведением рекламы. Реклама воспроизводится в отдельном видеопроигрывателе, расположенном поверх видеопроигрывателя контента приложения.
В этом руководстве показано, как интегрировать IMA SDK в простое приложение видеоплеера. Если вы хотите просмотреть или проследить за завершенным примером интеграции, загрузите BasicExample с GitHub.
Примечание. Информацию об интеграции с другими платформами или использовании SDK IMA DAI см. в разделе SDK интерактивной медиарекламы .
Обзор клиентской части IMA
Реализация IMA на стороне клиента включает четыре основных компонента SDK, которые продемонстрированы в этом руководстве:
- IMAAdDisplayContainer : объект-контейнер, в котором отображаются объявления.
- IMAAdsLoader : объект, который запрашивает рекламу и обрабатывает события из ответов на запросы рекламы. Вам следует создать только один экземпляр загрузчика рекламы, который можно будет повторно использовать на протяжении всего срока службы приложения.
- IMAAdsRequest : объект, определяющий запрос объявления. В запросах объявлений указывается URL-адрес тега объявления VAST, а также дополнительные параметры, например размеры объявления.
- IMAAdsManager : объект, который содержит ответ на запрос рекламы, управляет воспроизведением рекламы и прослушивает рекламные события, запускаемые SDK.
Предварительные условия
Прежде чем начать, вам необходимо следующее:
- Xcode 13 или новее
- CocoaPods (предпочтительно), Swift Package Manager или загруженная копия IMA SDK для iOS.
1. Создайте новый проект Xcode.
В Xcode создайте новый проект iOS, используя Objective-C или Swift. Используйте BasicExample в качестве имени проекта.
2. Добавьте IMA SDK в проект Xcode.
Установите SDK с помощью CocoaPods (рекомендуется)
CocoaPods — это менеджер зависимостей для проектов Xcode, который рекомендуется использовать для установки IMA SDK. Дополнительную информацию об установке или использовании CocoaPods см. в документации CocoaPods . После установки CocoaPods используйте следующие инструкции для установки IMA SDK:
-
В том же каталоге, где находится файл BasicExample.xcodeproj , создайте текстовый файл с именем Podfile и добавьте следующую конфигурацию:
source 'https://github.com/CocoaPods/Specs.git' platform :ios, '14' target "BasicExample" do pod 'GoogleAds-IMA-iOS-SDK', '~> 3.19.1' end
Установите SDK с помощью диспетчера пакетов Swift.
SDK Interactive Media Ads поддерживает Swift Package Manager , начиная с версии 3.18.4. Выполните следующие действия, чтобы импортировать пакет Swift.
- В Xcode установите пакет IMA SDK Swift, выбрав «Файл» > «Добавить пакеты. » .
- В появившемся окне найдите репозиторий IMA SDK Swift Package GitHub:
https://github.com/googleads/swift-package-manager-google-interactive-media-ads-ios
Когда вы закончите, Xcode разрешит зависимости вашего пакета и загрузит их в фоновом режиме. Более подробную информацию о том, как добавить зависимости пакета, можно найти в статье Apple .
Загрузите и установите SDK вручную.
Если вы не хотите использовать Swift Package Manager или CocoaPods, вы можете загрузить IMA SDK и вручную добавить его в свой проект.
Показать/скрыть инструкции
- Со страницы загрузки iOS IMA загрузите и извлеките последнюю версию iOS IMA SDK.
- Откройте BasicExample.xcodeproj .
- На левой панели щелкните имя проекта.

- На центральной панели нажмите «Фазы сборки» .

- Разверните раздел «Связать двоичный файл с библиотеками» .
- Внизу списка библиотек щелкните значок плюса [+] .
- Нажмите «Добавить другое» .
- В каталоге, куда вы извлекли загруженный SDK, выберите GoogleInteractiveMediaAds.framework и нажмите «Открыть» .
- Внизу списка библиотек еще раз щелкните значок плюса [+] .
- Убедитесь, что в столбце «Статус» GoogleInteractiveMediaAds.framework установлено значение Required .
- Включите флаг компоновщика -ObjC в настройки сборки. Для получения дополнительной информации см. Apple QA1490 .
3. Создайте простой видеоплеер
Сначала реализуем базовый видеоплеер. Изначально этот проигрыватель не использует IMA SDK и еще не содержит методов запуска воспроизведения.
ViewController.m
Цель-C
#import "ViewController.h" #import NSString *const kContentURLString = @"https://storage.googleapis.com/interactive-media-ads/media/stock.mp4"; @interface ViewController () @property(nonatomic) AVPlayerViewController *contentPlayerViewController; @end @implementation ViewController - (void)viewDidLoad < [super viewDidLoad]; self.view.backgroundColor = UIColor.blackColor; [self setupContentPlayer]; >- (void)setupContentPlayer < // Create a content video player. NSURL *contentURL = [NSURL URLWithString:kContentURLString]; AVPlayer *player = [AVPlayer playerWithURL:contentURL]; self.contentPlayerViewController = [[AVPlayerViewController alloc] init]; self.contentPlayerViewController.player = player; self.contentPlayerViewController.view.frame = self.view.bounds; // Attach content video player to view hierarchy. [self showContentPlayer]; >// Add the content video player as a child view controller. - (void)showContentPlayer < [self addChildViewController:self.contentPlayerViewController]; self.contentPlayerViewController.view.frame = self.view.bounds; [self.view insertSubview:self.contentPlayerViewController.view atIndex:0]; [self.contentPlayerViewController didMoveToParentViewController:self]; >// Remove and detach the content video player. - (void)hideContentPlayer < // The whole controller needs to be detached so that it doesn't capture events from the remote. [self.contentPlayerViewController willMoveToParentViewController:nil]; [self.contentPlayerViewController.view removeFromSuperview]; [self.contentPlayerViewController removeFromParentViewController]; >@end
Быстрый
import AVFoundation import UIKit class ViewController: UIViewController < static let ContentURLString = "https://storage.googleapis.com/interactive-media-ads/media/stock.mp4" var playerViewController: AVPlayerViewController! override func viewDidLoad() < super.viewDidLoad() self.view.backgroundColor = UIColor.black setUpContentPlayer() >func setUpContentPlayer() < // Load AVPlayer with path to your content. let contentURL! = URL(string: ViewController.ContentURLString) let player = AVPlayer(url: contentURL) playerViewController = AVPlayerViewController() playerViewController.player = player showContentPlayer() >func showContentPlayer() < self.addChild(playerViewController) playerViewController.view.frame = self.view.bounds self.view.insertSubview(playerViewController.view, at: 0) playerViewController.didMove(toParent:self) >func hideContentPlayer() < // The whole controller needs to be detached so that it doesn't capture // events from the remote. playerViewController.willMove(toParent:nil) playerViewController.view.removeFromSuperview() playerViewController.removeFromParent() >>
4. Импортируйте IMA SDK.
Затем добавьте платформу IMA, используя оператор импорта под существующим импортом.
ViewController.m
Цель-C
#import "ViewController.h" #import #import NSString *const kContentURLString = @"https://storage.googleapis.com/interactive-media-ads/media/stock.mp4";
Быстрый
import AVFoundation import GoogleInteractiveMediaAds import UIKit class ViewController: UIViewController < static let ContentURLString = "https://storage.googleapis.com/interactive-media-ads/media/stock.mp4"
5. Внедрить трекер воспроизведения контента и наблюдатель конца потока.
Чтобы воспроизводить рекламу в середине ролика, IMA SDK должен отслеживать текущую позицию вашего видеоконтента. Для этого создайте класс, реализующий IMAContentPlayhead . Если вы используете AVPlayer , как показано в этом примере, SDK предоставляет класс IMAAVPlayerContentPlayhead , который сделает это за вас. Если вы не используете AVPlayer , вам необходимо реализовать IMAContentPlayhead в собственном классе.
Вам также необходимо сообщить SDK, когда воспроизведение вашего контента закончится, чтобы он мог отображать рекламу после ролика. Это делается путем вызова contentComplete в IMAAdsLoader с использованием AVPlayerItemDidPlayToEndTimeNotification .
ViewController.m
Цель-C
. @interface ViewController () @property(nonatomic) IMAAVPlayerContentPlayhead *contentPlayhead; @property(nonatomic) AVPlayerViewController *contentPlayerViewController; @end . - (void)setupContentPlayer < // Create a content video player. NSURL *contentURL = [NSURL URLWithString:kContentURLString]; AVPlayer *player = [AVPlayer playerWithURL:contentURL]; self.contentPlayerViewController = [[AVPlayerViewController alloc] init]; self.contentPlayerViewController.player = player; self.contentPlayerViewController.view.frame = self.view.bounds; self.contentPlayhead = [[IMAAVPlayerContentPlayhead alloc] initWithAVPlayer:self.contentPlayerViewController.player]; // Track end of content. AVPlayerItem *contentPlayerItem = self.contentPlayerViewController.player.currentItem; [NSNotificationCenter.defaultCenter addObserver:self selector:@selector(contentDidFinishPlaying:) name:AVPlayerItemDidPlayToEndTimeNotification object:contentPlayerItem]; // Attach content video player to view hierarchy. [self showContentPlayer]; > . - (void)contentDidFinishPlaying:(NSNotification *)notification <> - (void)dealloc @end
Быстрый
. class ViewController: UIViewController < static let ContentURLString = "https://storage.googleapis.com/interactive-media-ads/media/stock.mp4" var contentPlayhead: IMAAVPlayerContentPlayhead? var playerViewController: AVPlayerViewController! deinit < NotificationCenter.default.removeObserver(self) >. func setUpContentPlayer() < // Load AVPlayer with path to your content. let contentURL! = URL(string: ViewController.ContentURLString) let player = AVPlayer(url: contentURL) playerViewController = AVPlayerViewController() playerViewController.player = player // Set up your content playhead and contentComplete callback. contentPlayhead = IMAAVPlayerContentPlayhead(avPlayer: player) NotificationCenter.default.addObserver( self, selector: #selector(ViewController.contentDidFinishPlaying(_:)), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: player.currentItem) showContentPlayer() > . @objc func contentDidFinishPlaying(_ notification: Notification) >
6. Инициализируйте загрузчик рекламы и сделайте запрос рекламы.
Чтобы запросить набор объявлений, вам необходимо создать экземпляр IMAAdsLoader . Этот загрузчик можно использовать для обработки объектов IMAAdsRequest , связанных с указанным URL-адресом тега объявления.
Рекомендуется поддерживать только один экземпляр IMAAdsLoader на протяжении всего жизненного цикла вашего приложения. Чтобы сделать дополнительные запросы объявлений, создайте новый объект IMAAdsRequest , но повторно используйте тот же IMAAdsLoader . Дополнительную информацию см. в разделе Часто задаваемые вопросы по IMA SDK .
ViewController.m
Цель-C
. NSString *const kContentURLString = @"https://storage.googleapis.com/interactive-media-ads/media/stock.mp4"; NSString *const kAdTagURLString = @"https://pubads.g.doubleclick.net/gampad/ads?" @"iu=/21775744923/external/vmap_ad_samples&sz=640x480&" @"cust_params=sample_ar%3Dpremidpostlongpod&" @"ciu_szs=300x250&gdfp_req=1&ad_rule=1&output=vmap&unviewed_position_start=1&" @"env=vp&impl=s&cmsid=496&vid=short_onecue&correlator swift_3" data-text=" Быстрый" tabindex="-1"> Быстрый. class ViewController: UIViewController < static let ContentURLString = "https://storage.googleapis.com/interactive-media-ads/media/stock.mp4" static let AdTagURLString = "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 7_set_up_an_ads_loader_delegate" data-text=" 7. Настройте делегат загрузчика рекламы" tabindex="-1"> 7. Настройте делегат загрузчика рекламыВ случае успешного события загрузки
IMAAdsLoaderвызываетadsLoadedWithDataназначенного ему делегата, передавая ему экземплярIMAAdsManager. Затем вы можете инициализировать менеджер рекламы, который загружает отдельные объявления в соответствии с ответом на URL-адрес тега объявления.Кроме того, обязательно исправьте любые ошибки, которые могут возникнуть в процессе загрузки. Если реклама не загружается, убедитесь, что воспроизведение мультимедиа продолжается без рекламы, чтобы не мешать работе пользователя.
ViewController.m
Цель-C
. @interface ViewController () @property(nonatomic) IMAAdsLoader *adsLoader; @property(nonatomic) IMAAdsManager *adsManager; @property(nonatomic) IMAAVPlayerContentPlayhead *contentPlayhead; @property(nonatomic) AVPlayerViewController *contentPlayerViewController; @end @implementation ViewController . - (void)setupAdsLoader < self.adsLoader = [[IMAAdsLoader alloc] init]; self.adsLoader.delegate = self; > . #pragma mark - IMAAdsLoaderDelegate - (void)adsLoader:(IMAAdsLoader *)loader adsLoadedWithData:(IMAAdsLoadedData *)adsLoadedData < // Initialize and listen to the ads manager loaded for this request. self.adsManager = adsLoadedData.adsManager; [self.adsManager initializeWithAdsRenderingSettings:nil]; >- (void)adsLoader:(IMAAdsLoader *)loader failedWithErrorData:(IMAAdLoadingErrorData *)adErrorData < // Fall back to playing content. NSLog(@"Error loading ads: %@", adErrorData.adError.message); [self.contentPlayerViewController.player play]; > @endБыстрый
. class ViewController: UIViewController, IMAAdsLoaderDelegate < . var adsLoader: IMAAdsLoader! var adsManager: IMAAdsManager! var contentPlayhead: IMAAVPlayerContentPlayhead? var playerViewController: AVPlayerViewController! . func setUpAdsLoader() < adsLoader = IMAAdsLoader(settings: nil) adsLoader.delegate = self > . // MARK: - IMAAdsLoaderDelegate func adsLoader(_ loader: IMAAdsLoader!, adsLoadedWith adsLoadedData: IMAAdsLoadedData!) < adsManager = adsLoadedData.adsManager adsManager.initialize(with: nil) >func adsLoader(_ loader: IMAAdsLoader!, failedWith adErrorData: IMAAdLoadingErrorData!) >8. Настройте делегата менеджера по рекламе
Наконец, для управления событиями и изменениями состояния рекламному менеджеру нужен собственный делегат. IMAAdManagerDelegate имеет методы для обработки рекламных событий и ошибок, а также методы для запуска воспроизведения и приостановки вашего видеоконтента.
Начало воспроизведения
Существует множество событий, для обработки которых можно использовать метод didReceiveAdEvent , но в этом базовом примере просто прослушайте событие LOADED , чтобы сообщить менеджеру рекламы о необходимости начать воспроизведение контента и рекламы.
ViewController.m
Цель-C
@interface ViewController () IMAAdsManagerDelegate> . - (void)adsLoader:(IMAAdsLoader *)loader adsLoadedWithData:(IMAAdsLoadedData *)adsLoadedData < // Initialize and listen to the ads manager loaded for this request. self.adsManager = adsLoadedData.adsManager; self.adsManager.delegate = self; [self.adsManager initializeWithAdsRenderingSettings:nil]; > . #pragma mark - IMAAdsManagerDelegate - (void)adsManager:(IMAAdsManager *)adsManager didReceiveAdEvent:(IMAAdEvent *)event < // Play each ad once it has loaded. if (event.type == kIMAAdEvent_LOADED) < [adsManager start]; >> .Быстрый
. class ViewController: UIViewController, IMAAdsLoaderDelegate, IMAAdsManagerDelegate < . func adsLoader(_ loader: IMAAdsLoader!, adsLoadedWith adsLoadedData: IMAAdsLoadedData!) < // Grab the instance of the IMAAdsManager and set yourself as the delegate. adsManager = adsLoadedData.adsManager adsManager.delegate = self adsManager.initialize(with: nil) > . // MARK: - IMAAdsManagerDelegate func adsManager(_ adsManager: IMAAdsManager!, didReceive event: IMAAdEvent!) < // Play each ad once it has been loaded if event.type == IMAAdEventType.LOADED < adsManager.start() >> .Обработка ошибок
Также добавьте обработчик ошибок рекламы. Если возникла ошибка, как на предыдущем шаге, возобновите воспроизведение контента.
ViewController.m
Цель-C
. - (void)adsManager:(IMAAdsManager *)adsManager didReceiveAdError:(IMAAdError *)error < // Fall back to playing content. NSLog(@"AdsManager error: %@", error.message); [self showContentPlayer]; [self.contentPlayerViewController.player play]; > @endБыстрый
. func adsManager(_ adsManager: IMAAdsManager!, didReceive error: IMAAdError!) < // Fall back to playing content print("AdsManager error: " + error.message) showContentPlayer() playerViewController.player?.play() >Запуск событий воспроизведения и паузы
Последние два метода делегата, которые вам необходимо реализовать, используются для запуска событий воспроизведения и приостановки базового видеоконтента по запросу IMA SDK. Запуск паузы и воспроизведения по запросу не позволяет пользователю пропустить части видеоконтента при показе рекламы.
ViewController.m
Цель-C
. - (void)adsManagerDidRequestContentPause:(IMAAdsManager *)adsManager < // Pause the content for the SDK to play ads. [self.contentPlayerViewController.player pause]; [self hideContentPlayer]; >- (void)adsManagerDidRequestContentResume:(IMAAdsManager *)adsManager < // Resume the content since the SDK is done playing ads (at least for now). [self showContentPlayer]; [self.contentPlayerViewController.player play]; > @endБыстрый
. func adsManagerDidRequestContentPause(_ adsManager: IMAAdsManager!) < // Pause the content for the SDK to play ads. playerViewController.player?.pause() hideContentPlayer() >func adsManagerDidRequestContentResume(_ adsManager: IMAAdsManager!) < // Resume the content since the SDK is done playing ads (at least for now). showContentPlayer() playerViewController.player?.play() >>Вот и все! Теперь вы запрашиваете и показываете рекламу с помощью IMA SDK. Чтобы узнать о дополнительных функциях SDK, ознакомьтесь с другими руководствами или примерами на GitHub .
Следующие шаги
Отправить отзыв
Если не указано иное, контент на этой странице предоставляется по лицензии Creative Commons "С указанием авторства 4.0", а примеры кода – по лицензии Apache 2.0. Подробнее об этом написано в правилах сайта. Java – это зарегистрированный товарный знак корпорации Oracle и ее аффилированных лиц.
Последнее обновление: 2024-01-24 UTC.
Начало работы
Оптимизируйте свои подборки Сохраняйте и классифицируйте контент в соответствии со своими настройками.
IMA SDK упрощают интеграцию мультимедийной рекламы на ваши веб-сайты и приложения. IMA SDK могут запрашивать рекламу с любого рекламного сервера , совместимого с VAST, и управлять воспроизведением рекламы в ваших приложениях. С помощью клиентских SDK IMA вы сохраняете контроль над воспроизведением видеоконтента, а SDK управляет воспроизведением рекламы. Реклама воспроизводится в отдельном видеопроигрывателе, расположенном поверх видеопроигрывателя контента приложения.
В этом руководстве показано, как интегрировать IMA SDK в простое приложение видеоплеера. Если вы хотите просмотреть или проследить за завершенным примером интеграции, загрузите простой пример с GitHub. Если вас интересует проигрыватель HTML5 с предварительно интегрированным SDK, ознакомьтесь с плагином IMA SDK для Video.js .
Примечание. Информацию об интеграции с другими платформами или использовании SDK IMA DAI см. в разделе SDK интерактивной медиарекламы .
Обзор клиентской части IMA
Реализация IMA на стороне клиента включает четыре основных компонента SDK, которые продемонстрированы в этом руководстве:
- AdDisplayContainer : объект-контейнер, в котором отображаются объявления.
- AdsLoader : объект, который запрашивает рекламу и обрабатывает события из ответов на запросы рекламы. Вам следует создать только один экземпляр загрузчика рекламы, который можно будет повторно использовать на протяжении всего срока службы приложения.
- AdsRequest : объект, определяющий запрос рекламы. В запросах объявлений указывается URL-адрес тега объявления VAST, а также дополнительные параметры, например размеры объявления.
- AdsManager : объект, который содержит ответ на запрос рекламы, управляет воспроизведением рекламы и прослушивает рекламные события, запускаемые SDK.
Предварительные условия
Прежде чем начать, вам понадобится следующее:
- Три пустых файла:
- index.html
- стиль.css
- реклама.js
1. Запустите сервер разработки
Поскольку IMA SDK загружает зависимости по тому же протоколу, что и страница, с которой он загружается, для тестирования приложения необходимо использовать веб-сервер. Самый простой способ запустить локальный сервер разработки — использовать встроенный сервер Python.
Используя командную строку, из каталога, содержащего файл index.html, запустите:
python -m http.server 8000Вы также можете использовать любой другой веб-сервер, например HTTP-сервер Apache .
2. Создайте простой видеоплеер
Сначала измените index.html , чтобы создать простой видеоэлемент HTML5, содержащийся в элементе-оболочке, и кнопку для запуска воспроизведения. Также добавьте необходимые теги для загрузки файлов style.css иads.js. Затем измените style.css , чтобы видеоплеер реагировал на мобильные устройства. Наконец, вads.js запускает воспроизведение видео при нажатии кнопки воспроизведения.
IMA HTML5 Simple Demo 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%; >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.
Затем добавьте платформу IMA, используя тег скрипта в index.html перед ads.js .
.