Triển khai API cùng xem

Trang này mô tả cách dùng API cùng xem để hỗ trợ tình huống cùng xem.

Thiết lập ban đầu

Để chuẩn bị thư viện cho việc sử dụng, ứng dụng chia sẻ trực tiếp phải khởi chạy đối tượng CoWatchingClient đại diện cho một 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ề AddonClient đóng vai trò là điểm truy cập 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 do 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 thao tác (ví dụ: tạm dừng hoặc tìm kiếm nội dung nghe nhìn phát trên thiết bị của họ), thư viện phải được thông báo để có thể phản chiếu những hành động đó cho những người tham gia khác trong trải nghiệm cùng xem. Để biết 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 bị lưu vào bộ đệm, do có sự kiện chuyển đổi nội dung nghe nhìn trước đó, 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 đã đến cuối 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 tiếp tục phát nội dung nghe nhìn để Meet có thể phản chiếu 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ỷ lệ phát nội dung đa phương tiệ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 chiếu 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 kiếm điểm phát nội dung nghe nhìn, để Meet có thể phản chiếu hành động đó 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 nghe nhìn đó cho những 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 minh hoạ 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 thông tin cập nhật đến từ những người tham gia từ xa, bạn phải cung cấp cho Meet một cách để quản lý trực tiếp trạng thái phát nội dung nghe nhìn trên máy bằ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 nội dung nghe nhìn phát bằng cách gọi lệnh gọi lại CoWatchingHandler.onStateQuery(). Lệnh này được gọi thường xuyên, vì vậy phải được viết để 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));
  }
}