আপনার কাস্টম ওয়েব রিসিভারে মূল ফিচার যোগ করা

এই পৃষ্ঠায় কাস্টম ওয়েব রিসিভার অ্যাপের জন্য উপলভ্য ফিচারের কোড স্নিপেট ও বিবরণ রয়েছে।

  1. একটি cast-media-player এলিমেন্ট যা ওয়েব রিসিভারের সাথে দেওয়া বিল্ট-ইন প্লেয়ার UI-কে দেখায়।
  2. cast-media-player এলিমেন্টের জন্য কাস্টম CSS-এর মতো স্টাইলিং, যাতে বিভিন্ন UI এলিমেন্ট যেমন background-image, splash-image এবং font-family স্টাইল করা যায়।
  3. ওয়েব রিসিভার ফ্রেমওয়ার্ক লোড করার জন্য স্ক্রিপ্ট এলিমেন্ট।
  4. মেসেজ ইন্টারসেপ্ট ও ইভেন্ট ম্যানেজ করার জন্য JavaScript কোড।
  5. অটোপ্লে করার জন্য সারিতে যোগ করুন।
  6. প্লেব্যাক কনফিগার করার বিকল্প।
  7. ওয়েব রিসিভার কন্টেক্সট সেট করার বিকল্প।
  8. ওয়েব রিসিভার অ্যাপে কাজ করে এমন কমান্ড সেট করার বিকল্প।
  9. ওয়েব রিসিভার অ্যাপ্লিকেশন চালু করার জন্য জাভাস্ক্রিপ্ট কল।

অ্যাপ্লিকেশন কনফিগারেশন ও বিকল্প

অ্যাপ্লিকেশন কনফিগার করুন

CastReceiverContext হল ডেভেলপারদের জন্য উপলভ্য সবচেয়ে বাইরের ক্লাস এবং এটি অন্তর্নিহিত লাইব্রেরি লোড করা ম্যানেজ করে এবং Web Receiver SDK-এর ইনিশিয়ালাইজেশন হ্যান্ডেল করে। SDK এমন API প্রদান করে যা অ্যাপ্লিকেশন ডেভেলপারদের CastReceiverOptions-এর মাধ্যমে SDK কনফিগার করার অনুমতি দেয়। এইসব কনফিগারেশন প্রতিবার অ্যাপ্লিকেশন লঞ্চ করার সময় একবার করে মূল্যায়ন করা হয় এবং start-এ কল করার সময় ঐচ্ছিক প্যারামিটার সেট করার সময় SDK-তে পাস করা হয়।

প্রেরকের কানেকশন এখনও সক্রিয়ভাবে কানেক্ট করা আছে কিনা তা শনাক্ত করার জন্য ডিফল্ট অ্যাকশন কীভাবে ওভাররাইড করতে হয় তা নিচের উদাহরণে দেখানো হয়েছে। ওয়েব রিসিভার maxInactivity সেকেন্ড ধরে প্রেরকের সাথে যোগাযোগ করতে না পারলে, SENDER_DISCONNECTED ইভেন্ট ডিসপ্যাচ করা হয়। নিচের কনফিগারেশন এই টাইমআউট ওভাররাইড করে। সমস্যা ডিবাগ করার সময় এটি কাজে লাগতে পারে, কারণ IDLE স্ট্যাটাসে কোনও কানেক্ট করা প্রেরক না থাকলে, এটি Web Receiver অ্যাপকে Chrome রিমোট ডিবাগার সেশন বন্ধ করা থেকে আটকায়।

const context = cast.framework.CastReceiverContext.getInstance();
const options = new cast.framework.CastReceiverOptions();
options.maxInactivity = 3600; // Development only
context.start(options);

প্লেয়ার কনফিগার করুন

কন্টেন্ট লোড করার সময়, Web Receiver SDK, cast.framework.PlaybackConfig ব্যবহার করে DRM তথ্য, আবার চেষ্টা করার কনফিগারেশন এবং অনুরোধ হ্যান্ডলারের মতো প্লেব্যাক ভেরিয়েবল কনফিগার করার উপায় প্রদান করে। এই তথ্য PlayerManager ম্যানেজ করে এবং প্লেয়ার তৈরি করার সময় মূল্যায়ন করা হয়। প্রতিবার ওয়েব রিসিভার SDK-তে নতুন লোড পাস করা হলে প্লেয়ার তৈরি হয়। প্লেয়ার তৈরি করার পরে PlaybackConfig-এ করা পরিবর্তন পরবর্তী কন্টেন্ট লোড করার সময় মূল্যায়ন করা হয়। PlaybackConfig পরিবর্তন করার জন্য SDK নিম্নলিখিত পদ্ধতি প্রদান করে।

  • CastReceiverOptions.playbackConfig CastReceiverContext শুরু করার সময় ডিফল্ট কনফিগারেশন বিকল্প ওভাররাইড করতে।
  • PlayerManager.getPlaybackConfig() বর্তমান কনফিগারেশন পেতে।
  • PlayerManager.setPlaybackConfig() বর্তমান কনফিগারেশন ওভাররাইড করতে। এই সেটিংটি পরবর্তী সমস্ত লোডের ক্ষেত্রে বা আবার ওভাররাইড না করা পর্যন্ত প্রয়োগ করা হয়।
  • PlayerManager.setMediaPlaybackInfoHandler() বর্তমান কনফিগারেশনের উপরে লোড করা মিডিয়া আইটেমের জন্য অতিরিক্ত কনফিগারেশন প্রয়োগ করতে। প্লেয়ার তৈরি করার ঠিক আগে হ্যান্ডলারকে কল করা হয়। এখানে করা পরিবর্তন স্থায়ী নয় এবং getPlaybackConfig()-এ করা কোয়েরিতে অন্তর্ভুক্ত করা হয় না। পরবর্তী মিডিয়া আইটেম লোড করা হলে, এই হ্যান্ডলার আবার কল করা হয়।

CastReceiverContext শুরু করার সময় কীভাবে PlaybackConfig সেট করতে হয় তা নিচের উদাহরণে দেখানো হল। ম্যানিফেস্ট পাওয়ার জন্য কনফিগারেশন আউটগোয়িং অনুরোধ ওভাররাইড করে। হ্যান্ডলার নির্দিষ্ট করে যে CORS অ্যাক্সেস-কন্ট্রোল অনুরোধ কুকি বা অনুমোদনের হেডারের মতো ক্রেডেনশিয়াল ব্যবহার করে করা উচিত।

const playbackConfig = new cast.framework.PlaybackConfig();
playbackConfig.manifestRequestHandler = requestInfo => {
  requestInfo.withCredentials = true;
};
context.start({playbackConfig: playbackConfig});

PlayerManager-এ দেওয়া গেটার ও সেটার ব্যবহার করে কীভাবে PlaybackConfig ওভাররাইড করতে হয় তা নিচের উদাহরণে দেখানো হল। এই সেটিং প্লেয়ারকে কনফিগার করে যাতে ১টি সেগমেন্ট লোড হওয়ার পরে কন্টেন্ট প্লেব্যাক আবার শুরু হয়।

const playerManager =
    cast.framework.CastReceiverContext.getInstance().getPlayerManager();
const playbackConfig = (Object.assign(
            new cast.framework.PlaybackConfig(), playerManager.getPlaybackConfig()));
playbackConfig.autoResumeNumberOfSegments = 1;
playerManager.setPlaybackConfig(playbackConfig);

মিডিয়া প্লেব্যাক তথ্য হ্যান্ডলার ব্যবহার করে নির্দিষ্ট লোড অনুরোধের জন্য কীভাবে PlaybackConfig ওভাররাইড করতে হয় তা নিচের উদাহরণে দেখানো হয়েছে। বর্তমান আইটেমের contentId থেকে licenseUrl পেতে, হ্যান্ডলার একটি অ্যাপ্লিকেশন ইমপ্লিমেন্ট করা পদ্ধতি getLicenseUrlForMedia কল করে।

playerManager.setMediaPlaybackInfoHandler((loadRequestData, playbackConfig) => {
  const mediaInformation = loadRequestData.media;
  playbackConfig.licenseUrl = getLicenseUrlForMedia(mediaInformation.contentId);

  return playbackConfig;
});

ইভেন্ট লিসনার

Web Receiver SDK আপনার Web Receiver অ্যাপকে প্লেয়ার ইভেন্ট ম্যানেজ করার অনুমতি দেয়। ইভেন্ট লিসনার cast.framework.events.EventType প্যারামিটার (বা এই প্যারামিটারগুলির একটি অ্যারে) নেয় যা ইভেন্ট(গুলি) নির্দিষ্ট করে যা লিসনারকে ট্রিগার করবে। ডিবাগ করার জন্য উপযোগী cast.framework.events.EventType-এর প্রি-কনফিগার করা অ্যারে cast.framework.events.category-এ পাওয়া যাবে। ইভেন্ট প্যারামিটার ইভেন্ট সম্পর্কে অতিরিক্ত তথ্য প্রদান করে।

যেমন, আপনি যদি জানতে চান যে কখন mediaStatus পরিবর্তন ব্রডকাস্ট করা হচ্ছে, তাহলে ইভেন্ট ম্যানেজ করতে আপনি নিম্নলিখিত লজিক ব্যবহার করতে পারেন:

const playerManager =
    cast.framework.CastReceiverContext.getInstance().getPlayerManager();
playerManager.addEventListener(
    cast.framework.events.EventType.MEDIA_STATUS, (event) => {
      // Write your own event handling code, for example
      // using the event.mediaStatus value
});

মেসেজ ইন্টারসেপশন

Web Receiver SDK আপনার Web Receiver অ্যাপকে মেসেজ ইন্টারসেপ্ট করতে এবং সেই মেসেজে কাস্টম কোড এক্সিকিউট করতে দেয়। মেসেজ ইন্টারসেপ্টর একটি cast.framework.messages.MessageType প্যারামিটার নেয় যা কোন ধরনের মেসেজ ইন্টারসেপ্ট করা উচিত তা নির্দিষ্ট করে।

ইন্টারসেপ্টরকে পরিবর্তিত অনুরোধ বা পরিবর্তিত অনুরোধের ভ্যালু সহ সমাধান করে এমন একটি Promise ফেরত দিতে হবে। null রিটার্ন করলে ডিফল্ট মেসেজ হ্যান্ডলারকে কল করা যাবে না। আরও জানতে মিডিয়া লোড করা দেখুন।

যেমন, আপনি যদি লোড অনুরোধের ডেটা পরিবর্তন করতে চান, তাহলে আপনি এটি ইন্টারসেপ্ট এবং পরিবর্তন করতে নিম্নলিখিত লজিক ব্যবহার করতে পারেন:

const context = cast.framework.CastReceiverContext.getInstance();
const playerManager = context.getPlayerManager();

playerManager.setMessageInterceptor(
    cast.framework.messages.MessageType.LOAD, loadRequestData => {
      const error = new cast.framework.messages.ErrorData(
                      cast.framework.messages.ErrorType.LOAD_FAILED);
      if (!loadRequestData.media) {
        error.reason = cast.framework.messages.ErrorReason.INVALID_PARAM;
        return error;
      }

      if (!loadRequestData.media.entity) {
        return loadRequestData;
      }

      return thirdparty.fetchAssetAndAuth(loadRequestData.media.entity,
                                          loadRequestData.credentials)
        .then(asset => {
          if (!asset) {
            throw cast.framework.messages.ErrorReason.INVALID_REQUEST;
          }

          loadRequestData.media.contentUrl = asset.url;
          loadRequestData.media.metadata = asset.metadata;
          loadRequestData.media.tracks = asset.tracks;
          return loadRequestData;
        }).catch(reason => {
          error.reason = reason; // cast.framework.messages.ErrorReason
          return error;
        });
    });

context.start();

সমস্যা ম্যানেজ করা

মেসেজ ইন্টারসেপ্টরে সমস্যা হলে, আপনার ওয়েব রিসিভার অ্যাপের উপযুক্ত cast.framework.messages.ErrorType এবং cast.framework.messages.ErrorReason ফিরিয়ে দেওয়া উচিত।

playerManager.setMessageInterceptor(
    cast.framework.messages.MessageType.LOAD, loadRequestData => {
      const error = new cast.framework.messages.ErrorData(
                      cast.framework.messages.ErrorType.LOAD_CANCELLED);
      if (!loadRequestData.media) {
        error.reason = cast.framework.messages.ErrorReason.INVALID_PARAM;
        return error;
      }

      ...

      return fetchAssetAndAuth(loadRequestData.media.entity,
                               loadRequestData.credentials)
        .then(asset => {
          ...
          return loadRequestData;
        }).catch(reason => {
          error.reason = reason; // cast.framework.messages.ErrorReason
          return error;
        });
    });

মেসেজ ইন্টারসেপশন বনাম ইভেন্ট লিসনার

মেসেজ ইন্টারসেপশন ও ইভেন্ট লিসেনারের মধ্যে কিছু মূল পার্থক্য নিচে উল্লেখ করা হল:

  • ইভেন্ট লিসেনার আপনাকে অনুরোধের ডেটা পরিবর্তন করতে দেয় না।
  • অ্যানালিটিক্স বা কাস্টম ফাংশন ট্রিগার করার জন্য ইভেন্ট লিসেনার ব্যবহার করা সবচেয়ে ভালো।
playerManager.addEventListener(cast.framework.events.category.CORE,
    event => {
        console.log(event);
    });
  • মেসেজ ইন্টারসেপশন আপনাকে মেসেজ শুনতে, ইন্টারসেপ্ট করতে এবং অনুরোধের ডেটা পরিবর্তন করতে দেয়।
  • অনুরোধের ডেটার ক্ষেত্রে কাস্টম লজিক ম্যানেজ করার জন্য মেসেজ ইন্টারসেপশন সবচেয়ে ভালভাবে ব্যবহার করা হয়।

মিডিয়া লোড হচ্ছে

cast.framework.messages.MessageType.LOAD মেসেজে মিডিয়া লোড করার জন্য MediaInformation অনেক প্রপার্টি প্রদান করে, যার মধ্যে entity, contentUrl ও contentId অন্তর্ভুক্ত।

  • entity প্রপার্টিটি আপনার প্রেরক এবং প্রাপক অ্যাপ, দুটির ক্ষেত্রেই আপনার ইমপ্লিমেন্টেশনে ব্যবহার করার জন্য সাজেস্ট করা হয়েছে। প্রপার্টি হল একটি ডিপ লিঙ্ক URL যা প্লেলিস্ট বা মিডিয়া কন্টেন্ট হতে পারে। আপনার অ্যাপ্লিকেশনকে এই URL পার্স করতে হবে এবং অন্য দুটি ফিল্ডের মধ্যে অন্তত একটি পূরণ করতে হবে।
  • contentUrl প্লেয়ার কন্টেন্ট লোড করার জন্য যে প্লেয়েবল URL ব্যবহার করবে, এটি তার সাথে সম্পর্কিত। যেমন, এই URL কোনও DASH ম্যানিফেস্টকে নির্দেশ করতে পারে।
  • contentId হতে পারে একটি চালানো যায় এমন কন্টেন্ট URL (contentUrl প্রপার্টির মতো) অথবা লোড করা কন্টেন্ট বা প্লেলিস্টের জন্য একটি অনন্য শনাক্তকারী। এই প্রপার্টি শনাক্তকারী হিসেবে ব্যবহার করলে, আপনার অ্যাপ্লিকেশনকে contentUrl-এ একটি প্লে করা যাবে এমন URL পপুলেট করতে হবে।

সাজেশন হল, আসল আইডি বা কী প্যারামিটার স্টোর করতে entity ব্যবহার করুন এবং মিডিয়ার URL-এর জন্য contentUrl ব্যবহার করুন। নিম্নলিখিত স্নিপেটে এর একটি উদাহরণ দেখানো হয়েছে যেখানে LOAD অনুরোধে entity উপস্থিত আছে এবং চালানো যাবে এমন contentUrl ফিরিয়ে আনা হয়েছে:

playerManager.setMessageInterceptor(
    cast.framework.messages.MessageType.LOAD, loadRequestData => {
      ...

      if (!loadRequestData.media.entity) {
        // Copy the value from contentId for legacy reasons if needed
        loadRequestData.media.entity = loadRequestData.media.contentId;
      }

      return thirdparty.fetchAssetAndAuth(loadRequestData.media.entity,
                                          loadRequestData.credentials)
        .then(asset => {
          loadRequestData.media.contentUrl = asset.url;
          ...
          return loadRequestData;
        });
    });

ডিভাইসের কেপেবিলিটি

getDeviceCapabilities পদ্ধতিটি কানেক্ট করা Cast ডিভাইস এবং এর সাথে অ্যাটাচ করা ভিডিও বা অডিও ডিভাইসের তথ্য প্রদান করে। getDeviceCapabilities পদ্ধতি Google Assistant, ব্লুটুথ এবং কানেক্ট করা ডিসপ্লে ও অডিও ডিভাইসের জন্য সহায়তা সংক্রান্ত তথ্য প্রদান করে।

এই পদ্ধতিটি একটি অবজেক্ট রিটার্ন করে যা আপনি নির্দিষ্ট করা enum-এর মধ্যে একটি পাস করে কোয়েরি করতে পারেন যাতে সেই enum-এর জন্য ডিভাইসের ক্ষমতা পাওয়া যায়। enum cast.framework.system.DeviceCapabilities-এ সংজ্ঞায়িত করা হয়েছে।

এই উদাহরণটি চেক করে দেখে যে ওয়েব রিসিভার ডিভাইসটি HDR এবং DolbyVision (DV) যথাক্রমে IS_HDR_SUPPORTED এবং IS_DV_SUPPORTED কী-এর সাহায্যে চালাতে পারে কিনা।

const context = cast.framework.CastReceiverContext.getInstance();
context.addEventListener(cast.framework.system.EventType.READY, () => {
  const deviceCapabilities = context.getDeviceCapabilities();
  if (deviceCapabilities &&
      deviceCapabilities[cast.framework.system.DeviceCapabilities.IS_HDR_SUPPORTED]) {
    // Write your own event handling code, for example
    // using the deviceCapabilities[cast.framework.system.DeviceCapabilities.IS_HDR_SUPPORTED] value
  }
  if (deviceCapabilities &&
      deviceCapabilities[cast.framework.system.DeviceCapabilities.IS_DV_SUPPORTED]) {
    // Write your own event handling code, for example
    // using the deviceCapabilities[cast.framework.system.DeviceCapabilities.IS_DV_SUPPORTED] value
  }
});
context.start();

ব্যবহারকারীর ইন্টার‍্যাকশন ম্যানেজ করা

একজন ব্যবহারকারী আপনার ওয়েব রিসিভার অ্যাপ্লিকেশনের সাথে ইন্টার‍্যাক্ট করতে পারেন প্রেরক অ্যাপ্লিকেশন (ওয়েব, Android এবং iOS), Assistant-চালু থাকা ডিভাইসে ভয়েস কমান্ড, স্মার্ট ডিসপ্লেতে টাচ কন্ট্রোল এবং Android TV ডিভাইসে রিমোট কন্ট্রোলের মাধ্যমে। Cast SDK বিভিন্ন API প্রদান করে যাতে Web Receiver অ্যাপ এইসব ইন্টার‍্যাকশন ম্যানেজ করতে পারে, ব্যবহারকারীর অ্যাকশন স্টেট-এর মাধ্যমে অ্যাপ্লিকেশন UI আপডেট করতে পারে এবং বিকল্প হিসেবে ব্যাকএন্ড পরিষেবা আপডেট করার জন্য পরিবর্তনগুলি পাঠাতে পারে।

মিডিয়া সংক্রান্ত যেসব কমান্ড কাজ করে

UI কন্ট্রোল স্ট্যাটাস MediaStatus.supportedMediaCommands দ্বারা পরিচালিত হয়, iOS এবং Android প্রেরকের এক্সপ্যান্ডেড কন্ট্রোলার, টাচ ডিভাইসে চলা রিসিভার এবং রিমোট কন্ট্রোল অ্যাপ এবং Android TV ডিভাইসে রিসিভার অ্যাপের জন্য। প্রপার্টিতে কোনও নির্দিষ্ট বিটওয়াইজ Command চালু করা থাকলে, সেই অ্যাকশনের সাথে সম্পর্কিত বোতামগুলি চালু করা হয়। ভ্যালু সেট করা না থাকলে, বোতামটি বন্ধ থাকে। এইসব ভ্যালু ওয়েব রিসিভারে পরিবর্তন করা যেতে পারে:

  1. নির্দিষ্ট Commands সেট করতে PlayerManager.setSupportedMediaCommands ব্যবহার করা হচ্ছে
  2. addSupportedMediaCommands ব্যবহার করে নতুন কমান্ড যোগ করা হচ্ছে
  3. removeSupportedMediaCommands ব্যবহার করে আগে থেকে থাকা কমান্ড সরানো হচ্ছে।
playerManager.setSupportedMediaCommands(cast.framework.messages.Command.SEEK |
  cast.framework.messages.Command.PAUSE);

প্রাপক আপডেট করা MediaStatus প্রস্তুত করার সময়, এতে supportedMediaCommands প্রপার্টিতে করা পরিবর্তন অন্তর্ভুক্ত থাকবে। স্ট্যাটাস ব্রডকাস্ট করা হলে, কানেক্ট করা প্রেরক অ্যাপ সেই অনুযায়ী তাদের UI-তে বোতাম আপডেট করবে।

কাজ করে এমন মিডিয়া কমান্ড ও টাচ ডিভাইস সম্পর্কে আরও জানতে Accessing UI controls গাইড দেখুন।

ব্যবহারকারীর অ্যাকশন স্টেট ম্যানেজ করা

ব্যবহারকারীরা UI-এর সাথে ইন্টার‍্যাক্ট করলে বা ভয়েস কমান্ড পাঠালে, তারা কন্টেন্টের প্লেব্যাক এবং যে আইটেমটি চালানো হচ্ছে তার সাথে সম্পর্কিত প্রপার্টি নিয়ন্ত্রণ করতে পারবেন। প্লেব্যাক কন্ট্রোল করার অনুরোধ SDK অটোমেটিক ম্যানেজ করে। বর্তমানে যে আইটেম চলছে তার প্রপার্টি পরিবর্তন করার অনুরোধ, যেমন LIKE কমান্ড, রিসিভার অ্যাপ্লিকেশনকে তা ম্যানেজ করতে হবে। এই ধরনের অনুরোধ ম্যানেজ করার জন্য SDK-তে একাধিক API থাকে। এইসব অনুরোধের ক্ষেত্রে সাহায্য করতে, নিম্নলিখিত কাজগুলি অবশ্যই করতে হবে:

  • কোনও মিডিয়া আইটেম লোড করার সময় ব্যবহারকারীর পছন্দ অনুযায়ী MediaInformation userActionStates সেট করুন।
  • USER_ACTIONটি মেসেজ ইন্টারসেপ্ট করে অনুরোধ করা অ্যাকশন নির্ধারণ করুন।
  • UI আপডেট করতে MediaInformation UserActionState আপডেট করুন।

নিম্নলিখিত স্নিপেট LOAD অনুরোধ ইন্টারসেপ্ট করে এবং LoadRequestData-এর MediaInformation পপুলেট করে। এই ক্ষেত্রে, ব্যবহারকারী লোড করা হচ্ছে এমন কন্টেন্ট পছন্দ করেন।

playerManager.setMessageInterceptor(
    cast.framework.messages.MessageType.LOAD, (loadRequestData) => {
      const userActionLike = new cast.framework.messages.UserActionState(
          cast.framework.messages.UserAction.LIKE);
      loadRequestData.media.userActionStates = [userActionLike];

      return loadRequestData;
    });

নিম্নলিখিত স্নিপেট USER_ACTION মেসেজ ইন্টারসেপ্ট করে এবং অনুরোধ করা পরিবর্তনের সাথে ব্যাকএন্ড কল করার বিষয়টি ম্যানেজ করে। তারপর এটি রিসিভারে UserActionState আপডেট করার জন্য কল করে।

playerManager.setMessageInterceptor(cast.framework.messages.MessageType.USER_ACTION,
  (userActionRequestData) => {
    // Obtain the media information of the current content to associate the action to.
    let mediaInfo = playerManager.getMediaInformation();

    // If there is no media info return an error and ignore the request.
    if (!mediaInfo) {
        console.error('Not playing media, user action is not supported');
        return new cast.framework.messages.ErrorData(messages.ErrorType.BAD_REQUEST);
    }

    // Reach out to backend services to store user action modifications. See sample below.
    return sendUserAction(userActionRequestData, mediaInfo)

    // Upon response from the backend, update the client's UserActionState.
    .then(backendResponse => updateUserActionStates(backendResponse))

    // If any errors occurred in the backend return them to the cast receiver.
    .catch((error) => {
      console.error(error);
      return error;
    });
});

নিম্নলিখিত স্নিপেট ব্যাকএন্ড পরিষেবায় কল সিমুলেট করে। ব্যবহারকারী যে ধরনের পরিবর্তনের অনুরোধ করেছেন তা দেখতে ফাংশনটি UserActionRequestData চেক করে এবং ব্যাকএন্ডে অ্যাকশনটি কাজ করলে তবেই নেটওয়ার্ক কল করে।

function sendUserAction(userActionRequestData, mediaInfo) {
  return new Promise((resolve, reject) => {
    switch (userActionRequestData.userAction) {
      // Handle user action changes supported by the backend.
      case cast.framework.messages.UserAction.LIKE:
      case cast.framework.messages.UserAction.DISLIKE:
      case cast.framework.messages.UserAction.FOLLOW:
      case cast.framework.messages.UserAction.UNFOLLOW:
      case cast.framework.messages.UserAction.FLAG:
      case cast.framework.messages.UserAction.SKIP_AD:
        let backendResponse = {userActionRequestData: userActionRequestData, mediaInfo: mediaInfo};
        setTimeout(() => {resolve(backendResponse)}, 1000);
        break;
      // Reject all other user action changes.
      default:
        reject(
          new cast.framework.messages.ErrorData(cast.framework.messages.ErrorType.INVALID_REQUEST));
    }
  });
}

নিম্নলিখিত স্নিপেট UserActionRequestData নেয় এবং MediaInformation থেকে UserActionState যোগ করে অথবা সরিয়ে দেয়। MediaInformation-এর UserActionState আপডেট করলে, অনুরোধ করা অ্যাকশনের সাথে সম্পর্কিত বোতামের স্ট্যাটাস পরিবর্তন হয়। এই পরিবর্তন স্মার্ট ডিসপ্লে কন্ট্রোল UI, রিমোট কন্ট্রোল অ্যাপ এবং Android TV UI-তে দেখা যায়। iOS ও Android প্রেরকের জন্য এক্সপ্যান্ড করা কন্ট্রোলারের UI আপডেট করতে, আউটগোয়িং MediaStatus মেসেজের মাধ্যমেও এটি ব্রডকাস্ট করা হয়।

function updateUserActionStates(backendResponse) {
  // Unwrap the backend response.
  let mediaInfo = backendResponse.mediaInfo;
  let userActionRequestData = backendResponse.userActionRequestData;

  // If the current item playing has changed, don't update the UserActionState for the current item.
  if (playerManager.getMediaInformation().entity !== mediaInfo.entity) {
    return;
  }

  // Check for existing userActionStates in the MediaInformation.
  // If none, initialize a new array to populate states with.
  let userActionStates = mediaInfo.userActionStates || [];

  // Locate the index of the UserActionState that will be updated in the userActionStates array.
  let index = userActionStates.findIndex((currUserActionState) => {
    return currUserActionState.userAction == userActionRequestData.userAction;
  });

  if (userActionRequestData.clear) {
    // Remove the user action state from the array if cleared.
    if (index >= 0) {
      userActionStates.splice(index, 1);
    }
    else {
      console.warn("Could not find UserActionState to remove in MediaInformation");
    }
  } else {
    // Add the UserActionState to the array if enabled.
    userActionStates.push(
      new cast.framework.messages.UserActionState(userActionRequestData.userAction));
  }

  // Update the UserActionState array and set the new MediaInformation
  mediaInfo.userActionStates = userActionStates;
  playerManager.setMediaInformation(mediaInfo, true);
  return;
}

ভয়েস কমান্ড

Assistant-চালু থাকা ডিভাইসের জন্য Web Receiver SDK-তে বর্তমানে নিম্নলিখিত মিডিয়া কমান্ড কাজ করে। এইসব কমান্ডের ডিফল্ট প্রয়োগ cast.framework.PlayerManager-এ পাওয়া যায়।

কমান্ড বিবরণ
চালান পজ করা অবস্থা থেকে প্লেব্যাক চালান বা আবার শুরু করুন।
পজ করা বর্তমানে চলছে এমন কন্টেন্ট পজ করুন।
পূর্ববর্তী আপনার মিডিয়া সারিতে আগের মিডিয়া আইটেমে যান।
পরের আপনার মিডিয়া সারিতে থাকা পরবর্তী মিডিয়া আইটেমে যান।
বন্ধ করুন বর্তমানে চলছে এমন মিডিয়া বন্ধ করুন।
কোনও আইটেম আবার চালান না সারির শেষ আইটেমটি চালানো হয়ে গেলে, সারিতে মিডিয়া আইটেম রিপিট করা বন্ধ করুন।
একটি আইটেম আবার চালান বর্তমানে চালানো মিডিয়া অনির্দিষ্টকালের জন্য রিপিট করুন।
সবগুলি আইটেম আবার চালান সারির শেষ আইটেমটি চালানো হয়ে গেলে সারির সব আইটেম আবার চালান।
সবগুলি আইটেম আবার চালান ও শাফেল করুন সারির শেষ আইটেমটি চালানো হয়ে গেলে, সারিটি শাফেল করুন এবং সারির সব আইটেম রিপিট করুন।
শাফেল করুন আপনার মিডিয়া সারিতে মিডিয়া আইটেম শাফেল করুন।
ক্লোজড ক্যাপশন চালু / বন্ধ করুন আপনার মিডিয়ার জন্য ক্লোজড ক্যাপশনিং চালু / বন্ধ করুন। ভাষা অনুযায়ী চালু / বন্ধ করার বিকল্পও উপলভ্য।
পরম সময়ে সিক করুন নির্দিষ্ট পরম সময়ে জাম্প করে।
বর্তমান সময়ের আপেক্ষিক সময় খুঁজুন বর্তমান প্লেব্যাক সময়ের সাপেক্ষে নির্দিষ্ট সময়সীমা অনুযায়ী এগিয়ে বা পিছিয়ে যায়।
আবার খেলুন বর্তমানে চলছে এমন মিডিয়া রিস্টার্ট করুন অথবা বর্তমানে কিছু না চললে, শেষবার চালানো মিডিয়া আইটেম চালান।
প্লেব্যাক রেট সেট করুন মিডিয়া প্লেব্যাক রেট পরিবর্তন করুন। এটি ডিফল্ট হিসেবে ম্যানেজ করা উচিত। ইনকামিং রেট সংক্রান্ত অনুরোধ ওভাররাইড করতে আপনি SET_PLAYBACK_RATE মেসেজ ইন্টারসেপ্টর ব্যবহার করতে পারবেন।

ভয়েসের মাধ্যমে মিডিয়া কমান্ড কাজ করে

Assistant-চালু থাকা ডিভাইসে কোনও ভয়েস কমান্ড যাতে মিডিয়া কমান্ড ট্রিগার করতে না পারে, তার জন্য আপনাকে প্রথমে কাজ করে এমন মিডিয়া কমান্ড সেট করতে হবে যা আপনি সাপোর্ট করতে চান। তারপর আপনাকে CastReceiverOptions.enforceSupportedCommands প্রপার্টি চালু করে সেইসব কমান্ড এনফোর্স করতে হবে। Cast SDK প্রেরক এবং টাচ-চালিত ডিভাইসের UI পরিবর্তন হয়ে এইসব কনফিগারেশন দেখাবে। ফ্ল্যাগ চালু না থাকলে ইনকামিং ভয়েস কমান্ড কাজ করবে।

যেমন, আপনি যদি আপনার প্রেরক অ্যাপ্লিকেশন এবং টাচ-চালিত ডিভাইস থেকে PAUSE-কে অনুমতি দেন, তাহলে সেই সেটিংস প্রতিফলিত করার জন্য আপনাকে অবশ্যই আপনার রিসিভার কনফিগার করতে হবে। কনফিগার করা হলে, ইনকামিং ভয়েস কমান্ডের মধ্যে কোনওটি যদি কাজ করে এমন কমান্ডের তালিকায় না থাকে, তাহলে সেটি বাদ দেওয়া হবে।

নিচের উদাহরণে, CastReceiverContext শুরু করার সময় আমরা CastReceiverOptions প্রদান করছি। আমরা PAUSE কমান্ডের জন্য সহায়তা যোগ করেছি এবং প্লেয়ারকে শুধুমাত্র সেই কমান্ডের জন্য সহায়তা করতে বাধ্য করেছি। এখন যদি কোনও ভয়েস কমান্ড SEEK-এর মতো অন্য কোনও অপারেশন করার অনুরোধ করে, তাহলে তা প্রত্যাখ্যান করা হবে। ব্যবহারকারীকে জানানো হবে যে কমান্ডটি এখনও কাজ করে না।

const context = cast.framework.CastReceiverContext.getInstance();

context.start({
  enforceSupportedCommands: true,
  supportedCommands: cast.framework.messages.Command.PAUSE
});

আপনি যে কমান্ডগুলি সীমাবদ্ধ করতে চান তার প্রতিটির জন্য আলাদা লজিক প্রয়োগ করতে পারেন। enforceSupportedCommands ফ্ল্যাগ সরিয়ে দিন এবং প্রতিটি কমান্ডের জন্য আপনি ইনকামিং মেসেজ ইন্টারসেপ্ট করতে পারবেন। এখানে আমরা SDK-এর মাধ্যমে প্রদান করা অনুরোধ ইন্টারসেপ্ট করি যাতে SEEK অ্যাসিস্ট্যান্ট চালু থাকা ডিভাইসে ইস্যু করা কমান্ড আপনার ওয়েব রিসিভার অ্যাপ্লিকেশনে কোনও সিক ট্রিগার না করে।

আপনার অ্যাপ্লিকেশন কাজ করে না এমন মিডিয়া কমান্ডের জন্য, সমস্যার উপযুক্ত কারণ ফেরত পাঠান, যেমন NOT_SUPPORTED।

playerManager.setMessageInterceptor(cast.framework.messages.MessageType.SEEK,
  seekData => {
    // Block seeking if the SEEK supported media command is disabled
    if (!(playerManager.getSupportedMediaCommands() & cast.framework.messages.Command.SEEK)) {
      let e = new cast.framework.messages.ErrorData(cast.framework.messages.ErrorType
      .INVALID_REQUEST);
      e.reason = cast.framework.messages.ErrorReason.NOT_SUPPORTED;
      return e;
    }

    return seekData;
  });

ভয়েস অ্যাক্টিভিটি থেকে ব্যাকগ্রাউন্ডিং

Assistant অ্যাক্টিভিটির কারণে Cast প্ল্যাটফর্ম আপনার অ্যাপ্লিকেশনের সাউন্ড ব্যাকগ্রাউন্ডে পাঠালে, যেমন ব্যবহারকারীর কথা শোনা বা উত্তর দেওয়া, অ্যাক্টিভিটি শুরু হলে Web Receiver অ্যাপ্লিকেশনে NOT_IN_FOCUS-এর FocusState মেসেজ পাঠানো হয়। অ্যাক্টিভিটি শেষ হলে IN_FOCUS সহ আরেকটি মেসেজ পাঠানো হয়। আপনার অ্যাপ্লিকেশন এবং যে মিডিয়া চালানো হচ্ছে তার উপর নির্ভর করে, আপনি হয়ত FocusState NOT_IN_FOCUS হলে, FOCUS_STATE মেসেজ টাইপ ইন্টারসেপ্ট করে মিডিয়া পজ করতে চাইবেন।

যেমন, Assistant কোনও ব্যবহারকারীর কোয়েরির উত্তর দিলে, অডিওবুক প্লেব্যাক পজ করা হলে ব্যবহারকারীর অভিজ্ঞতা ভালো হয়।

playerManager.setMessageInterceptor(cast.framework.messages.MessageType.FOCUS_STATE,
  focusStateRequestData => {
    // Pause content when the app is out of focus. Resume when focus is restored.
    if (focusStateRequestData.state == cast.framework.messages.FocusState.NOT_IN_FOCUS) {
      playerManager.pause();
    } else {
      playerManager.play();
    }

    return focusStateRequestData;
  });

ভয়েস-নির্দিষ্ট ক্যাপশনের ভাষা

ব্যবহারকারী ক্যাপশনের ভাষা স্পষ্টভাবে উল্লেখ না করলে, ক্যাপশনের জন্য ব্যবহৃত ভাষাটি সেই একই ভাষা হবে যে ভাষায় কমান্ডটি বলা হয়েছিল। এইসব ক্ষেত্রে, ইনকামিং মেসেজের isSuggestedLanguage প্যারামিটার থেকে বোঝা যায় যে সংশ্লিষ্ট ভাষাটি সাজেস্ট করা হয়েছে নাকি ব্যবহারকারী স্পষ্টভাবে অনুরোধ করেছেন।

যেমন, "OK Google, ক্যাপশন চালু করো" কমান্ডের জন্য isSuggestedLanguage-কে true-এ সেট করা হয়েছে, কারণ যে ভাষায় কমান্ডটি বলা হয়েছে সেই ভাষা থেকে এটি অনুমান করা হয়েছে। যদি ভাষা স্পষ্টভাবে অনুরোধ করা হয়, যেমন "OK Google, ইংরেজি ক্যাপশন চালু করো," isSuggestedLanguage false-এ সেট করা হয়।

মেটাডেটা ও ভয়েস কাস্টিং

ডিফল্ট হিসেবে ওয়েব রিসিভার ভয়েস কমান্ড ম্যানেজ করলেও, আপনার কন্টেন্টের মেটাডেটা সম্পূর্ণ ও সঠিক কিনা তা নিশ্চিত করতে হবে। এর ফলে, Assistant যাতে ভয়েস কমান্ড সঠিকভাবে পরিচালনা করতে পারে এবং Google Home অ্যাপের মতো নতুন ধরনের ইন্টারফেস এবং Google Home Hub-এর মতো স্মার্ট ডিসপ্লেতে মেটাডেটা সঠিকভাবে দেখাতে পারে তা নিশ্চিত করা হয়।

স্ট্রিম ট্রান্সফার করার ফিচার

সেশন স্টেট সংরক্ষণ করা হল স্ট্রিম ট্রান্সফারের ভিত্তি, যেখানে ব্যবহারকারীরা ভয়েস কমান্ড, Google Home অ্যাপ বা স্মার্ট ডিসপ্লে ব্যবহার করে বিভিন্ন ডিভাইসে বর্তমান অডিও ও ভিডিও স্ট্রিম ট্রান্সফার করতে পারবেন। একটি ডিভাইসে (সোর্স) মিডিয়া চলা বন্ধ হয়ে যায় এবং অন্য ডিভাইসে (ডেস্টিনেশন) চালু থাকে। লেটেস্ট ফার্মওয়্যার সহ যেকোনও Cast ডিভাইস স্ট্রিম ট্রান্সফারের সোর্স বা ডেস্টিনেশন হিসেবে কাজ করতে পারে।

স্ট্রিম ট্রান্সফার করার ফিচারের জন্য ইভেন্ট ফ্লো হল:

  1. সোর্স ডিভাইসে:
    1. মিডিয়া বন্ধ হয়ে যায়।
    2. বর্তমান মিডিয়া স্ট্যাটাস সেভ করার জন্য ওয়েব রিসিভার অ্যাপ্লিকেশন একটি কমান্ড পায়।
    3. ওয়েব রিসিভার অ্যাপ্লিকেশন বন্ধ করা হয়েছে।
  2. যে ডিভাইসে পাঠাতে চান:
    1. ওয়েব রিসিভার অ্যাপ্লিকেশন লোড করা হয়েছে।
    2. সেভ করা মিডিয়া স্টেট ফিরিয়ে আনার জন্য ওয়েব রিসিভার অ্যাপ্লিকেশন একটি কমান্ড পায়।
    3. মিডিয়া আবার চলতে শুরু করে।

মিডিয়া স্ট্যাটাসের এলিমেন্টের মধ্যে এগুলি পড়ে:

  • গান, ভিডিও বা মিডিয়া আইটেমের নির্দিষ্ট পজিশন বা টাইমস্ট্যাম্প।
  • আরও বড় সারিতে (যেমন প্লেলিস্ট বা আর্টিস্ট রেডিও) এর স্থান।
  • যাচাই করা ব্যবহারকারী।
  • প্লেব্যাক স্ট্যাটাস (যেমন, চলছে বা পজ করা আছে)।

স্ট্রিম ট্রান্সফার করার ফিচার চালু করা হচ্ছে

আপনার ওয়েব রিসিভারের জন্য স্ট্রিম ট্রান্সফার করার ফিচার প্রয়োগ করতে:

  1. STREAM_TRANSFER কমান্ডের সাহায্যে supportedMediaCommands আপডেট করুন:
    playerManager.addSupportedMediaCommands(
    cast.framework.messages.Command.STREAM_TRANSFER, true);
  2. সেশন স্টেট সংরক্ষণ করা-তে যেমন বর্ণনা করা হয়েছে, সেই অনুযায়ী SESSION_STATE এবং RESUME_SESSION মেসেজ ইন্টারসেপ্টর ওভাররাইড করুন। সেশন স্ন্যাপশটের অংশ হিসেবে কাস্টম ডেটা স্টোর করার প্রয়োজন হলে শুধুমাত্র তখনই এগুলি ওভাররাইড করুন। অন্যথায়, সেশন স্টেট বজায় রাখার জন্য ডিফল্ট ইমপ্লিমেন্টেশন স্ট্রিম ট্রান্সফার করার ফিচারকে সাপোর্ট করবে।

সেশন স্টেট সংরক্ষণ করা হচ্ছে

Web Receiver SDK, Web Receiver অ্যাপের জন্য ডিফল্ট ইমপ্লিমেন্টেশন প্রদান করে যাতে বর্তমান মিডিয়া স্ট্যাটাসের স্ন্যাপশট নিয়ে সেশন স্টেট সংরক্ষণ করা, স্ট্যাটাসকে লোড অনুরোধে পরিবর্তন করা এবং লোড অনুরোধের মাধ্যমে সেশন আবার চালু করা যায়।

প্রয়োজন হলে, Web Receiver-এর মাধ্যমে জেনারেট করা লোড অনুরোধ SESSION_STATE মেসেজ ইন্টারসেপ্টরে ওভাররাইড করা যেতে পারে। আপনি যদি লোড অনুরোধে কাস্টম ডেটা যোগ করতে চান, তাহলে আমরা সাজেস্ট করছি যে আপনি সেগুলি loadRequestData.customData-এ রাখুন।

playerManager.setMessageInterceptor(
    cast.framework.messages.MessageType.SESSION_STATE,
    function (sessionState) {
        // Override sessionState.loadRequestData if needed.
        const newCredentials = updateCredentials_(sessionState.loadRequestData.credentials);
        sessionState.loadRequestData.credentials = newCredentials;

        // Add custom data if needed.
        sessionState.loadRequestData.customData = {
            'membership': 'PREMIUM'
        };

        return sessionState;
    });

RESUME_SESSION মেসেজ ইন্টারসেপ্টরে loadRequestData.customData থেকে কাস্টম ডেটা ফিরিয়ে আনা যাবে।

let cred_ = null;
let membership_ = null;

playerManager.setMessageInterceptor(
    cast.framework.messages.MessageType.RESUME_SESSION,
    function (resumeSessionRequest) {
        let sessionState = resumeSessionRequest.sessionState;

        // Modify sessionState.loadRequestData if needed.
        cred_ = sessionState.loadRequestData.credentials;

        // Retrieve custom data.
        membership_ = sessionState.loadRequestData.customData.membership;

        return resumeSessionRequest;
    });

কন্টেন্ট প্রিলোড করা

বর্তমানে প্লেব্যাক হওয়া আইটেমের পরে সারিতে থাকা মিডিয়া আইটেম প্রিলোড করার সুবিধা ওয়েব রিসিভারে উপলভ্য।

প্রিলোড অপারেশন আসন্ন আইটেমের একাধিক সেগমেন্ট আগে থেকে ডাউনলোড করে। QueueItem অবজেক্টে preloadTime ভ্যালুর উপর স্পেসিফিকেশন করা হয় (উল্লেখ করা না থাকলে ডিফল্ট হিসেবে ২০ সেকেন্ড)। সময় সেকেন্ডে দেখানো হয়, বর্তমানে চলা আইটেমের শেষ হওয়ার সময়ের সাপেক্ষে। শুধুমাত্র পজিটিভ ভ্যালু সঠিক। যেমন, ভ্যালু ১০ সেকেন্ড হলে, আগের আইটেম শেষ হওয়ার ১০ সেকেন্ড আগে এই আইটেমটি প্রিলোড করা হবে। currentItem-এ বাকি থাকা সময়ের চেয়ে প্রিলোড করার সময় বেশি হলে, যত তাড়াতাড়ি সম্ভব প্রিলোড করা হবে। তাই, queueItem-এ প্রিলোডের খুব বড় ভ্যালু নির্দিষ্ট করা থাকলে, বর্তমান আইটেম চালানোর সময় পরবর্তী আইটেম প্রিলোড করার প্রভাব অর্জন করা যেতে পারে। তবে, আমরা এই সেটিং ও বিকল্প বেছে নেওয়ার দায়িত্ব ডেভেলপারের উপর ছেড়ে দিই, কারণ এই ভ্যালু বর্তমানে চালানো আইটেমের ব্যান্ডউইথ ও স্ট্রিমিং পারফর্ম্যান্সকে প্রভাবিত করতে পারে।

ডিফল্ট হিসেবে HLS, DASH ও স্মুথ স্ট্রিমিং কন্টেন্টের জন্য প্রিলোড করার সুবিধা কাজ করবে।

MP3-এর মতো সাধারণ MP4 ভিডিও এবং অডিও ফাইল Cast-এ প্রিলোড করা হবে না কারণ ডিভাইস শুধুমাত্র একটি মিডিয়া এলিমেন্ট সাপোর্ট করে এবং কোনও কন্টেন্ট আইটেম এখনও চলতে থাকলে প্রিলোড করার জন্য ব্যবহার করা যাবে না।

কাস্টম মেসেজ

মেসেজ এক্সচেঞ্জ হল ওয়েব রিসিভার অ্যাপ্লিকেশনের জন্য মূল ইন্টার‍্যাকশন পদ্ধতি।

প্রেরক যে প্ল্যাটফর্মে (Android, iOS, ওয়েব) কাজ করছে, সেই প্ল্যাটফর্মের জন্য প্রেরক API ব্যবহার করে প্রেরক কোনও ওয়েব রিসিভারে মেসেজ পাঠায়। ইভেন্ট লিসনারের কাছে পাস করা ইভেন্ট অবজেক্টে (যা মেসেজের ম্যানিফেস্টেশন) একটি ডেটা এলিমেন্ট (event.data) থাকে, যেখানে ডেটা নির্দিষ্ট ইভেন্টের ধরনের প্রপার্টি গ্রহণ করে।

একটি ওয়েব রিসিভার অ্যাপ্লিকেশন নির্দিষ্ট নেমস্পেসে মেসেজ শোনার জন্য বেছে নিতে পারে। এটি করার মাধ্যমে, ওয়েব রিসিভার অ্যাপ্লিকেশন সেই নেমস্পেস প্রোটোকল সাপোর্ট করে বলে ধরে নেওয়া হয়। তারপর, উপযুক্ত প্রোটোকল ব্যবহার করার জন্য সেই নেমস্পেসে যোগাযোগ করতে ইচ্ছুক যেকোনও কানেক্ট করা প্রেরকের উপর এটি নির্ভর করে।

সব নেমস্পেস স্ট্রিং দ্বারা সংজ্ঞায়িত এবং অবশ্যই "urn:x-cast:" দিয়ে শুরু হতে হবে এবং তারপরে যেকোনও স্ট্রিং থাকতে হবে। যেমন, "urn:x-cast:com.example.cast.mynamespace"।

কানেক্ট করা প্রেরকের থেকে কাস্টম মেসেজ শোনার জন্য ওয়েব রিসিভারের কোড স্নিপেট এখানে দেওয়া হল:

const context = cast.framework.CastReceiverContext.getInstance();

const CUSTOM_CHANNEL = 'urn:x-cast:com.example.cast.mynamespace';
context.addCustomMessageListener(CUSTOM_CHANNEL, function(customEvent) {
  // handle customEvent.
});

context.start();

একইভাবে, ওয়েব রিসিভার অ্যাপ্লিকেশন, কানেক্ট করা প্রেরকদের মেসেজ পাঠিয়ে ওয়েব রিসিভারের স্ট্যাটাস সম্পর্কে প্রেরকদের জানাতে পারে। একটি ওয়েব রিসিভার অ্যাপ্লিকেশন CastReceiverContext-এ sendCustomMessage(namespace, senderId, message) ব্যবহার করে মেসেজ পাঠাতে পারে। একটি ওয়েব রিসিভার একজন স্বতন্ত্র প্রেরককে বার্তা পাঠাতে পারে, হয় একটির উত্তরে প্রাপ্ত বার্তা বা একটি অ্যাপ্লিকেশন অবস্থা পরিবর্তনের কারণে. পয়েন্ট-টু-পয়েন্ট মেসেজিংয়ের (৬৪ কেবি সীমা সহ) বাইরে, ওয়েব রিসিভার সব কানেক্ট করা প্রেরককে মেসেজ ব্রডকাস্ট করতে পারে।

অডিও ডিভাইসের জন্য কাস্ট করুন

শুধুমাত্র অডিও প্লেব্যাক সংক্রান্ত সহায়তার জন্য অডিও ডিভাইসের জন্য Google Cast-এর নির্দেশিকা দেখুন।

Android TV

Google Web Receiver কীভাবে আপনার ইনপুট প্লেব্যাক হিসেবে ব্যবহার করে এবং Android TV-র সাথে মানানসই কিনা তা এই বিভাগে আলোচনা করা হয়েছে।

রিমোট কন্ট্রোলের সাথে আপনার অ্যাপ্লিকেশন ইন্টিগ্রেট করা হচ্ছে

Android TV ডিভাইসে চলা Google Web Receiver, ডিভাইসের কন্ট্রোল ইনপুট (যেমন, হাতে ধরা রিমোট কন্ট্রোল) থেকে পাওয়া ইনপুটকে urn:x-cast:com.google.cast.media নেমস্পেসের জন্য নির্ধারিত মিডিয়া প্লেব্যাক মেসেজ হিসেবে অনুবাদ করে, যেমন মিডিয়া প্লেব্যাক মেসেজ-এ বর্ণনা করা হয়েছে। Android TV-র কন্ট্রোল ইনপুট থেকে বেসিক প্লেব্যাক কন্ট্রোল করার অনুমতি দিতে, অ্যাপ্লিকেশন মিডিয়া প্লেব্যাক কন্ট্রোল করার জন্য আপনার অ্যাপ্লিকেশনকে এইসব মেসেজ অবশ্যই সাপোর্ট করতে হবে।

Android TV-এর সাথে মানানসই হওয়ার নির্দেশিকা

আপনার অ্যাপ্লিকেশন Android TV-এর সাথে মানানসই কিনা তা নিশ্চিত করতে এখানে কিছু সাজেশন এবং সাধারণ সমস্যাগুলি এড়ানোর উপায় দেওয়া হল:

  • মনে রাখবেন যে ইউজার-এজেন্ট স্ট্রিংয়ে "Android" ও "CrKey" দুটিই থাকে; কিছু সাইট শুধুমাত্র মোবাইলের জন্য তৈরি সাইটে রিডাইরেক্ট করতে পারে কারণ সেগুলি "Android" লেবেল শনাক্ত করে। ইউজার-এজেন্ট স্ট্রিংয়ে "Android" লেখা থাকলে, সবসময় মোবাইল ব্যবহারকারীকে বোঝায় না।
  • Android-এর মিডিয়া স্ট্যাক ডেটা ফেচ করার জন্য ট্রান্সপারেন্ট GZIP ব্যবহার করতে পারে। আপনার মিডিয়া ডেটা Accept-Encoding: gzip-এ রেসপন্ড করতে পারছে কিনা তা নিশ্চিত করুন।
  • Android TV HTML5 মিডিয়া ইভেন্ট Chromecast-এর থেকে আলাদা সময়ে ট্রিগার হতে পারে, এর ফলে Chromecast-এ লুকানো সমস্যাগুলি প্রকাশ পেতে পারে।
  • মিডিয়া আপডেট করার সময়, <audio>/<video> এলিমেন্ট দ্বারা ফায়ার করা মিডিয়া সম্পর্কিত ইভেন্ট ব্যবহার করুন, যেমন timeupdate, pause এবং waiting। নেটওয়ার্কিং সম্পর্কিত ইভেন্ট যেমন progress, suspend এবং stalled ব্যবহার করবেন না, কারণ এগুলি প্ল্যাটফর্মের উপর নির্ভর করে। আপনার রিসিভারে মিডিয়া ইভেন্ট ম্যানেজ করার ব্যাপারে আরও তথ্য পেতে, মিডিয়া ইভেন্ট দেখুন।
  • আপনার রিসিভার সাইটের HTTPS সার্টিফিকেট কনফিগার করার সময়, ইন্টারমিডিয়েট CA সার্টিফিকেট অন্তর্ভুক্ত করতে ভুলবেন না। যাচাই করতে Qualsys SSL টেস্ট পৃষ্ঠা দেখুন: আপনার সাইটের বিশ্বস্ত সার্টিফিকেশন পাথে যদি "অতিরিক্ত ডাউনলোড" লেবেলযুক্ত CA সার্টিফিকেট থাকে, তাহলে এটি Android-ভিত্তিক প্ল্যাটফর্মে লোড নাও হতে পারে।
  • Chromecast, ৭২০p গ্রাফিক্স প্লেনে রিসিভার পৃষ্ঠা দেখালেও, Android TV সহ অন্যান্য Cast প্ল্যাটফর্ম ১০৮০p পর্যন্ত পৃষ্ঠা দেখাতে পারে। নিশ্চিত করুন আপনার রিসিভার পৃষ্ঠাটি বিভিন্ন রেজোলিউশনে সুন্দরভাবে স্কেল করে।