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

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

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

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

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

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

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

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 এ পরিবর্তনগুলি পরবর্তী কন্টেন্ট লোডে মূল্যায়ন করা হয়। SDK PlaybackConfig পরিবর্তন করার জন্য নিম্নলিখিত পদ্ধতিগুলি প্রদান করে।

  • 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 ব্যবহার করবে তার সাথে 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 Assistant, Bluetooth এবং সংযুক্ত ডিসপ্লে এবং অডিও ডিভাইসগুলির জন্য সহায়তা তথ্য সরবরাহ করে।

এই পদ্ধতিটি এমন একটি বস্তু ফেরত দেয় যা আপনি নির্দিষ্ট enum গুলির মধ্যে একটিতে পাস করে জিজ্ঞাসা করতে পারেন যাতে সেই enum এর জন্য ডিভাইসের ক্ষমতা পাওয়া যায়। enum গুলি 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), সহকারী-সক্ষম ডিভাইসগুলিতে ভয়েস কমান্ড, স্মার্ট ডিসপ্লেতে টাচ নিয়ন্ত্রণ এবং অ্যান্ড্রয়েড টিভি ডিভাইসগুলিতে রিমোট নিয়ন্ত্রণের মাধ্যমে ইন্টারঅ্যাক্ট করতে পারেন। কাস্ট SDK বিভিন্ন API প্রদান করে যা ওয়েব রিসিভার অ্যাপ্লিকেশনকে এই ইন্টারঅ্যাকশনগুলি পরিচালনা করতে, ব্যবহারকারীর অ্যাকশন স্টেটের মাধ্যমে অ্যাপ্লিকেশন UI আপডেট করতে এবং ঐচ্ছিকভাবে যেকোনো ব্যাকএন্ড পরিষেবা আপডেট করার জন্য পরিবর্তনগুলি পাঠাতে দেয়।

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

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

ভয়েস কমান্ড

নিম্নলিখিত মিডিয়া কমান্ডগুলি বর্তমানে সহকারী-সক্ষম ডিভাইসগুলির জন্য ওয়েব রিসিভার 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 দ্বারা প্রদত্ত অনুরোধটি আটকে রাখি যাতে Assistant-সক্ষম ডিভাইসগুলিতে জারি করা 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;
  });

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

যদি Cast প্ল্যাটফর্মটি Assistant অ্যাক্টিভিটির কারণে আপনার অ্যাপ্লিকেশনের শব্দকে ব্যাকগ্রাউন্ড করে, যেমন ব্যবহারকারীর বক্তৃতা শোনা বা কথা বলা, তাহলে অ্যাক্টিভিটি শুরু হওয়ার সময় ওয়েব রিসিভার অ্যাপ্লিকেশনে 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 প্যারামিটার নির্দেশ করে যে সংশ্লিষ্ট ভাষাটি ব্যবহারকারী দ্বারা প্রস্তাবিত ছিল নাকি স্পষ্টভাবে অনুরোধ করা হয়েছিল।

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

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

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

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

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

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

  1. উৎস ডিভাইসে:
    1. মিডিয়া চালানো বন্ধ করে দেয়।
    2. ওয়েব রিসিভার অ্যাপ্লিকেশনটি বর্তমান মিডিয়া অবস্থা সংরক্ষণ করার জন্য একটি কমান্ড পায়।
    3. ওয়েব রিসিভার অ্যাপ্লিকেশনটি বন্ধ হয়ে গেছে।
  2. গন্তব্য ডিভাইসে:
    1. ওয়েব রিসিভার অ্যাপ্লিকেশনটি লোড করা হয়েছে।
    2. ওয়েব রিসিভার অ্যাপ্লিকেশনটি সংরক্ষিত মিডিয়া অবস্থা পুনরুদ্ধার করার জন্য একটি কমান্ড পায়।
    3. মিডিয়া আবার বাজানো শুরু করে।

মিডিয়া রাষ্ট্রের উপাদানগুলির মধ্যে রয়েছে:

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

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

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

  1. STREAM_TRANSFER কমান্ড ব্যবহার করে supportedMediaCommands আপডেট করুন:
    playerManager.addSupportedMediaCommands(
    cast.framework.messages.Command.STREAM_TRANSFER, true);
  2. ঐচ্ছিকভাবে, Preserving session state -এ বর্ণিত 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 অবজেক্টের preloadTime মানের উপর করা হয় (যদি না দেওয়া হয় তবে ডিফল্ট 20 সেকেন্ড)। বর্তমানে প্লে করা আইটেমের শেষের সাপেক্ষে সময় সেকেন্ডে প্রকাশ করা হয়। শুধুমাত্র ধনাত্মক মান বৈধ। উদাহরণস্বরূপ, যদি মান 10 সেকেন্ড হয়, তাহলে পূর্ববর্তী আইটেমটি শেষ হওয়ার 10 সেকেন্ড আগে এই আইটেমটি প্রিলোড করা হবে। যদি প্রিলোড করার সময় currentItem-এ বাকি সময়ের চেয়ে বেশি হয়, তাহলে প্রিলোড যত তাড়াতাড়ি সম্ভব ঘটবে। তাই যদি queueItem-এ প্রিলোডের একটি খুব বড় মান নির্দিষ্ট করা থাকে, তাহলে আমরা যখনই বর্তমান আইটেমটি খেলছি তখনই আমরা পরবর্তী আইটেমটি প্রিলোড করছি তার প্রভাব অর্জন করতে পারি। যাইহোক, আমরা এর সেটিং এবং পছন্দ ডেভেলপারের উপর ছেড়ে দিই কারণ এই মান বর্তমান প্লে করা আইটেমের ব্যান্ডউইথ এবং স্ট্রিমিং কর্মক্ষমতাকে প্রভাবিত করতে পারে।

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

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

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

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

একজন প্রেরক তার ব্যবহৃত প্ল্যাটফর্মের (অ্যান্ড্রয়েড, আইওএস, ওয়েব) প্রেরক 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-এর অডিও ডিভাইস নির্দেশিকা দেখুন।

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

এই বিভাগে আলোচনা করা হয়েছে কিভাবে গুগল ওয়েব রিসিভার আপনার ইনপুটগুলিকে প্লেব্যাক হিসেবে ব্যবহার করে এবং অ্যান্ড্রয়েড টিভির সামঞ্জস্যতা।

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

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

অ্যান্ড্রয়েড টিভি সামঞ্জস্যের জন্য নির্দেশিকা

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

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