API Co-Watching را پیاده سازی کنید

در این صفحه نحوه استفاده از Co-Watching API برای پشتیبانی از سناریوی تماشای مشترک توضیح داده شده است.

راه اندازی اولیه

برای آماده‌سازی کتابخانه برای استفاده، برنامه اشتراک‌گذاری زنده باید یک شی CoWatchingClient را که نمایانگر یک جلسه تماشای مشترک است، مقداردهی اولیه کند.

برای استفاده از Meet Live Sharing SDK، با روش AddonClientFactory.getClient تماس بگیرید. این یک AddonClient را برمی گرداند که به عنوان نقطه ورودی برای جلسه تماشای مشترک عمل می کند.

برای استفاده از کلاینت، متد newSessionBuilder از AddonClient فراخوانی کنید تا یک سازنده برای AddonSession جدید برگرداند. newSessionBuilder رابط AddonSessionHandler را برای رسیدگی به تماس های ارائه شده توسط افزونه برای جلسه پیاده سازی می کند.

برای شروع یک جلسه، متد withCoWatching را به سازنده اضافه کنید.

نمونه کد زیر یک مقدار اولیه اولیه از شی مشتری مشترک تماشا را نشان می دهد:

جاوا

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 می تواند آن را به سایر کاربران منتقل کند. همچنین دارای گزینه ای برای به روز رسانی صف به طور همزمان.

نمونه کد زیر نحوه اطلاع رسانی به کاربران را نشان می دهد:

جاوا

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

مدیریت حالت راه دور

برای اعمال به‌روزرسانی‌های دریافتی از شرکت‌کنندگان راه دور، باید به Meet راهی برای مدیریت مستقیم وضعیت پخش رسانه محلی با استفاده از CoWatchingHandler.onCoWatchingStateChanged() ارائه دهید.

Meet همچنین باید موقعیت فعلی پخش رسانه را با فراخوانی CoWatchingHandler.onStateQuery() بازیابی کند. این به طور منظم نامیده می شود، بنابراین باید به گونه ای نوشته شود که عملکردی داشته باشد (مثلاً <100 میلی ثانیه).

نمونه کد زیر پیاده سازی CoWatchingHandler را نشان می دهد:

جاوا

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