Tải sẵn nội dung nghe nhìn

Chọn nền tảng: HTML5 Android

SDK IMA hỗ trợ việc tải trước cá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 để mang đến một quá trình 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 về kỹ thuật khi 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 IMA cho Android.

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

Để bật tính năng tải trước, hãy 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 được dùng trong ứng dụng mẫu Android ExoPlayer. 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ó hỗ trợ tải trước tích hợp.

Nếu bạn đ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 khác sau khi gọi setEnablePreloading(). Để trình phát video hỗ trợ việc tải trước quảng cáo, trình phát đó phải theo dõi các đối tượng AdMediaInfo được truyền trong các lệnh gọi từ loadAd()playAd(), đồng thời bao gồm AdMediaInfo chính xác trong 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 một AdMediaInfo tiếp theo có thể xảy ra trong khi một AdMediaInfo trước đó đang phát. Ví dụ sau 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ính năng tải trước tuỳ chỉnh

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

  • Quảng cáo đầu video đơn lẻ
  • Nhóm quảng cáo gồm 3 quảng cáo trước video
  • Nhóm quảng cáo gồm 3 quảng cáo trong video
  • Chuyển đến một 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 phát
  • Phát quảng cáo sau video

Thời gian

Bảng sau đây tóm tắt những thay đổi về thời gian tải quảng cáo khi bạn 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
VAST quảng cáo được yêu cầu 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()
Đã tải quảng cáo trong video hoặc sau video Đối với quảng cáo đầu tiên trong một điểm chèn quảng cáo, 8 giây trước thời gian 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 tải xong khi quá trình phát quảng cáo bắt đầu. Việc tải trước nhằm mục đích 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. Tính năng này không nhằm mục đích hỗ trợ việc phân phát quảng cáo khi không có mạng.
Bạn 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.