许可证 | 商业 |
发布最新发布 | 2017年5月 |
由 Jim Whisenant,Steve Bushell,Tim Rodgers 维护。
依赖 | |
Brightcove-Player-SDK/dynamic | ~> 5.3.0 |
GoogleAds-IMA-iOS-SDK | = 3.5.2 |
iOS 8.0 及以上版本。
IMA for Brightcove Player SDK 提供动态库框架用于安装。
IMA 插件支持 Google IMA SDK 的 3.5.2 版本。
要将 Brightcove Player SDK 的 IMA 插件手动添加到您的项目中
-ObjC
添加到“其他链接器标志”构建设置中。IMA for Brightcove Player SDK 可以通过几种不同的方式导入到代码中;@import BrightcoveIMA;
,#import <BrightcoveIMA/BrightcoveIMA.h>
或 #import <BrightcoveIMA/[specific class].h>
。您还可以以类似的方式导入 GoogleInteractiveMediaAds
和 BrightcovePlayerSDK
模块。
BrightcoveIMA插件是Google IMA iOS SDK v3与Brightcove Player SDK for iOS之间的桥梁。Google IMA iOS SDK v3和Brightcove 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];
}];
分解代码步骤
-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。
如果您使用的是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:
。
可以使用shutter
和shutterFadeTime
属性以及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的另一个插件,您可以创建自定义视图策略,并且可以提供自定义广告请求策略。
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]];
让我们按步骤分解此代码,使其更容易理解。
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插件进行会话预加载。
** 我能听到广告,但看不到它们播放。 **
这通常发生在广告容器视图不在视图层次结构中,或者当广告视图(它是广告容器视图的子视图)被其他视图覆盖时。