Triển khai API cùng xem

Trang này mô tả cách sử dụng API cùng xem để hỗ trợ trường hợp cùng xem.

Thiết lập ban đầu

Để chuẩn bị sử dụng thư viện, ứng dụng chia sẻ trực tiếp phải khởi chạy đối tượng CoWatchingClient đại diện cho phiên cùng xem.

Để sử dụng SDK Chia sẻ trực tiếp của Meet, hãy gọi phương thức AddonClientFactory.getClient. Thao tác này sẽ trả về một AddonClient đóng vai trò là điểm bắt đầu của phiên cùng xem.

Để sử dụng ứng dụng, hãy gọi phương thức newSessionBuilder từ AddonClient để trả về trình tạo cho AddonSession mới. newSessionBuilder triển khai giao diện AddonSessionHandler để xử lý các lệnh gọi lại mà tiện ích bổ sung cung cấp cho phiên.

Để bắt đầu một phiên, hãy thêm phương thức withCoWatching vào trình tạo.

Mã mẫu sau đây cho thấy cách khởi chạy cơ bản của đối tượng ứng dụng cùng xem:

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();
}

Thông báo về hành động của người dùng

Khi người dùng cục bộ thực hiện các thao tác (ví dụ: tạm dừng hoặc tìm cách phát nội dung nghe nhìn trên thiết bị của họ), bạn phải thông báo cho thư viện để hệ thống có thể phản ánh các thao tác đó cho những người tham gia khác trong trải nghiệm cùng xem. Để xem ví dụ về cách thông báo cho thư viện về nhiều trạng thái, hãy xem phần Bắt đầu.

Bạn có thể kiểm soát trạng thái cùng xem bằng các phương thức sau:

  • CoWatchingClient.notifyBuffering: Thông báo cho Meet rằng nội dung nghe nhìn chưa sẵn sàng phát do lưu vào bộ đệm, do nút chuyển nội dung nghe nhìn trước đó, lượt tìm kiếm nội dung nghe nhìn hoặc tình trạng nghẽn mạng thông thường.
  • CoWatchingClient.notifyEnded: Thông báo cho Meet rằng trình phát nội dung đa phương tiện đã kết thúc nội dung nghe nhìn hiện tại.
  • CoWatchingClient.notifyPauseState Thông báo cho Meet rằng người dùng đã tạm dừng hoặc huỷ tạm dừng phát nội dung nghe nhìn để Meet có thể phản ánh hành động đó cho người dùng khác.
  • CoWatchingClient.notifyPlayoutRate: Thông báo cho Meet rằng người dùng đã cập nhật tốc độ phát nội dung nghe nhìn thành một giá trị mới (ví dụ: 1, 25x).
  • CoWatchingClient.notifyQueueUpdate: Thông báo cho Meet rằng hàng đợi đã thay đổi để Meet có thể phản ánh nội dung đó cho người dùng khác.
  • CoWatchingClient.notifyReady: Thông báo cho Meet rằng quá trình lưu vào bộ đệm đã hoàn tất và nội dung nghe nhìn hiện đã sẵn sàng phát, bắt đầu từ dấu thời gian được cung cấp.
  • CoWatchingClient.notifySeekToTimestamp: Thông báo cho Meet rằng người dùng đã tìm điểm phát của nội dung nghe nhìn để Meet có thể đồng bộ hoá hai chiều thao tác đó cho người dùng khác.
  • CoWatchingClient.notifySwitchedToMedia: Thông báo cho Meet rằng người dùng đã chuyển đổi nội dung nghe nhìn để Meet có thể chuyển nội dung đó cho người dùng khác. Ngoài ra, còn có tuỳ chọn cập nhật đồng thời hàng đợi.

Mã mẫu sau đây cho biết cách thông báo cho người dùng:

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);
};

Quản lý trạng thái từ xa

Để áp dụng bản cập nhật đến từ người tham gia từ xa, bạn phải cung cấp cho Meet cách trực tiếp quản lý trạng thái phát nội dung nghe nhìn trên thiết bị bằng cách sử dụng lệnh gọi lại CoWatchingHandler.onCoWatchingStateChanged().

Meet cũng cần truy xuất vị trí hiện tại của vị trí phát nội dung nghe nhìn bằng cách gọi lệnh gọi lại CoWatchingHandler.onStateQuery(). Hàm này được gọi thường xuyên, vì vậy, nó phải được ghi để có hiệu suất cao (ví dụ: <100 mili giây).

Mã mẫu sau đây cho thấy cách triển khai 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));
  }
}