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

SDK IMA hỗ trợ 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 để 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 các 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 SDK IMA Android phiên bản 3.17.0 trở lên.

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 một VideoAdPlayer tuỳ chỉnh

Bạn nên sử dụng tiện ích ExoPlayer-IMA được sử dụng trong ứng dụng Android BasicExample. Khi được tích hợp, tiện ích ExoPlayer-IMA đã 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ải trước mà không có tiện ích ExoPlayer-IMA, thì bạn sẽ cần thực hiện thêm các thay đổi sau khi setEnablePreloading() được gọi. Để trình phát video hỗ trợ tải trước quảng cáo, trình phát phải theo dõi các đối tượng AdMediaInfo được chuyển vào lệnh gọi từ loadAd()playAd(), đồng thời đưa đúng AdMediaInfo vào 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 đó hiện đang phát lại. 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ử các phương thức triển khai tuỳ chỉnh tải trước

Đố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 cạnh 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 đơn lẻ
  • 3 quảng cáo trước video
  • 3 nhóm quảng cáo trong video
  • 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 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ải trước Không cần tải trước
Đã yêu cầu VAST của quảng cáo AdsLoader.requestAds() AdsLoader.requestAds()
Đã tải trước video (một quảng cáo) AdsManager.init() AdsManager.start()
Đã tải trước video (VMAP/Quy tắc quảng cáo) AdsManager.init() AdsManager.init()
Đã tải quảng cáo giữa video hoặc cuối 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 các quảng cáo liên tiếp, khi quảng cáo trước đó bắt đầu phát. Tại thời điểm 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 hết khi bắt đầu phát quảng cáo. 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ợ phân phát quảng cáo ngoại tuyế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ư cho 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ì.