ช่วงพักโฆษณา
iOS Sender SDK ให้การสนับสนุนสำหรับช่วงพักโฆษณาและโฆษณาที่แสดงร่วมภายในสตรีมสื่อที่ระบุ
ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีการทำงานของช่วงพักโฆษณาได้ในภาพรวมช่วงพักโฆษณาในเว็บรีซีฟเวอร์
แม้ว่าจะระบุช่วงพักโฆษณาได้ทั้งของผู้ส่งและผู้รับ แต่เราขอแนะนำให้ระบุในตัวรับเว็บและตัวรับสัญญาณ Android TV เพื่อให้ทำงานสอดคล้องกันในทุกแพลตฟอร์ม
ใน iOS ให้ระบุช่วงพักโฆษณาในคำสั่งโหลดโดยใช้
GCKAdBreakClipInfo
และ GCKAdBreakInfo
ดังนี้
let breakClip1Builder = GCKAdBreakClipInfoBuilder(adBreakClipID: "bc0") breakClip1Builder.title = "Clip title" if let posterUrl = URL(string: "https://www.some.url") { breakClip1Builder.posterURL = posterUrl } breakClip1Builder.duration = 60 breakClip1Builder.whenSkippable = 5 // Set this field so that the ad is skippable let breakClip1 = breakClip1Builder.build() let breakClip2 = ... let breakClip3 = ... let break1 = GCKAdBreakInfoBuilder(adBreakID: "b0", adBreakClipIds: ["bc0", "bc1", "bc2"]).build() let mediaInfoBuilder = GCKMediaInformationBuilder(entity: "entity") ... mediaInfoBuilder.adBreaks = [break1] mediaInfoBuilder.adBreakClips = [breakClip1, breakClip2, breakClip3] ... mediaInformation = mediaInfoBuilder.build() let mediaLoadRequestDataBuilder = GCKMediaLoadRequestDataBuilder() mediaLoadRequestDataBuilder.mediaInformation = mediaInformation sessionManager.currentSession?.remoteMediaClient?.loadMedia(with: mediaLoadRequestDataBuilder.build())
GCKAdBreakClipInfoBuilder *breakClipInfoBuilder = [[GCKAdBreakClipInfoBuilder alloc] initWithAdBreakClipID:@"bc0"]; breakClipInfoBuilder.title = @"Clip title"; breakClipInfoBuilder.posterURL = [[NSURL alloc] initWithString:@"https://www.some.url"]; breakClipInfoBuilder.duration = 60; breakClipInfoBuilder.whenSkippable = 5; GCKAdBreakClipInfo *breakClip1 = breakClipInfoBuilder.build; GCKAdBreakClipInfo *breakClip2 = ... GCKAdBreakClipInfo *breakClip3 = ... GCKAdBreakInfo *break1 = [[GCKAdBreakInfoBuilder alloc] initWithAdBreakID:@"b0" adBreakClipIds:@[@"bc0", @"bc1", @"bc2"]].build; GCKMediaInformationBuilder *mediaInfoBuilder = [[GCKMediaInformationBuilder alloc] initWithEntity:@"entity"]; ... mediaInfoBuilder.adBreaks = @[break1]; mediaInfoBuilder.adBreakClips = @[breakClip1, breakClip2, breakClip3]; ... self.mediaInformation = [mediaInfoBuilder build]; GCKMediaLoadRequestDataBuilder *mediaLoadRequestDataBuilder = [[GCKMediaLoadRequestDataBuilder alloc] init]; mediaLoadRequestDataBuilder.mediaInformation = self.mediaInformation; // Send a load request to the remote media client. GCKRequest *request = [self.sessionManager.currentSession.remoteMediaClient loadMediaWithLoadRequestData:[mediaLoadRequestDataBuilder build]];
อัตราการเล่นที่เปลี่ยนแปลงได้
แอปของคุณสามารถแสดงและเปลี่ยนอัตราการเล่นสำหรับรายการสื่อปัจจุบัน
คุณสามารถตั้งค่าอัตราโดยใช้ -[setPlaybackRate:]
หรือ
-[setPlaybackRate:customData:]
ของ
GCKRemoteMediaClient
เข้าถึง GCKUIPlaybackRateController
โดยใช้ playbackRateController
ของ
GCKUIMediaController
และแสดงอัตราการเล่นปัจจุบันโดยใช้ playbackRate
จาก GCKUIPlaybackRateController
รหัสตัวอย่าง
ไฟล์ 2 ไฟล์ต่อไปนี้ใช้ GCKUIPlaybackRateController
ซึ่งควบคุมอัตราการเล่นด้วยการควบคุมที่แบ่งเป็นกลุ่มๆ ที่มีปุ่ม "ปกติ" "ความเร็วครึ่งหนึ่ง" และ "ความเร็ว 2 เท่า"
import GoogleCast /** * An implementation of GCKUIPlaybackRateController that controls playback rate * using a segmented control that has "normal", "half speed", and "double speed" * buttons. */ class SegmentedButtonPlaybackRateController: GCKUIPlaybackRateController { static let kSegmentNormal = 0; static let kSegmentHalfSpeed = 1; static let kSegmentDoubleSpeed = 2; var segmentedControl: UISegmentedControl! override var playbackRate: Float { didSet { var buttonIndex = 0 // Map the playback rate to one of our three supported speeds. if playbackRate == 1.0 { buttonIndex = SegmentedButtonPlaybackRateController.kSegmentNormal } else if playbackRate < 1.0 { buttonIndex = SegmentedButtonPlaybackRateController.kSegmentHalfSpeed } else { buttonIndex = SegmentedButtonPlaybackRateController.kSegmentDoubleSpeed } segmentedControl?.selectedSegmentIndex = buttonIndex } } override var inputEnabled: Bool { didSet { segmentedControl?.isEnabled = inputEnabled } } /** * Designated initializer. * * @param segmentedControl The segmented control for changing/displaying the * playback rate. */ convenience init(_ segmentedControl: UISegmentedControl) { self.init() self.segmentedControl = segmentedControl; segmentedControl.addTarget(self, action: #selector(segmentedControlTapped(sender:)), for: UIControl.Event.valueChanged) } @objc func segmentedControlTapped(sender: UISegmentedControl) { var playbackRate: Float = 1.0 switch segmentedControl?.selectedSegmentIndex { case SegmentedButtonPlaybackRateController.kSegmentHalfSpeed: playbackRate = 0.5; case SegmentedButtonPlaybackRateController.kSegmentDoubleSpeed: playbackRate = 2.0; case SegmentedButtonPlaybackRateController.kSegmentNormal: fallthrough default: playbackRate = 1.0; } self.playbackRate = playbackRate } }
SegmentedButtonPlaybackRateController.h
#import <GoogleCast/GoogleCast.h> #import <UIKit/UIKit.h> /** * An implementation of GCKUIPlaybackRateController that controls playback rate * using a segmented control that has "normal", "half speed", and "double speed" * buttons. */ @interface SegmentedButtonPlaybackRateController : GCKUIPlaybackRateController /** * Designated initializer. * * @param segmentedControl The segmented control for changing/displaying the * playback rate. */ - (instancetype)initWithSegmentedControl:(UISegmentedControl *)segmentedControl; @end
SegmentedButtonPlaybackRateController.m
#import "SegmentedButtonPlaybackRateController.h" @interface SegmentedButtonPlaybackRateController () { UISegmentedControl *_segmentedControl; } @end static const NSInteger kSegmentNormal = 0; static const NSInteger kSegmentHalfSpeed = 1; static const NSInteger kSegmentDoubleSpeed = 2; @implementation SegmentedButtonPlaybackRateController - (instancetype)initWithSegmentedControl:(UISegmentedControl *)segmentedControl { if (self = [super init]) { _segmentedControl = segmentedControl; [_segmentedControl addTarget:self action:@selector(segmentedControlTapped:) forControlEvents:UIControlEventValueChanged]; } return self; } - (void)setPlaybackRate:(float)playbackRate { [super setPlaybackRate:playbackRate]; NSInteger buttonIndex = 0; // Map the playback rate to one of our three supported speeds. if (playbackRate == 1.0) { buttonIndex = kSegmentNormal; } else if (playbackRate < 1.0) { buttonIndex = kSegmentHalfSpeed; } else { buttonIndex = kSegmentDoubleSpeed; } _segmentedControl.selectedSegmentIndex = buttonIndex; } - (void)setInputEnabled:(BOOL)inputEnabled { _segmentedControl.enabled = inputEnabled; [super setInputEnabled:inputEnabled]; } - (void)segmentedControlTapped:(id)sender { float playbackRate; switch (_segmentedControl.selectedSegmentIndex) { case kSegmentHalfSpeed: playbackRate = 0.5; break; case kSegmentDoubleSpeed: playbackRate = 2.0; break; case kSegmentNormal: default: playbackRate = 1.0; break; } self.playbackRate = playbackRate; } @end
เพิ่มแชแนลที่กำหนดเอง
เฟรมเวิร์ก Cast มี 2 วิธีในการสร้างช่องเพื่อส่งข้อความที่กำหนดเองไปยัง Web Receiver ดังนี้
GCKCastChannel
มีไว้เพื่อมีการแยกประเภทย่อยเพื่อใช้ช่องที่ไม่ใช่เรื่องสำคัญและมีสถานะเกี่ยวข้องกันGCKGenericChannel
มอบเป็นทางเลือกในการแยกประเภทย่อย โดยจะส่งข้อความที่ได้รับไปยังผู้รับมอบสิทธิ์เพื่อให้นำไปประมวลผลที่อื่นได้
ต่อไปนี้คือตัวอย่างการใช้งาน GCKCastChannel
class HGCTextChannel: GCKCastChannel { override func didReceiveTextMessage(_ message: String) { print("received message: \(message)") } }
HGCTextChannel.h
#import <GoogleCast/GCKCastChannel.h> @interface HGCTextChannel : GCKCastChannel @end
HGCTextChannel.m
#import "HGCTextChannel.h" @implementation HGCTextChannel - (void)didReceiveTextMessage:(NSString*)message { NSLog(@"received message: %@", message); } @end
ลงทะเบียนแชแนลได้ทุกเมื่อ หากปัจจุบันเซสชันไม่ได้อยู่ในสถานะที่เชื่อมต่อ ช่องจะเชื่อมต่อโดยอัตโนมัติเมื่อมีการเชื่อมต่อเซสชัน โดยมีเนมสเปซของช่องอยู่ในรายการเนมสเปซที่รองรับของข้อมูลเมตาของแอป Web Receiver
แชแนลที่กำหนดเองแต่ละรายการกำหนดโดยเนมสเปซที่ไม่ซ้ำกันและต้องขึ้นต้นด้วยคำนำหน้า urn:x-cast:
เช่น urn:x-cast:com.example.custom
เป็นไปได้ที่จะมีแชแนลที่กำหนดเองหลายแชแนล โดยแต่ละแชแนลมีเนมสเปซที่ไม่ซ้ำกัน แอป Web Receiver ยังส่งและรับข้อความโดยใช้เนมสเปซเดียวกันได้ด้วย
var error: GCKError? let textChannel = HGCTextChannel.init(namespace: "urn:x-cast:com.google.cast.sample.helloworld") sessionManager.currentCastSession?.add(textChannel) textChannel.sendTextMessage("Hello World", error: &error) if error != nil { print("Error sending text message \(error.debugDescription)") }
NSError *error; HGCTextChannel *textChannel = [[HGCTextChannel alloc] initWithNamespace:@"urn:x-cast:com.google.cast.sample.helloworld"]; [sessionManager.currentCastSession addChannel:textChannel]; [textChannel sendTextMessage:@"Hello World" error:&error]; if (error != nil) { NSLog(@"Error sending text message: %@", error); }
หากต้องการระบุตรรกะที่จำเป็นต้องดำเนินการเมื่อมีการเชื่อมต่อหรือยกเลิกการเชื่อมต่อช่องทางหนึ่งๆ ให้ลบล้างเมธอด -[didConnect]
และ -[didDisconnect]
หากใช้ GCKCastChannel
หรือระบุการติดตั้งใช้งานสำหรับเมธอด -[castChannelDidConnect:]
และ -[castChannelDidDisconnect:]
ของ GCKGenericChannelDelegate
หากใช้ GCKGenericChannel
การรองรับการเล่นอัตโนมัติ
ดู API การเล่นอัตโนมัติและการจัดคิว
ลบล้างการเลือกและการแคชรูปภาพ
คอมโพเนนต์ต่างๆ ของเฟรมเวิร์ก (ได้แก่ กล่องโต้ตอบของ Cast, ตัวควบคุมขนาดเล็ก, ตัวควบคุมที่ขยาย และ GCKUIMediaController
หากกำหนดค่าไว้) จะแสดงอาร์ตเวิร์กสำหรับสื่อที่กำลังแคสต์อยู่ โดยทั่วไป URL ไปยังอาร์ตเวิร์กรูปภาพจะรวมอยู่ใน GCKMediaMetadata
สำหรับสื่อ แต่แอปผู้ส่งอาจมีแหล่งที่มาสำรองสำหรับ URL
โปรโตคอล GCKUIImagePicker
จะกำหนดวิธีการเลือกรูปภาพที่เหมาะสมสำหรับการใช้งานและขนาดที่ต้องการ ซึ่งมีเมธอด -[getImageWithHints:fromMetadata:]
ซึ่งใช้เพียงออบเจ็กต์ GCKUIImageHints
และออบเจ็กต์ GCKMediaMetadata
เป็นพารามิเตอร์ จึงแสดงผลออบเจ็กต์ GCKImage
เป็นผลลัพธ์ เฟรมเวิร์กจะมีการติดตั้งใช้งาน GCKUIImagePicker
ตามค่าเริ่มต้น ซึ่งจะเลือกรูปภาพแรกในรายการรูปภาพในออบเจ็กต์ GCKMediaMetadata
เสมอ แต่แอปสามารถเสนอการติดตั้งใช้งานทางเลือกได้โดยตั้งค่าพร็อพเพอร์ตี้ imagePicker
ของรายการเดียว GCKCastContext
นอกจากนี้ โปรโตคอล GCKUIImageCache
ยังกำหนดวิธีการแคชรูปภาพที่ดาวน์โหลดโดยเฟรมเวิร์กที่ใช้ HTTPS อีกด้วย เฟรมเวิร์กนี้จะใช้งาน GCKUIImageCache
ตามค่าเริ่มต้น ซึ่งจะจัดเก็บไฟล์รูปภาพที่ดาวน์โหลดไว้ในไดเรกทอรีแคชของแอป แต่แอปสามารถติดตั้งใช้งานได้อีกโดยการตั้งค่าพร็อพเพอร์ตี้ imageCache
ของ GCKCastContext
เดี่ยว
ขั้นตอนถัดไป
ส่วนนี้ของฟีเจอร์ที่คุณสามารถเพิ่มลงในแอปผู้ส่ง iOS ได้ ขณะนี้คุณสามารถสร้างแอปผู้ส่งสำหรับแพลตฟอร์มอื่นได้ (Android หรือเว็บ) หรือสร้างตัวรับเว็บ