Co-Watching API প্রয়োগ করুন

এই পৃষ্ঠাটি বর্ণনা করে যে কীভাবে সহ-দেখার দৃশ্যকে সমর্থন করার জন্য কো-ওয়াচিং API ব্যবহার করতে হয়।

প্রাথমিক সেটআপ

লাইব্রেরি ব্যবহারের জন্য প্রস্তুত করতে, লাইভ শেয়ারিং অ্যাপ্লিকেশনটিকে একটি CoWatchingClient অবজেক্ট শুরু করা উচিত যা একটি সহ-দেখার অধিবেশন উপস্থাপন করে।

Meet Live Sharing SDK ব্যবহার করতে, AddonClientFactory.getClient পদ্ধতিতে কল করুন। এটি একটি AddonClient ফেরত দেয় যা সহ-দেখার সেশনের জন্য এন্ট্রি পয়েন্ট হিসাবে কাজ করে।

ক্লায়েন্ট ব্যবহার করতে, একটি নতুন AddonSession এর জন্য একজন নির্মাতাকে ফেরত দিতে AddonClient থেকে newSessionBuilder পদ্ধতিতে কল করুন। সেশনের জন্য অ্যাড-অন দ্বারা প্রদত্ত কলব্যাকগুলি পরিচালনা করতে 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 : মিটকে অবহিত করে যে মিডিয়াটি বাফারিংয়ের কারণে, পূর্ববর্তী মিডিয়া সুইচ, মিডিয়া অনুসন্ধান বা স্বাভাবিক নেটওয়ার্ক কনজেশনের কারণে চালানোর জন্য প্রস্তুত নয়।
  • CoWatchingClient.notifyEnded : মিটকে সূচিত করে যে মিডিয়া প্লেয়ার বর্তমান মিডিয়ার শেষে পৌঁছেছে।
  • CoWatchingClient.notifyPauseState Meet কে অবহিত করুন যে ব্যবহারকারী মিডিয়ার প্লেব্যাক পজ বা আনপজ করেছেন, তাই Meet অন্যান্য ব্যবহারকারীদের জন্য সেই ক্রিয়াটি প্রতিফলিত করতে পারে।
  • CoWatchingClient.notifyPlayoutRate : Meet সূচিত করে যে ব্যবহারকারী মিডিয়ার প্লেআউট রেটকে একটি নতুন মান (উদাহরণস্বরূপ, 1.25x) আপডেট করেছে।
  • CoWatchingClient.notifyQueueUpdate : Meet কে সূচিত করে যে সারি পরিবর্তিত হয়েছে, তাই Meet অন্যান্য ব্যবহারকারীদের জন্য এটি মিরর করতে পারে।
  • CoWatchingClient.notifyReady : মিটকে অবহিত করে যে বাফারিং সম্পূর্ণ হয়েছে এবং মিডিয়া এখন চালানোর জন্য প্রস্তুত, সরবরাহ করা টাইমস্ট্যাম্প থেকে শুরু করে।
  • 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);
};

দূরবর্তী অবস্থা পরিচালনা করুন

দূরবর্তী অংশগ্রহণকারীদের থেকে ইনকামিং আপডেটগুলি প্রয়োগ করতে, আপনাকে অবশ্যই CoWatchingHandler.onCoWatchingStateChanged() কলব্যাক ব্যবহার করে স্থানীয় মিডিয়া প্লেআউট অবস্থা পরিচালনা করার জন্য Meet-কে একটি উপায় অফার করতে হবে।

CoWatchingHandler.onStateQuery() কলব্যাকে কল করে Meet-কে মিডিয়া প্লেআউটের বর্তমান অবস্থান পুনরুদ্ধার করতে হবে। এটিকে নিয়মিত বলা হয়, তাই এটিকে পারফরম্যান্স হিসেবে লেখা উচিত (উদাহরণস্বরূপ, <100 ms)।

নিম্নলিখিত কোড নমুনা 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));
  }
}