এই পৃষ্ঠাটি বর্ণনা করে যে কীভাবে কো-ডুইং এপিআই ব্যবহার করতে হয় কো-ডুইং দৃশ্যকে সমর্থন করতে।
প্রাথমিক সেটআপ
ব্যবহারের জন্য লাইব্রেরি প্রস্তুত করতে, লাইভ শেয়ারিং অ্যাপ্লিকেশনটিকে একটি CoDoingClient
অবজেক্ট শুরু করা উচিত যা একটি সহ-করণীয় অধিবেশন উপস্থাপন করে।
Meet Live Sharing SDK ব্যবহার করতে, AddonClientFactory.getClient
পদ্ধতিতে কল করুন। এটি একটি AddonClient
প্রদান করে যা কো-ডুইং সেশনের জন্য এন্ট্রি পয়েন্ট হিসাবে কাজ করে।
ক্লায়েন্ট ব্যবহার করতে, একটি নতুন AddonSession
এর জন্য একজন নির্মাতাকে ফেরত দিতে AddonClient
থেকে newSessionBuilder
পদ্ধতিতে কল করুন। সেশনের জন্য অ্যাড-অন দ্বারা প্রদত্ত কলব্যাকগুলি পরিচালনা করতে newSessionBuilder
AddonSessionHandler
ইন্টারফেস প্রয়োগ করে।
একটি সেশন শুরু করতে, বিল্ডারের সাথে withCoDoing
পদ্ধতি যোগ করুন।
নিম্নলিখিত কোড নমুনাটি সহ-করণকারী ক্লায়েন্ট অবজেক্টের একটি প্রাথমিক শুরু দেখায়:
জাভা
class AwesomeVideoAddonSessionHandler implements AddonSessionHandler {}
//For sample implementation, see the "Handle incoming updates" section.
class AwesomeVideoCoDoingHandler implements CoDoingHandler {}
public ListenableFuture<AddonSession> initialSetup() {
AddonClient meetClient = AddonClientFactory.getClient();
return meetClient
.newSessionBuilder(
new AwesomeVideoAddonSessionHandler())
.withCoDoing(new AwesomeVideoCoDoingHandler())
.begin();
}
ভিডিও পজ করুন
একটি লাইভ শেয়ারিং অভিজ্ঞতায় অংশগ্রহণ করার সময়, যদি কোনো ব্যবহারকারী তাদের স্থানীয় ভিডিও অ্যাপে প্লেব্যাককে বিরতি দেয় তাহলে আপনাকে অবশ্যই নিশ্চিত করতে হবে যে লাইভ শেয়ারিং অভিজ্ঞতার সমস্ত অংশগ্রহণকারীরা তাদের ভিডিও পজ করেছে।
এটি করার জন্য, একটি CoDoingState
মেসেজ তৈরি করুন যাতে ভিডিওটি পজ করা হয়েছে এবং Google Meet-কে setGlobalState
পদ্ধতি ব্যবহার করে অন্য সমস্ত অংশগ্রহণকারীদের সম্প্রচার করতে বলুন। শেয়ার্ড গ্লোবাল স্টেট একটি নতুন স্টেট সেট না হওয়া পর্যন্ত সকল অংশগ্রহণকারীদের জন্য ডিফল্ট স্টেট হয়ে যায়, বিদ্যমান বা নতুন।
নিম্নলিখিত কোড নমুনা দেখায় যে কীভাবে ব্যবহারকারীদের বিরতি দেওয়া অবস্থায় অবহিত করা যায়:
জাভা
public void onVideoPaused(String videoUrl, Instant currentTimestamp) {
// Create an internal state object to share with other participants. Note: It's
// good practice to encode all metadata—even seemingly irrelevant data—into
// ActivityState updates to guard against race conditions and other subtle
// failures.
AwesomeVideoState videoState = AwesomeVideoState
.builder()
.videoUrl(videoUrl)
.videoTimestamp(currentTimestamp)
.isPaused(true)
.build();
// Create the CoDoingState object to wrap the internal state
CoDoingState coDoingState = new CoDoingState();
coDoingState.state = SerializationUtils.serialize(videoState);
// Use Meet to broadcast internal state update to all other participants
this.coDoingClient.setGlobalState(coDoingState);
};
কোড নমুনাটি লাইভ শেয়ারিং অভিজ্ঞতায় অংশগ্রহণ করার Meet-এর অন্য সব উদাহরণে সম্প্রচারিত videoState
অবজেক্টকে ট্রিগার করে। অন্যান্য অংশগ্রহণকারীদের থেকে সম্প্রচারের আপডেটগুলি কীভাবে গ্রহণ করবেন তার বিশদ বিবরণের জন্য, ইনকামিং আপডেটগুলি পরিচালনা করুন বিভাগটি দেখুন৷
নিম্নলিখিত চিত্রটি বিরাম ক্রিয়াটি ট্রিগার হওয়ার পরে ইভেন্টগুলির ক্রম বর্ণনা করে:
ভিডিও আনপজ করুন
ভিডিও পজ করার মতোই, যদি কোনো ব্যবহারকারী তাদের স্থানীয় অ্যাপে ভিডিওটি আনপজ করেন তাহলে Meet-কে অবশ্যই অন্য লাইভ শেয়ারিং অংশগ্রহণকারীদের কাছে এই অপারেশনটি সম্প্রচার করতে হবে।
প্রেরকের পক্ষ থেকে (যে ব্যবহারকারী ভিডিওটি আনপজ করেন), বিরতির উদাহরণ থেকে একমাত্র পার্থক্য হল isPaused
স্ট্যাটাস আপডেট করা হয়েছে।
নিম্নলিখিত কোড নমুনাটি দেখায় যে প্রেরকের পক্ষ থেকে ব্যবহারকারীদের কীভাবে বিরতিহীন অবস্থা সম্পর্কে অবহিত করা যায়:
জাভা
public void onVideoUnpaused(String videoUrl, Instant currentTimestamp) {
AwesomeVideoState videoState = AwesomeVideoState
.builder()
.videoUrl(videoUrl)
.videoTimestamp(currentTimestamp)
.isPaused(false)
.build();
CoDoingState coDoingState = new CoDoingState();
coDoingState.state = SerializationUtils.serialize(videoState);
this.coDoingClient.setGlobalState(coDoingState);
}
ভিডিও সন্ধান করুন
ভিডিও পজ এবং ভিডিও আনপজ করার মতোই, যদি কোনও ব্যবহারকারী স্থানীয় অ্যাপের টাইমলাইনটিকে একটি নতুন টাইমস্ট্যাম্পে টেনে আনেন, তাহলে Meet-কে অবশ্যই এই অপারেশনটি সমস্ত অংশগ্রহণকারীদের কাছে সম্প্রচার করতে হবে।
নিম্নলিখিত কোড নমুনা দেখায় কিভাবে প্রেরকের পক্ষ থেকে আপডেট করা টাইমস্ট্যাম্প ব্যবহারকারীদের অবহিত করা যায়:
জাভা
public void onVideoSeeked(String videoUrl, Instant currentTimestamp, bool isPaused) {
AwesomeVideoState videoState = AwesomeVideoState
.builder()
.videoUrl(videoUrl)
.videoTimestamp(currentTimestamp)
.isPaused(isPaused)
.build();
CoDoingState coDoingState = new CoDoingState();
coDoingState.state = SerializationUtils.serialize(videoState);
this.coDoingClient.setGlobalState(coDoingState);
}
একটি ভিন্ন ভিডিও চালান
ব্যবহারকারী যদি স্থানীয় অ্যাপে অন্য ভিডিও বেছে নিয়ে দেখা ভিডিও পরিবর্তন করে, তাহলে Meet-কে অবশ্যই সমস্ত লাইভ শেয়ারিং অংশগ্রহণকারীদের জন্য নতুন ভিডিও চালাতে হবে। পরিবর্তিত ভিডিও videoState.videoUrl
এ সংরক্ষণ করা হয়েছে।
নিম্নলিখিত কোড নমুনা দেখায় কিভাবে আপডেট করা ভিডিও URL ব্যবহারকারীদের অবহিত করা যায়:
জাভা
public void onVideoChanged(String videoUrl, Duration currentTimestamp, bool isPaused) {
AwesomeVideoState videoState = AwesomeVideoState
.builder()
.videoUrl(videoUrl)
.videoTimestamp(currentTimestamp)
.isPaused(isPaused)
.build();
CoDoingState coDoingState = new CoDoingState();
coDoingState.state = SerializationUtils.serialize(videoState);
this.coDoingClient.setGlobalState(coDoingState);
}
কো-ডিং শেষ করুন
যখন কোনও ব্যবহারকারী অ্যাক্টিভিটি শেষ করতে বেছে নেন, তখন endSession
পদ্ধতি Meet অ্যাপ থেকে সংযোগ বিচ্ছিন্ন হয়ে যায়। এটি Meet-কে মিটিং শেষ করতে বাধ্য করে না বা এটি ব্যবহারকারীকে মিটিং ছেড়ে যেতে বাধ্য করে না।
নিম্নলিখিত কোড নমুনা দেখায় কিভাবে বন্ধ সেশন ব্যবহারকারীদের অবহিত করা যায়:
জাভা
public void endCoDoing() {
this.session.endSession();
}
ইনকামিং আপডেট হ্যান্ডেল
যখন অন্য অংশগ্রহণকারীর Meet অ্যাপ সম্প্রচার পায়, তখন onGlobalStateChanged()
কলব্যাক ট্রিগার হয়। সাধারণত, স্থানীয় টাইমস্ট্যাম্প থেকে পর্যাপ্ত পরিমাণে আলাদা হলে ইনকামিং আপডেটের প্রতিক্রিয়াতে কী পদক্ষেপ নেওয়া উচিত সে সম্পর্কে ভাল সিদ্ধান্ত নেওয়া গুরুত্বপূর্ণ যেমন শুধুমাত্র আগত ভিডিও টাইমস্ট্যাম্পের সাথে মিলে যায়।
নিম্নলিখিত কোড নমুনা দেখায় কিভাবে বিভিন্ন ইনকামিং আপডেট পরিচালনা করতে হয়:
জাভা
class AwesomeVideoCoDoingHandler implements CoDoingHandler {
public void onGlobalStateChanged(CoDoingState update) {
AwesomeVideoState videoState = SerializationUtils.deserialize(update.state());
// Handle transition to new video.
if (!videoState.videoUrl.equals(this.videoPlayer.videoUrl)) {
this.videoPlayer.loadVideo(videoState.videoUrl);
}
// If the timestamp in the arriving update has sufficiently diverged, adjust
// the local video playout.
if (videoState.videoTimestamp.minus(this.videoPlayer.videoTimestamp).abs() >
Duration.ofSeconds(2)) {
this.videoPlayer.seek(videoState.videoTimestamp);
}
// Update pause state, if necessary.
if (!videoState.isPaused && this.videoPlayer.isPaused) {
this.videoPlayer.unpause();
} else if (videoState.isPaused && !this.videoPlayer.isPaused) {
this.videoPlayer.pause();
}
}
}