Triển khai API cùng xem

Trang này mô tả cách sử dụng API cùng xem để hỗ trợ tình huống 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 một CoWatchingClient đối tượng đại diện cho một phiên cùng xem.

Để sử dụng SDK Chia sẻ trực tiếp trên 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 hàm newSessionBuilder từ AddonClient để trả về một trình tạo cho một AddonSession. newSessionBuilder triển khai AddonSessionHandler để xử lý các lệnh gọi lại do tiện ích bổ sung cho phiên.

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

Mã mẫu sau đây minh hoạ quá trình khởi chạy cơ bản của ứng dụng cùng xem đối tượng:

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 hành động (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 để những hành động đó có thể được đồng thời tương tác với những người tham gia khác trong trải nghiệm cùng xem. Ví dụ về cách thông báo cho thư viện về nhiều tiểu bang, hãy xem phần Tải đã 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 vào bộ đệm, do trước đó đã chuyển nội dung đa phương tiện, tìm kiếm nội dung nghe nhìn hoặc mạng bình thường tắc nghẽn.
  • 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 đa phương tiệ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ỷ lệ phát nội dung nghe nhìn sang 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 những 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 nội dung đa phương tiện để Meet có thể phản ánh 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 thông tin đó cho những người dùng khác. Cũng có một lựa 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 các bản cập nhật đến từ những người tham gia từ xa, bạn phải cung cấp Làm quen với cách quản lý trực tiếp trạng thái phát nội dung nghe nhìn cục bộ bằng cách sử dụng thời gian CoWatchingHandler.onCoWatchingStateChanged() .

Meet cũng cần truy xuất vị trí hiện tại của nội dung nghe nhìn bằng cách gọi CoWatchingHandler.onStateQuery() . Lệnh này được gọi thường xuyên, vì vậy, lệnh này phải được ghi sao cho 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 của 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));
  }
}