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

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

SDK IMA hỗ trợ tải trước tài sả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 về kỹ thuật khi triển khai tính năng tải trước nội dung đa phương tiệ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 Android.

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ính năng tải trước bằng VideoAdPlayer tuỳ chỉnh

Bạn nên dùng tiện ích ExoPlayer-IMA được sử dụng trong ứng dụng ví dụ ExoPlayer Android. 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à bao gồm tính năng 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 thêm các thay đổi sau khi gọi setEnablePreloading(). Để hỗ trợ tính năng tải trước quảng cáo, trình phát video phải theo dõi các đối tượng AdMediaInfo được truyền trong các lệnh gọi từ loadAd()playAd() và bao gồm AdMediaInfo chính xác trong các lệnh gọi AdPlayerCallback. Bạn có thể cần 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 của mình 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ử các cách triển khai tính năng tải trước tuỳ chỉnh

Đối với các cách 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 đặc biệt sau để xác minh rằng bạn đã 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 đầu video gồm 3 quảng cáo
  • Nhóm quảng cáo giữa video gồm 3 quảng cáo
  • Tìm đến quảng cáo giữa video thứ hai sau khi quảng cáo giữa video đầu tiên bắt đầu tải trước nhưng chưa phát
  • Phát quảng cáo cuối video

Thời gian

Bảng sau đây tóm tắt các thay đổi về thời điểm 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 có tính năng tải trước
Đã yêu cầu VAST quảng cáo AdsLoader.requestAds() AdsLoader.requestAds()
Đã tải quảng cáo chèn trước (quảng cáo đơn lẻ) AdsManager.init() AdsManager.start()
Đã tải quảng cáo chèn trước (VMAP/Quy tắc quảng cáo) AdsManager.init() AdsManager.init()
Đã tải quảng cáo chèn giữa hoặc quảng cáo chèn sau Đố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 các 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 đa phương tiệ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 không được tải đầy đủ khi quảng cáo bắt đầu phát. Tính năng 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ợ phân phát quảng cáo ngoại tuyến.
Tính năng tải trước nội dung đa phương tiện có cần được bật cho VAST của quảng cáo cũng như nội dung đa phương tiệ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.