นำ Co-Watching API ไปใช้

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