画中画

本指南适用于希望将“画中画”功能的 IMA 发布商 为现有 IMA 实现提供图片支持。

前提条件

为应用添加画中画支持

从 SDK 3.1.0 版开始,IMA 支持适用于 iPad 的 Apple“画中画”模式。 如需为您的应用添加对画中画功能的支持,您需要调整一些 设置并实现一些新的 IMA 类,如下所示。

更新设置以允许后台播放

“画中画”模式要求您允许后台播放媒体 。

  1. 音频、AirPlay 和画中画模式后台模式设为开启 图片,如下所示:

  2. 设置 AVAudioSession 属性以支持后台播放 在 IMASettings 中启用后台播放功能:

    ...
    – (void)viewDidLoad {
     [super viewDidLoad];
    
     self.playButton.layer.zPosition = MAXFLOAT;
    
     [[AVAudioSession sharedInstance] setActive:YES error:nil];
     [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
    
     [self setupAdsLoader];
     [self setUpContentPlayer];
    }
    
    – (void)setupAdsLoader {
     IMASettings *settings = [[IMASettings alloc] init];
     settings.enableBackgroundPlayback = YES;
     self.adsLoader = [[IMAAdsLoader alloc] initWithSettings:settings];
     self.adsLoader.delegate = self;
    }

为画中画创建新的 iOS 和 IMA 对象

为了支持画中画功能,Apple 添加了 AVPictureInPictureControllerAVPictureinPictureControllerDelegate 类。我们添加了 IMAPictureInPictureProxy。要将这些类整合到您的项目中,请将 将以下语句添加到您的代码中:

...
@interface VideoViewController () <AVPictureInPictureControllerDelegate,
                                   IMAAdsLoaderDelegate,
                                   IMAAdsManagerDelegate,
                                   UIAlertViewDelegate>
...
// PiP objects.
@property(nonatomic, strong) IMAPictureInPictureProxy *pictureInPictureProxy;
@property(nonatomic, strong) AVPictureInPictureController *pictureInPictureController;
...
@end

- (void)setUpContentPlayer {
  ...
  self.pictureInPictureProxy =
      [[IMAPictureInPictureProxy alloc] initWithAVPictureInPictureControllerDelegate:self];
  self.pictureInPictureController =
      [[AVPictureInPictureController alloc] initWithPlayerLayer:self.contentPlayerLayer];
  self.pictureInPictureController.delegate = self.pictureInPictureProxy;
}

修改广告请求

还有一个需要创建的新对象:IMAAVPlayerVideoDisplay。通过 添加到您的 IMAAdsRequest 构造函数中,并允许 SDK 将广告插入画中画中 窗口:

...
- (void)requestAdsWithTag:(NSString *)adTagUrl {
  [self logMessage:@"Requesting ads"];
  // Create an ad request with our ad tag, display container, and optional user context.
  IMAAdsRequest *request = [[IMAAdsRequest alloc]
           initWithAdTagUrl:adTagUrl
         adDisplayContainer:[self createAdDisplayContainer]
       avPlayerVideoDisplay:[[IMAAVPlayerVideoDisplay alloc] initWithAVPlayer:self.contentPlayer]
      pictureInPictureProxy:self.pictureInPictureProxy
                userContext:nil];
  [self.adsLoader requestAdsWithRequest:request];
}

启动广告

在画中画模式下,无法启动 IMA SDK 广告。因此 您需要确保仅在视频加载完毕时调用 [adsManager start]。 标准播放模式:

...
- (void)adsManager:(IMAAdsManager *)adsManager didReceiveAdEvent:(IMAAdEvent *)event {
  [self logMessage:@"AdsManager event (%s).", AdEventNames[event.type]];
  // When the SDK notified you that ads have been loaded, play them.
  switch (event.type) {
    case kIMAAdEvent_LOADED:
      if (![self.pictureInPictureController isPictureInPictureActive]) {
        [adsManager start];
      }
      break;
    ...
    default:
      break;
  }
}

进入画中画模式

如果您使用的是不带 AVPlayerViewControllerAVPlayer,则需要执行以下操作: 添加自己的“画中画”按钮我们在高级 示例 如下所示:

- (IBAction)onPipButtonClicked:(id)sender {
  if ([self.pictureInPictureController isPictureInPictureActive]) {
    [self.pictureInPictureController stopPictureInPicture];
  } else {
    [self.pictureInPictureController startPictureInPicture];
  }
}

常见问题解答

如何在视频处于“画中画”模式时开始投放广告?
在“画中画”模式下播放视频时无法开始投放广告;他们 只能在标准播放模式下启动。
我现有的画中画集成需要将 self.pictureInPictureController.delegate 设为我自己的类。如何在“画中画”模式中实施 IMA 广告并仍然保持被代理身份?
IMA SDK 还需要收到 AVPictureinPictureControllerDelegate 消息以启用“画中画”模式的广告播放。因此,我们要求 将 AVPictureinPictureController 的委托设置为 IMAPictureInPicturyProxy。此代理对象会在所有 AVPictureinPictureControllerDelegate 条消息发送到您的应用,并且还会转发 调用 IMA 以启用画中画支持。请注意,您还必须 保留 AVPlayerLayer 的本地句柄。