Ortak İzleme API'sini uygulayın

Bu sayfada, bir videoyu desteklemek için Co-Watching API'nin nasıl kullanılacağı açıklanmaktadır. senaryoyu ele aldık.

İlk kurulum

Kitaplığı kullanıma hazırlamak için canlı paylaşım uygulaması, CoWatchingClient nesnesini ifade eder.

Meet canlı paylaşım SDK'sını kullanmak için AddonClientFactory.getClient yöntemidir. Bu, AddonClient giriş noktası görevi görür.

İstemciyi kullanmak için newSessionBuilder yeni bir sayfa için oluşturucu döndürmek için AddonClient AddonSession. newSessionBuilder, AddonSessionHandler Search Ads 360 kullanıcı arayüzü tarafından sağlanan ekleyeceğiz.

Bir oturum başlatmak için withCoWatching yöntemini derleyin.

Aşağıdaki kod örneğinde, birlikte izleme istemcisinin temel bir ilk kullanıma hazırlanması gösterilmektedir nesne:

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

Kullanıcı işlemleri olduğunda bildirim gönder

Yerel kullanıcının medyayı duraklatma veya arama gibi bir işlem yapması bu işlemler sırasında kütüphaneye bilgi verilmesi gerekir. Böylece bu işlemler yansıtılmayı ifade eder. Örnek olarak kitaplığı birden fazla eyalet için nasıl bilgilendireceğinizi öğrenmek için başladı.

Birlikte izleme durumunu şu yöntemleri kullanarak kontrol edebilirsiniz:

  • CoWatchingClient.notifyBuffering: Meet'e medyanın çalınmaya hazır olmadığını bildirir. önceki bir medya geçişi, medya araması veya normal ağ nedeniyle arabelleğe alma işlemine tıkanıklık.
  • CoWatchingClient.notifyEnded: Meet'e medya oynatıcının sonuna ulaştığını bildirir güncel medya içerikleri.
  • CoWatchingClient.notifyPauseState Kullanıcının oynatmayı duraklattığını veya devam ettirdiğini Meet'e bildirme Böylece Meet bu işlemi diğer kullanıcılara yansıtabilir.
  • CoWatchingClient.notifyPlayoutRate: Kullanıcının, Playout oranını güncellediğini Meet'e bildirir. medyayı yeni bir değere (örneğin, 1,25x) ekleyebilirsiniz.
  • CoWatchingClient.notifyQueueUpdate: Meet'e sıranın değiştiğini bildirir. Bu nedenle, Meet, bunu diğer kullanıcılar için de yansıtabilir.
  • CoWatchingClient.notifyReady: Meet'e arabelleğe alma işleminin tamamlandığını ve medyanın hazır olduğunu bildirir artık oynatılmak için hazır, verilen zaman damgasından itibaren.
  • CoWatchingClient.notifySeekToTimestamp: Meet'e, kullanıcının oynatma noktasını istediğini bildirir Meet bu işlemi diğer kullanıcılara yansıtabilir.
  • CoWatchingClient.notifySwitchedToMedia: Meet'e, kullanıcının medya değiştirdiğini bildirir. Bu nedenle, Meet bunu diğer kullanıcılara iletebilir. Bir seçenek de var. birini seçin.

Aşağıdaki kod örneğinde, kullanıcıların nasıl bilgilendirileceği gösterilmektedir:

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

Uzak durumu yönet

Uzak katılımcılardan gelen güncellemeleri uygulamak için şunları sunmalısınız: Yerel medya oynatma durumunu doğrudan yönetmek için "the" CoWatchingHandler.onCoWatchingStateChanged() geri arama.

Meet'in, medyanın mevcut konumunu da alması gerekir. durumu şöyle sıralayabiliriz: CoWatchingHandler.onStateQuery() geri arama. Bu, düzenli olarak adlandırılır. Bu nedenle, yüksek performanslı olarak yazılmalıdır. (örneğin, <100 ms).

Aşağıdaki kod örneğinde 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));
  }
}