SDK ตัวรับสัญญาณของ Android TV มาพร้อมการรองรับในตัวสำหรับช่วงพักโฆษณาและโฆษณาที่แสดงร่วมภายในสตรีมสื่อหนึ่งๆ
ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีการทำงานของช่วงพักโฆษณาได้ในภาพรวมช่วงพักโฆษณาในฝั่งผู้รับบนเว็บ
การจัดการภาระงานที่มีช่วงพักโฆษณา
ในแอป Android TV ช่วงพักจะรวมอยู่ใน
MediaLoadRequestData
คำขอโหลดสามารถประมวลผลได้ตามปกติ และคุณสามารถดึงข้อมูล AdBreakClipInfo
และ AdBreakInfo
ได้จาก MediaInfo
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 } } }
public class MyMediaLoadCommandCallback extends MediaLoadCommandCallback { @Override public TaskonLoad(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
เพื่อประกาศว่าแอปของคุณเริ่มเล่นโฆษณาแล้ว
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)
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);
คุณยังแก้ไขช่วงพักโฆษณาแบบไดนามิกหลังจากโหลดรายการได้ด้วย โดยทำดังนี้
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})
AdBreakClipInfo breakClip1 = ... AdBreakClipInfo breakClip2 = ... AdBreakClipInfo breakClip3 = ... AdBreakInfo break1 = ... AdBreakInfo break2 = ... mediaManager.getMediaStatusModifier().getMediaInfoModifier() .setAdBreakClips({breakClip1, breakClip2, breakClip3}) .setAdBreaks({break1, break2});
เปิดใช้และจัดการการข้ามโฆษณา
เมื่อมีการเล่นช่วงพักโฆษณา ผู้ส่งจะแสดงปุ่มเพื่อข้ามคลิปช่วงพักโฆษณาปัจจุบันหากโฆษณาแบบข้ามได้ หากต้องการให้ผู้ใช้ข้ามคลิปช่วงพักโฆษณาได้ ให้ใช้ MediaStatusModifier
เพื่อเพิ่มคำสั่งสื่อ COMMAND_SKIP_AD
ดังนี้
mMediaManager.getMediaStatusModifier().setMediaCommandSupported(MediaStatus.COMMAND_SKIP_AD, true)
mMediaManager.getMediaStatusModifier().setMediaCommandSupported(MediaStatus.COMMAND_SKIP_AD, true);
ในการจัดการคำสั่ง SKIP_AD
ให้ใช้โค้ดเรียกกลับ onSkipAd
ใน MediaCommandCallback
ดังนี้
class MyMediaCommandCallback : MediaCommandCallback() { override fun onSkipAd(requestData: RequestData?): Task{ // Skip your ad ... return Tasks.forResult (null) } } val mediaManager = CastReceiverContext.getInstance().mediaManager mediaManager.setMediaCommandCallback(MyMediaCommandCallback())
public class MyMediaCommandCallback extends MediaCommandCallback { @Override public TaskonSkipAd(RequestData requestData) { // Skip your ad ... return Tasks.forResult(null); } } MediaManager mediaManager = CastReceiverContext.getInstance().getMediaManager(); mediaManager.setMediaCommandCallback(new MyMediaCommandCallback());
การต่อภาพฝั่งไคลเอ็นต์
การต่อโฆษณาฝั่งไคลเอ็นต์
คือจุดที่โฆษณาไม่ได้ฝังอยู่ในสตรีม สำหรับ Cast Connect นอกจากการอัปเดต AdBreakStatus
ใน MediaStatusModifier
แล้ว คุณต้องตั้งค่าความเร็วในการเล่นเป็น 0 ใน PlaybackStateCompat
เพื่อให้ผู้ส่งรู้ว่าต้องหยุดความคืบหน้าของไทม์ไลน์ของเนื้อหา
// 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())
// 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());
เมื่อโฆษณาเล่นจบแล้ว คุณควรกลับมาใช้ความเร็วในการเล่นก่อนหน้านี้
การต่อฝั่งเซิร์ฟเวอร์
สําหรับการเย็บฝั่งเซิร์ฟเวอร์ โฆษณาจะถูกฝังไว้ ดังนั้นเซิร์ฟเวอร์จะคาดการณ์สตรีมเดียวที่มีทั้งเนื้อหาและโฆษณา ในกรณีนี้ การเล่นสามารถดำเนินไปได้ตามปกติเนื่องจากไทม์ไลน์มีระยะเวลาของโฆษณาเพิ่มเติมจากเนื้อหา