หน้านี้จะอธิบายวิธีใช้ API การดูร่วมกันเพื่อสนับสนุนสถานการณ์การดูร่วมกัน
การตั้งค่าเบื้องต้น
แอปพลิเคชันการแชร์สดควรเริ่มต้นออบเจ็กต์ CoWatchingClient
ซึ่งแสดงเซสชันการดูร่วมกันเพื่อเตรียมไลบรารีสำหรับการใช้งาน
หากต้องการใช้ SDK การแชร์สดของ Meet ให้เรียกใช้เมธอด AddonClientFactory.getClient
ซึ่งแสดงผล AddonClient
ที่ทำหน้าที่เป็นจุดแรกเข้าสำหรับเซสชันการดูร่วมกัน
หากต้องการใช้ไคลเอ็นต์ ให้เรียกใช้เมธอด newSessionBuilder
จาก AddonClient
เพื่อแสดงเครื่องมือสร้างสำหรับ AddonSession
ใหม่
newSessionBuilder
ใช้อินเทอร์เฟซ AddonSessionHandler
เพื่อจัดการการเรียกกลับที่ได้จากส่วนเสริมสำหรับเซสชัน
หากต้องการเริ่มเซสชัน ให้เพิ่มเมธอด withCoWatching
ลงในเครื่องมือสร้าง
ตัวอย่างโค้ดต่อไปนี้แสดงการเริ่มต้นพื้นฐานของออบเจ็กต์ไคลเอ็นต์การดูร่วมกัน
Java
class AwesomeVideoAddonSessionHandler implements AddonSessionHandler {}
// For sample implementation, see the "Manage remote state" section below.
class AwesomeVideoCoWatchingHandler implements CoWatchingHandler {}
public ListenableFuture<AddonSession> initialSetup() {
AddonClient meetClient = AddonClientFactory.getClient();
return meetClient
.newSessionBuilder(
new AwesomeVideoAddonSessionHandler())
.withCoWatching(new AwesomeVideoCoWatchingHandler())
.begin();
}
แจ้งเตือนการดำเนินการของผู้ใช้
เมื่อผู้ใช้ในพื้นที่ดำเนินการบางอย่าง เช่น หยุดเล่นชั่วคราวหรือกรอการเล่นสื่อในอุปกรณ์ จะต้องมีการแจ้งไปยังคลังเพื่อให้ผู้เข้าร่วมคนอื่นๆ ได้รับประสบการณ์การรับชมร่วมกันแบบเดียวกัน ลองดูตัวอย่างวิธีแจ้งเตือนไลบรารีสำหรับหลายรัฐได้ที่เริ่มต้นใช้งาน
คุณควบคุมสถานะการดูร่วมกันได้โดยใช้วิธีการเหล่านี้
CoWatchingClient.notifyBuffering
: แจ้ง Meet ว่าสื่อไม่พร้อมเล่นเนื่องจากมีการบัฟเฟอร์ เนื่องจากมีการเปลี่ยนสื่อก่อนหน้านี้ การค้นหาสื่อ หรือความหนาแน่นในเครือข่ายตามปกติCoWatchingClient.notifyEnded
: แจ้ง Meet ว่าโปรแกรมเล่นสื่อเล่นไปถึงจุดสิ้นสุดของสื่อปัจจุบันแล้วCoWatchingClient.notifyPauseState
แจ้งให้ Meet ทราบว่าผู้ใช้ได้หยุดเล่นสื่อชั่วคราวหรือยกเลิกการหยุดเล่นสื่อชั่วคราว เพื่อให้ Meet มิเรอร์การดำเนินการดังกล่าวไปยังผู้ใช้รายอื่นได้CoWatchingClient.notifyPlayoutRate
: แจ้ง Meet ว่าผู้ใช้ได้อัปเดตอัตราการเล่นสื่อของสื่อเป็นค่าใหม่ (เช่น 1.25 เท่า)CoWatchingClient.notifyQueueUpdate
: แจ้ง Meet ว่าคิวมีการเปลี่ยนแปลง เพื่อให้ Meet มิเรอร์คิวของผู้ใช้รายอื่นได้CoWatchingClient.notifyReady
: แจ้ง Meet ว่าบัฟเฟอร์เสร็จสมบูรณ์และสื่อพร้อมให้เล่นแล้ว โดยเริ่มจากการประทับเวลาที่ระบุCoWatchingClient.notifySeekToTimestamp
: แจ้ง Meet ว่าผู้ใช้กำลังค้นหาจุดเล่นของสื่อเพื่อให้ Meet มิเรอร์การดำเนินการนั้นสำหรับผู้ใช้รายอื่นได้CoWatchingClient.notifySwitchedToMedia
: แจ้ง Meet ว่าผู้ใช้ได้เปลี่ยนสื่อแล้ว เพื่อให้ Meet ส่งต่อสื่อดังกล่าวไปให้ผู้ใช้รายอื่นได้ นอกจากนี้ยังมีตัวเลือกสำหรับ การอัปเดตคิวพร้อมกันด้วย
ตัวอย่างโค้ดต่อไปนี้แสดงวิธีการแจ้งเตือนผู้ใช้
Java
public void onVideoPaused(Duration currentTimestamp) {
// Use Meet to broadcast the pause state to ensure other participants also pause.
this.session.getCoWatching().notifyPauseState(/* paused= */ true, currentTimestamp);
};
จัดการสถานะระยะไกล
หากต้องการใช้ข้อมูลอัปเดตขาเข้าจากผู้เข้าร่วมระยะไกล คุณต้องเสนอวิธีจัดการสถานะการเล่นสื่อในเครื่องโดยตรงผ่าน
การเรียกกลับ CoWatchingHandler.onCoWatchingStateChanged()
Meet ยังต้องดึงข้อมูลตำแหน่งปัจจุบันของการเล่นสื่อโดยเรียกใช้โค้ดเรียกกลับ CoWatchingHandler.onStateQuery()
ด้วย เราเรียกฟังก์ชันนี้ว่าเป็นประจำ ดังนั้นควรเขียนให้มีประสิทธิภาพ (เช่น <100 มิลลิวินาที)
ตัวอย่างโค้ดต่อไปนี้แสดงการใช้งาน CoWatchingHandler
Java
class AwesomeVideoCoWatchingHandler implements CoWatchingHandler {
/** Applies incoming playback state to the local video. */
public void onCoWatchingStateChanged(CoWatchingState newState) {
// Handle transition to new video.
if (!newState.mediaId().equals(this.videoPlayer.videoUrl)) {
this.videoPlayer.loadVideo(newState.mediaId());
}
// Only adjust the local video playout if it's sufficiently diverged from the timestamp in the
// applied update.
if (newState
.mediaPlayoutPosition()
.minus(this.videoPlayer.videoTimestamp)
.compareTo(Duration.ofMillis(500))
> 0) {
this.videoPlayer.seek(newState.mediaPlayoutPosition());
}
// Update pause state, if necessary.
if (newState.playbackState().equals(PLAY) && this.videoPlayer.isPaused) {
this.videoPlayer.unpause();
} else if (newState.playbackState().equals(PAUSE) && !this.videoPlayer.isPaused) {
this.videoPlayer.pause();
}
}
/** Returns local video playback state. */
public Optional<QueriedCoWatchingState> onStateQuery() {
return Optional.of(QueriedCoWatchingState.of(
/* mediaPlayoutPosition= */ this.videoPlayer.videoTimestamp));
}
}