আপনার কাস্টম ওয়েব রিসিভারে মূল বৈশিষ্ট্য যোগ করুন

এই পৃষ্ঠায় কোড স্নিপেট এবং একটি কাস্টম ওয়েব রিসিভার অ্যাপের জন্য উপলব্ধ বৈশিষ্ট্যগুলির বিবরণ রয়েছে৷

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

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

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

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

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

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

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

বিষয়বস্তু লোড করার সময়, ওয়েব রিসিভার SDK প্লেব্যাক ভেরিয়েবল কনফিগার করার একটি উপায় প্রদান করে যেমন DRM তথ্য , কনফিগারেশন পুনরায় চেষ্টা করুন এবং cast.framework.PlaybackConfig ব্যবহার করে হ্যান্ডলারদের অনুরোধ করুন। এই তথ্যটি 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 ওভাররাইড করতে হয়। 1 সেগমেন্ট লোড হওয়ার পরে বিষয়বস্তু প্লেব্যাক পুনরায় শুরু করতে সেটিং প্লেয়ারকে কনফিগার করে।

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

ঘটনা শ্রোতা

ওয়েব রিসিভার SDK আপনার ওয়েব রিসিভার অ্যাপটিকে প্লেয়ার ইভেন্টগুলি পরিচালনা করার অনুমতি দেয়৷ ইভেন্ট শ্রোতা একটি 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
});

বার্তা বাধা

ওয়েব রিসিভার SDK আপনার ওয়েব রিসিভার অ্যাপটিকে বার্তাগুলিকে আটকাতে এবং সেই বার্তাগুলিতে কাস্টম কোড চালানোর অনুমতি দেয়৷ বার্তা ইন্টারসেপ্টর একটি cast.framework.messages.MessageType প্যারামিটার নেয় যা নির্দিষ্ট করে যে কোন ধরনের বার্তা আটকানো উচিত।

ইন্টারসেপ্টরকে পরিবর্তিত অনুরোধ বা প্রতিশ্রুতি ফেরত দেওয়া উচিত যা পরিবর্তিত অনুরোধের মান দিয়ে সমাধান করে। 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);
    });
  • বার্তা ইন্টারসেপশন আপনাকে একটি বার্তা শুনতে, এটিকে বাধা দিতে এবং অনুরোধের ডেটা নিজেই পরিবর্তন করতে দেয়।
  • মেসেজ ইন্টারসেপশন ডেটার অনুরোধের ক্ষেত্রে কাস্টম লজিক পরিচালনা করতে সবচেয়ে ভালো ব্যবহার করা হয়।

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

MediaInformation cast.framework.messages.MessageType.LOAD মেসেজে মিডিয়া লোড করার জন্য অনেক বৈশিষ্ট্য প্রদান করে যার মধ্যে রয়েছে entity , contentUrl এবং contentId

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

পরামর্শ হল আসল আইডি বা কী প্যারামিটার সংরক্ষণ করতে entity ব্যবহার করা এবং মিডিয়ার URL-এর জন্য contentUrl ব্যবহার করা। এটির একটি উদাহরণ নিম্নলিখিত স্নিপেটে দেখানো হয়েছে যেখানে entity LOAD অনুরোধে উপস্থিত রয়েছে এবং প্লেযোগ্য 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 পদ্ধতি সংযুক্ত কাস্ট ডিভাইস এবং এর সাথে সংযুক্ত ভিডিও বা অডিও ডিভাইসের ডিভাইসের তথ্য প্রদান করে। getDeviceCapabilities পদ্ধতি Google সহকারী, ব্লুটুথ এবং সংযুক্ত ডিসপ্লে এবং অডিও ডিভাইসগুলির জন্য সমর্থন তথ্য প্রদান করে।

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

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

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

ব্যবহারকারীর মিথস্ক্রিয়া পরিচালনা করা

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

সমর্থিত মিডিয়া কমান্ড

আইওএস এবং অ্যান্ড্রয়েড প্রেরকের সম্প্রসারিত কন্ট্রোলার, রিসিভার এবং রিমোট কন্ট্রোল অ্যাপ্লিকেশানগুলি টাচ ডিভাইসে চলমান এবং অ্যান্ড্রয়েড টিভি ডিভাইসে রিসিভার অ্যাপ্লিকেশানগুলির জন্য UI নিয়ন্ত্রণের অবস্থাগুলি MediaStatus.supportedMediaCommands দ্বারা চালিত হয়৷ যখন একটি নির্দিষ্ট বিটওয়াইজ 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 এবং অ্যান্ড্রয়েড প্রেরকদের জন্য প্রসারিত কন্ট্রোলারের 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;
}

কণ্ঠ নির্দেশ

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

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

ভয়েস সহ সমর্থিত মিডিয়া কমান্ড

একটি সহকারী-সক্ষম ডিভাইসে একটি মিডিয়া কমান্ড ট্রিগার করা থেকে একটি ভয়েস কমান্ড প্রতিরোধ করতে, আপনাকে প্রথমে সমর্থিত মিডিয়া কমান্ডগুলি সেট করতে হবে যা আপনি সমর্থন করার পরিকল্পনা করছেন৷ তারপর আপনাকে অবশ্যই CastReceiverOptions.enforceSupportedCommands বৈশিষ্ট্য সক্রিয় করে সেই কমান্ডগুলি প্রয়োগ করতে হবে। কাস্ট 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;
  });

ভয়েস কার্যকলাপ থেকে পটভূমি

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

উদাহরণস্বরূপ, সহকারী ব্যবহারকারীর প্রশ্নের উত্তর দিলে অডিওবুক প্লেব্যাক পজ করা একটি ভাল ব্যবহারকারীর অভিজ্ঞতা।

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 প্যারামিটারটি নির্দেশ করে যে সংশ্লিষ্ট ভাষাটি ব্যবহারকারীর দ্বারা প্রস্তাবিত বা স্পষ্টভাবে অনুরোধ করা হয়েছিল কিনা।

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

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

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

স্ট্রিম স্থানান্তর

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

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

  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 মেসেজ ইন্টারসেপ্টরকে ওভাররাইড করুন যেমন সেশন স্টেট সংরক্ষণে বর্ণনা করা হয়েছে। সেশন স্ন্যাপশটের অংশ হিসাবে কাস্টম ডেটা সংরক্ষণ করার প্রয়োজন হলেই কেবল এইগুলিকে ওভাররাইড করুন৷ অন্যথায়, সেশন স্টেট সংরক্ষণের জন্য ডিফল্ট বাস্তবায়ন স্ট্রিম ট্রান্সফার সমর্থন করবে।

সেশনের অবস্থা সংরক্ষণ করা হচ্ছে

ওয়েব রিসিভার SDK বর্তমান মিডিয়া স্ট্যাটাসের একটি স্ন্যাপশট গ্রহণ করে, স্ট্যাটাসটিকে লোড রিকোয়েস্টে রূপান্তর করে এবং লোড রিকোয়েস্টের সাথে সেশন পুনরায় শুরু করার মাধ্যমে সেশন স্টেট সংরক্ষণ করতে ওয়েব রিসিভার অ্যাপের জন্য একটি ডিফল্ট বাস্তবায়ন প্রদান করে।

ওয়েব রিসিভার দ্বারা উত্পন্ন লোড অনুরোধ প্রয়োজন হলে 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 অবজেক্টের প্রিলোডটাইম মানের উপর করা হয় (প্রদান না করলে ডিফল্ট 20 সেকেন্ড)। সময়টি সেকেন্ডে প্রকাশ করা হয়, বর্তমানে যে আইটেমটি চলছে তার শেষের তুলনায়। শুধুমাত্র ইতিবাচক মান বৈধ। উদাহরণস্বরূপ, যদি মানটি 10 ​​সেকেন্ডের হয় তবে এই আইটেমটি পূর্ববর্তী আইটেমটি শেষ হওয়ার 10 সেকেন্ড আগে প্রিলোড করা হবে। যদি প্রিলোড করার সময় বর্তমান আইটেমের বাকি সময়ের চেয়ে বেশি হয়, প্রিলোড যত তাড়াতাড়ি সম্ভব হবে। সুতরাং যদি queueItem-এ প্রিলোডের একটি খুব বড় মান নির্দিষ্ট করা হয়, আমরা যখনই বর্তমান আইটেমটি খেলছি তখনই আমরা পরবর্তী আইটেমটি আগে থেকেই লোড করছি তার প্রভাব অর্জন করতে পারে। যাইহোক, আমরা এটির সেটিং এবং পছন্দটি ডেভেলপারের উপর ছেড়ে দিই কারণ এই মানটি বর্তমান প্লেয়িং আইটেমের ব্যান্ডউইথ এবং স্ট্রিমিং পারফরম্যান্সকে প্রভাবিত করতে পারে।

প্রিলোডিং ডিফল্টরূপে HLS, DASH এবং স্মুথ স্ট্রিমিং সামগ্রীর জন্য কাজ করবে।

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

কাস্টম বার্তা

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

একজন প্রেরক যে প্ল্যাটফর্মটি চালাচ্ছেন (Android, iOS, Web) তার জন্য প্রেরক 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();

একইভাবে, ওয়েব রিসিভার অ্যাপ্লিকেশনগুলি সংযুক্ত প্রেরকদের কাছে বার্তা পাঠিয়ে প্রেরকদের ওয়েব রিসিভারের অবস্থা সম্পর্কে অবহিত রাখতে পারে। একটি ওয়েব রিসিভার অ্যাপ্লিকেশন CastReceiverContextsendCustomMessage(namespace, senderId, message) ব্যবহার করে বার্তা পাঠাতে পারে। একটি ওয়েব রিসিভার একটি পৃথক প্রেরককে বার্তা পাঠাতে পারে, হয় একটি প্রাপ্ত বার্তার প্রতিক্রিয়া হিসাবে বা অ্যাপ্লিকেশনের অবস্থা পরিবর্তনের কারণে। পয়েন্ট-টু-পয়েন্ট মেসেজিংয়ের বাইরে (64kb সীমা সহ), একটি ওয়েব রিসিভার সমস্ত সংযুক্ত প্রেরকদের কাছে বার্তা সম্প্রচার করতে পারে।

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

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

অ্যান্ড্রয়েড টিভি

এই বিভাগে Google ওয়েব রিসিভার কীভাবে আপনার ইনপুটগুলিকে প্লেব্যাক হিসাবে ব্যবহার করে, এবং Android TV সামঞ্জস্যতা নিয়ে আলোচনা করে৷

রিমোট কন্ট্রোলের সাথে আপনার অ্যাপ্লিকেশনকে একীভূত করা

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

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 যখন 720p গ্রাফিক্স প্লেনে রিসিভার পৃষ্ঠা প্রদর্শন করে, তখন Android TV সহ অন্যান্য কাস্ট প্ল্যাটফর্ম 1080p পর্যন্ত পৃষ্ঠাটি প্রদর্শন করতে পারে। বিভিন্ন রেজোলিউশনে আপনার রিসিভার পৃষ্ঠার স্কেল সুন্দরভাবে নিশ্চিত করুন।