ช่วงพักโฆษณา

SDK ตัวรับสัญญาณของ Android TV มาพร้อมการรองรับในตัวสำหรับช่วงพักโฆษณาและโฆษณาที่แสดงร่วมภายในสตรีมสื่อหนึ่งๆ

ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีการทำงานของช่วงพักโฆษณาได้ในภาพรวมช่วงพักโฆษณาในฝั่งผู้รับบนเว็บ

การจัดการภาระงานที่มีช่วงพักโฆษณา

ในแอป Android TV ช่วงพักจะรวมอยู่ใน MediaLoadRequestData คำขอโหลดสามารถประมวลผลได้ตามปกติ และคุณสามารถดึงข้อมูล AdBreakClipInfo และ AdBreakInfo ได้จาก MediaInfo

Kotlin
class MyMediaLoadCommandCallback : MediaLoadCommandCallback() {
  override fun onLoad( senderId: String?, loadRequestData: MediaLoadRequestData
   ): Task {
    return Tasks.call {
      // Resolve the entity into your data structure and load media.
      val mediaInfo = loadRequestData.mediaInfo
      ...
      myPrepareAdBreaks(mediaInfo.adBreakClips, mediaInfo.adBreaks)
      // Update media metadata and state (this clears all previous status
      // overrides).
      castReceiverContext.getMediaStatusModifier()
          .setDataFromLoad(mediaInfo) // Ad breaks are set on the modifier.
      castReceiverContext.getMediaManager().broadcastMediaStatus()
      // Return the resolved MediaLoadRequestData to indicate load success.
      return loadRequestData
    }
  }
}
Java
public class MyMediaLoadCommandCallback extends MediaLoadCommandCallback {
  @Override
  public Task onLoad(String senderId, MediaLoadRequestData loadRequestData) {
    return Tasks.call(() -> {
        // Resolve the entity into your data structure and load media.
        MediaInfo mediaInfo = loadRequestData.getMediaInfo();
        ...
        myPrepareAdBreaks(mediaInfo.getAdBreakClips(), mediaInfo.getAdBreaks());
        // Update media metadata and state (this clears all previous status
        // overrides).
        castReceiverContext.getMediaStatusModifier()
            .setDataFromLoad(mediaInfo); // Ad breaks are set on the modifier.
        castReceiverContext.getMediaManager().broadcastMediaStatus();
        // Return the resolved MediaLoadRequestData to indicate load success.
        return loadRequestData;
    });
    }
}

กำลังอัปเดตช่วงพักโฆษณา

เมื่อโฆษณาเริ่มเล่น ให้อัปเดต AdBreakStatus ใน MediaStatusModifier เพื่อประกาศว่าแอปของคุณเริ่มเล่นโฆษณาแล้ว

Kotlin
val breakStatus = AdBreakStatus.Builder()
        .setBreakId("b1")
        .setBreakClipId("bc1")
        .setCurrentBreakClipTimeInMs(breakClipProgress)
        .setCurrentBreakTimeInMs(breakProgress)
        .setWhenSkippableInMs(5000) // Set this field so that the ad break clip is skippable
        .build()

castReceiverContext.getMediaStatusModifier()
        .setAdBreakStatus(breakStatus)
Java
AdBreakStatus breakStatus =
    new AdBreakStatus.Builder()
        .setBreakId("b1")
        .setBreakClipId("bc1")
        .setCurrentBreakClipTimeInMs(breakClipProgress)
        .setCurrentBreakTimeInMs(breakProgress)
        .setWhenSkippableInMs(5000)  // Set this field so that the ad break clip is skippable
        .build();

castReceiverContext.getMediaStatusModifier()
    .setAdBreakStatus(breakStatus);

คุณยังแก้ไขช่วงพักโฆษณาแบบไดนามิกหลังจากโหลดรายการได้ด้วย โดยทำดังนี้

Kotlin
var breakClip1: AdBreakClipInfo = ...
var breakClip2: AdBreakClipInfo = ...
var breakClip3: AdBreakClipInfo = ...

var break1: AdBreakInfo = ...
var break2: AdBreakInfo = ...

mediaManager.getMediaStatusModifier().getMediaInfoModifier()
    .setAdBreakClips({breakClip1, breakClip2, breakClip3})
    .setAdBreaks({break1, break2})
Java
AdBreakClipInfo breakClip1 = ...
AdBreakClipInfo breakClip2 = ...
AdBreakClipInfo breakClip3 = ...

AdBreakInfo break1 = ...
AdBreakInfo break2 = ...

mediaManager.getMediaStatusModifier().getMediaInfoModifier()
    .setAdBreakClips({breakClip1, breakClip2, breakClip3})
    .setAdBreaks({break1, break2});

เปิดใช้และจัดการการข้ามโฆษณา

เมื่อมีการเล่นช่วงพักโฆษณา ผู้ส่งจะแสดงปุ่มเพื่อข้ามคลิปช่วงพักโฆษณาปัจจุบันหากโฆษณาแบบข้ามได้ หากต้องการให้ผู้ใช้ข้ามคลิปช่วงพักโฆษณาได้ ให้ใช้ MediaStatusModifier เพื่อเพิ่มคำสั่งสื่อ COMMAND_SKIP_AD ดังนี้

Kotlin
mMediaManager.getMediaStatusModifier().setMediaCommandSupported(MediaStatus.COMMAND_SKIP_AD, true)
Java
mMediaManager.getMediaStatusModifier().setMediaCommandSupported(MediaStatus.COMMAND_SKIP_AD, true);

ในการจัดการคำสั่ง SKIP_AD ให้ใช้โค้ดเรียกกลับ onSkipAd ใน MediaCommandCallback ดังนี้

Kotlin
class MyMediaCommandCallback : MediaCommandCallback() {
    override fun onSkipAd(requestData: RequestData?): Task {
        // Skip your ad
        ...
        return Tasks.forResult(null)
    }
}

val mediaManager = CastReceiverContext.getInstance().mediaManager
mediaManager.setMediaCommandCallback(MyMediaCommandCallback())
Java
public class MyMediaCommandCallback extends MediaCommandCallback {
  @Override
  public Task onSkipAd(RequestData requestData) {
    // Skip your ad
    ...
    return Tasks.forResult(null);
  }
}

MediaManager mediaManager =
    CastReceiverContext.getInstance().getMediaManager();
mediaManager.setMediaCommandCallback(new MyMediaCommandCallback());

การต่อภาพฝั่งไคลเอ็นต์

การต่อโฆษณาฝั่งไคลเอ็นต์ คือจุดที่โฆษณาไม่ได้ฝังอยู่ในสตรีม สำหรับ Cast Connect นอกจากการอัปเดต AdBreakStatus ใน MediaStatusModifier แล้ว คุณต้องตั้งค่าความเร็วในการเล่นเป็น 0 ใน PlaybackStateCompat เพื่อให้ผู้ส่งรู้ว่าต้องหยุดความคืบหน้าของไทม์ไลน์ของเนื้อหา

Kotlin
// Playback speed should be 0 if content is not playing.
if (adIsPlaying) {
    playbackSpeed = 0.0f
}
val stateBuilder = PlaybackStateCompat.Builder()
    .setActions(AVAILABLE_MEDIA_ACTIONS)
stateBuilder.setState(playbackStateCompat, position, playbackSpeed)
mediaSession.setPlaybackState(stateBuilder.build())
Java
// Playback speed should be 0 if content is not playing.
if (adIsPlaying) {
    playbackSpeed = 0.0f;
}
PlaybackStateCompat.Builder stateBuilder = new PlaybackStateCompat.Builder()
    .setActions(AVAILABLE_MEDIA_ACTIONS);
stateBuilder.setState(playbackStateCompat, position, playbackSpeed);
mediaSession.setPlaybackState(stateBuilder.build());

เมื่อโฆษณาเล่นจบแล้ว คุณควรกลับมาใช้ความเร็วในการเล่นก่อนหน้านี้

การต่อฝั่งเซิร์ฟเวอร์

สําหรับการเย็บฝั่งเซิร์ฟเวอร์ โฆษณาจะถูกฝังไว้ ดังนั้นเซิร์ฟเวอร์จะคาดการณ์สตรีมเดียวที่มีทั้งเนื้อหาและโฆษณา ในกรณีนี้ การเล่นสามารถดำเนินไปได้ตามปกติเนื่องจากไทม์ไลน์มีระยะเวลาของโฆษณาเพิ่มเติมจากเนื้อหา