นำ Co-Watching API ไปใช้

หน้านี้จะอธิบายวิธีใช้ 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));
  }
}