Tải trước nội dung phương tiện

SDK IMA hỗ trợ tải trước thành phần quảng cáo dạng video. Bạn có thể bật tính năng này trong quá trình tích hợp SDK để chuyển đổi liền mạch hơn giữa quảng cáo và nội dung. Hướng dẫn này trình bày chi tiết kỹ thuật về cách triển khai tính năng tải trước nội dung nghe nhìn bằng SDK IMA.

Điều kiện tiên quyết

Tính năng tải trước yêu cầu phiên bản 3.17.0 trở lên của SDK Android IMA.

Bật tính năng tải trước

Để bật tính năng tải trước, hãy sử dụng AdsRenderingSettings.setEnablePreloading() để đặt tính năng tải trước thành true. Bạn phải thực hiện việc này trong lệnh gọi lại onAdsManagerLoaded():

@Override
public void onAdsManagerLoaded(AdsManagerLoadedEvent adsManagerLoadedEvent) {
  ...
  AdsRenderingSettings adsRenderingSettings =
      ImaSdkFactory.getInstance().createAdsRenderingSettings();
  adsRenderingSettings.setEnablePreloading(true);
  mAdsManager.init(adsRenderingSettings);
}

Hỗ trợ tải trước bằng VideoAdPlayer tuỳ chỉnh

Bạn nên dùng tiện ích ExoPlayer-IMA trong ứng dụng Android BasicExample. Khi được tích hợp, tiện ích ExoPlayer-IMA sẽ bật tính năng tải trước theo mặc định và có tính năng hỗ trợ tải trước tích hợp sẵn.

Nếu đang triển khai tính năng tải trước mà không có tiện ích ExoPlayer-IMA, thì bạn cần thực hiện các thay đổi bổ sung sau khi setEnablePreloading() được gọi. Để một trình phát video hỗ trợ quảng cáo tải trước, trình phát này phải theo dõi các đối tượng AdMediaInfo được chuyển trong các lệnh gọi từ loadAd()playAd(), đồng thời đưa đúng AdMediaInfo vào các lệnh gọi AdPlayerCallback. Điều này có thể yêu cầu một cấu trúc dữ liệu để quản lý các đối tượng AdMediaInfo, vì loadAd() cho AdMediaInfo tiếp theo có thể xảy ra trong khi AdMediaInfo trước đó đang phát lại. Ví dụ sau đây minh hoạ một số thay đổi mà bạn có thể cần thực hiện để ứng dụng hỗ trợ tính năng tải trước:

// enum for cases of PlayerState.
static enum PlayerState {
  IDLE,
  LOADED,
  PLAYING,
  PAUSED,
}

...

private final List<VideoAdPlayer.VideoAdPlayerCallback> callbacks;
private final ArrayList<AdMediaInfo> mediaInfos = new ArrayList<>();
private PlayerState playerState;
private boolean adCurrentlyLoaded;

...

@Override
public void playAd(AdMediaInfo adMediaInfo) {
  switch (playerState) {
    case LOADED:
      for (VideoAdPlayerCallback callback : callbacks) {
        callback.onPlay(adMediaInfo);
      }
      break;
    case PAUSED:
      for (VideoAdPlayerCallback callback : callbacks) {
        callback.onResume(adMediaInfo);
      }
      break;
    case PLAYING:
      // Intentionally and silently ignore since it is already playing from a prior media item,
      // note that onPlay is triggered by positionDiscontinuity.
      return;
    case IDLE:
      throw new IllegalStateException("Call to playAd when player state is not LOADED.");
  }
  playerState = PlayerState.PLAYING;
  player.setPlayWhenReady(true);
}

@Override
public void loadAd(AdMediaInfo adMediaInfo, AdPodInfo adPodInfo) {
  if (adCurrentlyLoaded == true) {
    mediaInfos.add(adMediaInfo);
    return;
  }
  player.stop();
  player.seekTo(0);
  mediaInfos.clear();
  mediaInfos.add(adMediaInfo);
  player.setPlayWhenReady(false);
  player.loadMedia(adMediaInfo.getUrl());
  playerState = PlayerState.LOADED;
  adCurrentlyLoaded = true;
}

@Override
public void stopAd(AdMediaInfo adMediaInfo) {
  if (allAdsInBreakHavePlayed()) {
    if (isFinalAd(adMediaInfo)) {
      // handle clean up after all ads have played.
    } else {
      seekToNextItem(player);
    }
  } else {
    mediaInfos.remove(adMediaInfo);
  }
}

private boolean allAdsInBreakHavePlayed() {
  // Code to determine if all the ads in the current ad break have completed.
}

private boolean isFinalAd(AdMediaInfo adMediaInfo) {
  // Code to determine if this adMediaInfo is the final ad.
}

private void seekToNextItem(YourPlayerClass player) {
  // Code to seek your player to the next media item.
}

Kiểm thử việc triển khai tải trước tuỳ chỉnh

Đối với các hoạt động triển khai tải trước tuỳ chỉnh, bạn nên kiểm thử các trường hợp tải trước sau đây để xác minh chế độ thiết lập tải trước chính xác:

  • Quảng cáo trước video dạng đơn
  • 3 nhóm quảng cáo trước video
  • 3 nhóm quảng cáo trong video
  • Tìm đến quảng cáo trong video thứ hai sau khi quảng cáo trong video đầu tiên bắt đầu tải trước nhưng trước khi quảng cáo đó phát
  • Phát sau video

Thời gian

Bảng sau đây tóm tắt các thay đổi về thời gian tải quảng cáo khi bật tính năng tải trước:

Sự kiện Có tính năng tải trước Không tải trước
Yêu cầu quảng cáo VAST AdsLoader.requestAds() AdsLoader.requestAds()
Quảng cáo trước video đã tải (một quảng cáo) AdsManager.init() AdsManager.start()
Quảng cáo trước video đã tải (VMAP/Quy tắc quảng cáo) AdsManager.init() AdsManager.init()
Quảng cáo giữa video hoặc sau video đã tải Đối với quảng cáo đầu tiên trong một khoảng nghỉ quảng cáo, 8 giây trước thời điểm bắt đầu quảng cáo. Đối với quảng cáo liên tiếp, khi quảng cáo trước đó bắt đầu phát. Vào thời gian bắt đầu quảng cáo.

Câu hỏi thường gặp

Tính năng tải trước nội dung nghe nhìn có tải toàn bộ mẫu quảng cáo không?
Không, mẫu quảng cáo thường chưa được tải đầy đủ khi quảng cáo bắt đầu phát. Tính năng tải trước nhằm cải thiện trải nghiệm người dùng bằng cách giảm thiểu thời gian tải quảng cáo. API này không nhằm hỗ trợ tính năng phân phát quảng cáo khi không có mạng.
Có cần bật tính năng tải trước nội dung nghe nhìn cho VAST của quảng cáo cũng như nội dung nghe nhìn không?
Không, SDK luôn tải trước VAST của quảng cáo, bất kể chế độ cài đặt tải trước này là gì.