หน้านี้จะอธิบายวิธีใช้ API การดูร่วมกันเพื่อรองรับ การรับชมร่วมกัน
การตั้งค่าเบื้องต้น
เพื่อเตรียมไลบรารีให้พร้อมใช้งาน แอปพลิเคชันการแชร์สดควรเริ่มต้น
CoWatchingClient
ซึ่งแสดงเซสชันการดูร่วมกัน
หากต้องการใช้ SDK การแชร์สดของ Meet ให้เรียกใช้
AddonClientFactory.getClient
ซึ่งแสดงผลเป็น
AddonClient
ซึ่งทำหน้าที่เป็นจุดแรกเข้าสำหรับเซสชันการดูร่วมกัน
หากต้องการใช้ไคลเอ็นต์ ให้เรียกใช้
newSessionBuilder
จาก AddonClient
เพื่อแสดงผลเครื่องมือสร้างสำหรับ
AddonSession
newSessionBuilder
ใช้เมธอด
AddonSessionHandler
ในการจัดการกับ Callback ที่ให้บริการโดย
สำหรับเซสชัน
หากต้องการเริ่มเซสชัน ให้เพิ่มเมธอด
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.25x)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()
Callback
Meet จะต้องเรียกดูตำแหน่งปัจจุบันของสื่อด้วย
Playout โดยการเรียก
CoWatchingHandler.onStateQuery()
Callback เราเรียกสิ่งนี้เป็นประจำ คุณจึงควรเขียนคำแปลให้มีประสิทธิภาพ
(เช่น <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));
}
}