Brightcove-Player-SDK-IMA 2.3.1

Brightcove-Player-SDK-IMA 2.3.1

许可证 商业
发布最新发布2017年5月

Jim WhisenantSteve BushellTim Rodgers 维护。



 
依赖
Brightcove-Player-SDK/dynamic~> 5.3.0
GoogleAds-IMA-iOS-SDK= 3.5.2
 

  • 作者
  • Brightcove

Brightcove Player SDK for iOS 的 IMA 插件,版本 2.3.1.36

支持的平台

iOS 8.0 及以上版本。

安装

IMA for Brightcove Player SDK 提供动态库框架用于安装。

IMA 插件支持 Google IMA SDK 的 3.5.2 版本。

手动安装

要将 Brightcove Player SDK 的 IMA 插件手动添加到您的项目中

  1. 下载 Brightcove Player SDK 框架。
  2. 下载 Brightcove Player SDK 的 IMA 插件 框架。
  3. 下载 Google IMA 框架。
  4. 在您的应用程序目标的“常规”选项卡中,将下载的 Brightcove Player SDK 的
  5. 在您的应用程序目标的“常规”选项卡中,将 IMA for Brightcove Player SDK 下载的 BrightcoveIMA.framework 添加到“嵌入的二进制文件”列表中。
  6. 在您的应用程序目标的“常规”选项卡中,将 Google IMA 下载中的 GoogleInteractiveMediaAds.framework 添加到“嵌入的二进制文件”列表中。
  7. 在您的应用程序目标的“构建设置”选项卡中,确保“框架搜索路径”包括框架的路径。如果不是存储在项目根目录下的不同根目录中,则此操作应已自动完成。
  8. 在您的应用程序目标的“构建设置”选项卡中
    • 确保已经将 -ObjC 添加到“其他链接器标志”构建设置中。

导入

IMA for Brightcove Player SDK 可以通过几种不同的方式导入到代码中;@import BrightcoveIMA;#import <BrightcoveIMA/BrightcoveIMA.h>#import <BrightcoveIMA/[specific class].h>。您还可以以类似的方式导入 GoogleInteractiveMediaAdsBrightcovePlayerSDK 模块。

快速入门

BrightcoveIMA插件是Google IMA iOS SDK v3与Brightcove Player SDK for iOS之间的桥梁。Google IMA iOS SDK v3Brightcove Player SDK for iOS。本片段展示了它与服务器端广告规则的结合基本使用。

[1] IMASettings *imaSettings = [[IMASettings alloc] init];
    imaSettings.ppid = kViewControllerIMAPublisherID;
    imaSettings.language = kViewControllerIMALanguage;

    IMAAdsRenderingSettings *renderSettings = [[IMAAdsRenderingSettings alloc] init];
    renderSettings.webOpenerPresentingController = self;

    UIView *videoContainerView = <UIView of video container>;
    NSString *adTag = <ad tag>;

[2] BCOVIMAAdsRequestPolicy *adsRequestPolicy = [BCOVIMAAdsRequestPolicy adsRequestPolicyWithVMAPAdTagUrl:adTag];

    BCOVPlayerSDKManager *manager = [BCOVPlayerSDKManager sharedManager];
    id<BCOVPlaybackController> controller =
[3]         [manager createIMAPlaybackControllerWithSettings:imaSettings
                    adsRenderingSettings:renderSettings
                    adsRequestPolicy:adsRequestPolicy
                    adContainer:videoContainerView 
                    companionSlots:nil
                    viewStrategy:nil];
    controller.delegate = self;

    [videoContainerView addSubview:controller.view];  

    NSString *policyKey = <your-policy-key>;
    NSString *accountId = <your-account-id>;
    NSString *videoID = <your-video-id>;
    BCOVPlaybackService *playbackService = [[BCOVPlaybackService alloc] initWithAccountId:accountID
                                                                                policyKey:policyKey];
    [playbackService findVideoWithVideoID:videoID
                               parameters:nil
                               completion:^(BCOVVideo    *video,
                                            NSDictionary *jsonResponse,
                                            NSError      *error) {

        [controller setVideos:@[ video ]];
        [controller play];

    }];

分解代码步骤

  1. 创建与您直接使用Google的IMA iOS SDK时相同的IMA设置、广告渲染设置。这是必须的。
  2. BCOVIMAAdsRequestPolicy提供了指定VAST或VMAP/服务器端广告规则的方法。选择适当的方法来选择您的广告策略。
  3. BrightcoveIMA向BCOVPlaybackManager添加了一些分类方法。其中第一个是-createIMAPlaybackControllerWithSettings:adsRenderingSettings:adsRequestPolicy:adContainer:companionSlots:viewStrategy:。使用此方法创建您的播放控制器。

如果您有疑问或需要帮助,我们有一个针对Brightcove原生Player SDKs的支持论坛,网址为https://groups.google.com/forum/#!forum/brightcove-native-player-sdks

播放和暂停

Brightcove IMA插件实现了自定义的播放和暂停逻辑,以确保最平滑的广告体验。因此,您需要确保使用BCOVPlaybackController上的播放方法或-[BCOVSessionProviderExtension ima_play]-[BCOVSessionProviderExtension ima_pause]BCOVSessionProviderExtension),而不是AVPlayer。

例如,在BCOVPlaybackController上首次调用播放可以让BCOVIMA处理预滚广告,而不会在预滚广告之前播放任何内容。有关BCOVIMA如何覆盖默认的BCOVPlaybackController方法的更多信息,请参阅BCOVSessionProviderExtension

使用内置的PlayerUI

如果您使用的是Brightcove Player SDK的5.1或更高版本,可以利用Brightcove IMA插件内置的播放器控件。

注意:BrightcovePlayerUI模块不再需要,并且已被移除。(在Brightcove Player SDK 5.1版本之前,Brightcove PlayerUI插件是一个独立的框架和模块。)您可以移除所有引用Brightcove PlayerUI模块的导入。所有PlayerUI头文件现在都在BrightcovePlayerSDK模块中。

在您的UIViewController中,创建一个名为播放器的BCOVPUIPlayerView属性,它包含播放控件、视频内容视图以及IMA可以显示其广告的特殊视图。

// PlayerUI's player view
@property (nonatomic) BCOVPUIPlayerView *playerView;

然后创建您的播放器视图;提供nil播放控制器,稍后将其添加。此播放器视图包含视频内容视图和显示播放控件和广告控件的视图。无论您使用什么插件,这种设置都是相同的。将播放器视图设置为与您的布局中的视频容器(videoView)匹配,当它调整大小时。

// Create and configure Control View.
BCOVPUIBasicControlView *controlView = [BCOVPUIBasicControlView basicControlViewWithVODLayout];
    
// Create the player view with a nil playback controller.
self.playerView = [[BCOVPUIPlayerView alloc] initWithPlaybackController:nil options:nil controlsView:controlView];
self.playerView.frame = self.videoView.bounds;
self.playerView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;

然后,将BCOVPUIPlayerView添加到您的视频容器videoView中。

// Add BCOVPUIPlayerView to your video view.
[self.videoView addSubview:self.playerView];

创建播放控制器是针对IMA的。按照上述方法创建您的播放控制器,但将播放器视图的contentOverlayView作为您的adContainer传入,而不是视频容器视图。《contentOverlayView》是一个特殊视图,用于在主要视频内容上叠加视图。如果您使用[manager defaultControlsViewStrategy]作为您的viewStrategy(这是使用内置控件的老方法),则还应使用nil代替。

// Create the playback controller.
id<BCOVPlaybackController> controller =
                [manager createIMAPlaybackControllerWithSettings:imaSettings
                        adsRenderingSettings:renderSettings
                        adsRequestPolicy:adsRequestPolicy
                        adContainer:self.playerView.contentOverlayView // special view for IMA ad content
                        companionSlots:nil
                        viewStrategy:nil];
controller.delegate = self;

// Assign new playback controller to the player view.
// This associates the playerController's session with the PlayerUI.
// You can keep this player view around and assign new
// playback controllers to it as they are created.
self.playerView.playbackController = self.playbackController;

最后,在播放控制器代理上实现两个BCOVPlaybackControllerAdsDelegate方法。由于IMA实现了它自己的广告控件集,因此在IMA广告播放时应该隐藏Brightcove PlayerUI控件。这可以防止屏幕上的任何不必要的控件在视图较大且稀疏时显示,例如在全屏模式下演示时。

- (void)playbackController:(id<BCOVPlaybackController>)controller playbackSession:(id<BCOVPlaybackSession>)session didEnterAdSequence:(BCOVAdSequence *)adSequence
{
  // Hide all controls for ads (so they're not visible when full-screen)
  self.playerView.controlsContainerView.alpha = 0.0;
 }
 
- (void)playbackController:(id<BCOVPlaybackController>)controller playbackSession:(id<BCOVPlaybackSession>)session didExitAdSequence:(BCOVAdSequence *)adSequence
{
  // Show all controls when ads are finished.
  self.playerView.controlsContainerView.alpha = 1.0;
}

现在,当播放带有广告的视频时,您在播放视频内容时将看到PlayerUI控件,以及在时间线刮擦器上的广告标记(仅适用于VMAP广告)。

PlayerUI非常可定制。有关更多信息以及示例代码,请参阅Brightcove Native Player SDK仓库中README.md文件下的“自定义布局”部分。

无广告定位

使用-[BCOVPlaybackController seekWithoutAds:(CMTime)time completionHandler:(void (^)(BOOL finished))completion]time之前不强制观看已安排的广告的情况下恢复播放。当使用seekWithoutAds:completionHandler:时,应在BCOVPlaybackController中禁用autoPlay。应该在接收到kBCOVPlaybackSessionLifecycleEventReady后或在您的playbackController:playbackSession:didReceiveLifecycleEvent代理方法中调用seekWithoutAds:completionHandler:

可以使用shuttershutterFadeTime属性以及seekWithoutAds:completionHandler:来隐藏在AVPlayer加载资源时可能出现的帧闪烁。在你的BCOVPlaybackController设置代码中,关闭shutter来隐藏播放器视图。

  NSObject<BCOVPlaybackController> *playbackController;
        
  playbackController = [sdkManager createFWPlaybackControllerWithAdContextPolicy:nil
                                                                    viewStrategy:nil];
  playbackController.delegate = self;
        
  if (self.willSeekWithoutAds)
  {
    // set the shutter fade time to zero to hide the player view immediately.
    playbackController.shutterFadeTime = 0.0;
    playbackController.shutter = YES;
    
    // disable autoPlay when resuming playback.
    playbackController.autoPlay = NO;
  }

Apple建议在使用AVPlayerItem之前等待其状态变为可播放,请调用BCOVPlaybackControllerDelegate代理的playbackController:playbackSession:didReceiveLifecycleEvent方法中的seekWithoutAds:completionHandler:

- (void)playbackController:(NSObject<BCOVPlaybackController>*)controller
           playbackSession:(NSObject<BCOVPlaybackSession>*)session
  didReceiveLifecycleEvent:(BCOVPlaybackSessionLifecycleEvent *)lifecycleEvent
{
  if ([kBCOVPlaybackSessionLifecycleEventReady isEqualToString:lifecycleEvent.eventType])
  {
    if (self.willSeekWithoutAds)
    {
      __weak typeof(controller) weakController = controller;

      // seek without playing ads which are scheduled before the seek time, i.e. resume playback.
      [controller seekWithoutAds:CMTimeMake(seekWithoutAdsValue, seekWithoutAdsTimescale)
             completionHandler:^(BOOL finished){

        if (!finished)
        {
          NSLog (@"seekWithoutAds failed to finish");
        }

        typeof(controller) strongController = weakController;
        if (strongController)
        {
          // fade out the shutter to reveal the player view.
          strongController.shutterFadeTime = 0.25;
          strongController.shutter = NO;

          // turn off seeking without ads - especially important if this player is being used with a playlist
          self.willSeekWithoutAds = NO;
        }

      }];
    }
  }
}

请注意,当您的应用程序中启用了无广告定位时,您仍然会看到作为设置IMA插件一部分而通常出现的网络流量。这种流量对于插件正确设置是必要的,并且不会影响无广告定位功能。

自定义插件行为

在BCOVIMA中有几个配置点。您可以结合BCOVIMA使用Brightcove Player SDK for iOS的另一个插件,您可以创建自定义视图策略,并且可以提供自定义广告请求策略。

VAST和VMAP/服务器端广告规则

BCOVIMA通过BCOVIMAAdsRequestPolicy类为您提供对广告请求方式的控制。该类提供了支持的政策的生产方法。一旦您获得了正确政策的实例,您需要将其提供给BCOVPlayerSDKManager以创建播放控制器或播放会话提供者。

在快速入门中提供了一个VMAP的示例。以下是VAST的示例。

    IMASettings *imaSettings = [[IMASettings alloc] init];
    imaSettings.ppid = kViewControllerIMAPublisherID;
    imaSettings.language = kViewControllerIMALanguage;

    IMAAdsRenderingSettings *renderSettings = [[IMAAdsRenderingSettings alloc] init];
    renderSettings.webOpenerPresentingController = self;

    UIView *videoContainerView = <UIView of video container>;

[1] BCOVIMAAdsRequestPolicy *adsRequestPolicy = [BCOVIMAAdsRequestPolicy adsRequestPolicyWithVASTAdTagsInCuePointsAndAdsCuePointProgressPolicy:nil];

    BCOVPlayerSDKManager *manager = [BCOVPlayerSDKManager sharedManager];
    id<BCOVPlaybackController> controller =
            [manager createIMAPlaybackControllerWithSettings:imaSettings
                    adsRenderingSettings:renderSettings
                    adsRequestPolicy:adsRequestPolicy
                    adContainer:videoContainerView
                    companionSlots:nil
                    viewStrategy:[manager defaultControlsViewStrategy]];

让我们按步骤分解此代码,使其更容易理解。

  1. 此示例与快速入门中提供的示例相同,但我们现在调用了不同的BCOVIMAAdsRequestPolicy策略方法来指定我们想要使用VAST。

BCOVIMAAdsRequestPolicy有四个生成广告请求策略的工厂方法;两个用于VMAP,两个用于VAST。以下更详细地描述两个VMAP的工厂方法:

  • +videoPropertiesVMAPAdTagUrlAdsRequestPolicy:该方法返回默认的广告请求策略,该策略在BCOVVideo的属性中查找kBCOVIMAAdTag,以确定用于请求广告的VMAP广告标记。

  • +adsRequestPolicyWithVMAPAdTagUrl::该方法返回一个广告请求策略,它始终为每个视频使用相同的广告标记。如果您使用此策略,您不需要将广告标记放入BCOVVideos的属性中。如果您知道广告标记在应用会话的生命周期中永远不会改变,这是指定广告标记的最简单方法。

对于VAST,有两种工厂方法。所有的VAST方法都接受一个BCOVCuePointProgressPolicy。提示点策略决定了哪个BCOVCuePoints将由BCOVIMAAdsRequestPolicy处理。以下VAST策略如下

  • +adsRequestPolicyWithVASTAdTagsInCuePointsAndAdsCuePointProgressPolicy: 此方法返回一个广告请求策略,该策略检查每个BCOVVideo中的类型为'kBCOVIMACuePointTypeAd'的BCOVCuePoints,并查看这些提示点属性中的密钥kBCOVIMAAdTag,以确定应使用哪个VAST广告标签来请求广告。

  • +adsRequestPolicyFromCuePointPropertiesWithAdTag:adsCuePointProgressPolicy: 此方法返回的广告请求策略使用指定的VAST广告标签为类型为kBCOVIMACuePointTypeAd的所有BCOVCuePoints。提示点的属性作为查询参数附加到广告标签上。

视图策略

在构造回放控制器或会话提供者时,您可以向BCOVPlaybackManager提供一个自定义视图策略,而不是直接指定默认的controlsViewStrategy。使用自定义视图策略,可以将广告容器视图和广告伴随槽与视频内容视图关联起来。这是一个自定义视图策略的例子。

BCOVPlaybackControllerViewStrategy customViewStrategy = ^UIView* (UIView *view, id<BCOVPlaybackController> playbackController){
    
    BCOVPlaybackControllerViewStrategy defaultControlsViewStrategy = [playbackManager defaultControlsViewStrategy];
    UIView *contentAndDefaultControlsView = defaultControlsViewStrategy(view, playbackController);
    
    [<UIView of video container> addSubview:contentAndDefaultControlsView];
    
    return <UIView of video container>;
};

组合会话提供者

如果您正在使用多个需要创建自定义回放控制器的Brightcove Player SDK for iOS插件,则必须组合一系列会话提供者并将最终的会话提供者传递给-[BCOVPlayerSDKManager createPlaybackControllerWithSessionProvider:viewStrategy:]方法。

在组合会话提供者时,可以从BCOVBasicSessionProvider启用会话预加载;但是,由于在内存中存在多个AVPlayer时的Google IMA SDK中的错误,因此强烈不建议使用IMA插件进行会话预加载。

常见问题

** 我能听到广告,但看不到它们播放。 **

这通常发生在广告容器视图不在视图层次结构中,或者当广告视图(它是广告容器视图的子视图)被其他视图覆盖时。