अपने कस्टम वेब रिसीवर में मुख्य सुविधाएं जोड़ें

इस पेज पर कोड स्निपेट और कस्टम वेब रिसीवर ऐप्लिकेशन के लिए उपलब्ध सुविधाओं की जानकारी दी गई है.

  1. cast-media-player एलिमेंट, जो वेब रिसीवर के साथ दिए गए बिल्ट-इन प्लेयर यूज़र इंटरफ़ेस (यूआई) को दिखाता है.
  2. cast-media-player एलिमेंट की कस्टम सीएसएस जैसी स्टाइलिंग, ताकि अलग-अलग यूज़र इंटरफ़ेस (यूआई) एलिमेंट को स्टाइल किया जा सके, जैसे कि background-image, splash-image, और font-family.
  3. वेब रिसीवर फ़्रेमवर्क लोड करने वाला स्क्रिप्ट एलिमेंट.
  4. JavaScript कोड का इस्तेमाल मैसेज को रोकने और इवेंट हैंडल करने के लिए किया जाता है.
  5. अपने-आप चलने की सूची.
  6. वीडियो चलाने को कॉन्फ़िगर करने के विकल्प.
  7. वेब रिसीवर के कॉन्टेक्स्ट को सेट करने के विकल्प.
  8. वेब रिसीवर ऐप्लिकेशन पर काम करने वाले कमांड सेट करने के विकल्प.
  9. वेब रिसीवर ऐप्लिकेशन शुरू करने के लिए एक JavaScript कॉल.

ऐप्लिकेशन का कॉन्फ़िगरेशन और विकल्प

ऐप्लिकेशन कॉन्फ़िगर करें

CastReceiverContext, डेवलपर को दिखने वाली सबसे बाहरी क्लास है. यह बुनियादी लाइब्रेरी की लोडिंग को मैनेज करती है और वेब रिसीवर SDK टूल को शुरू करने की प्रोसेस को मैनेज करती है. SDK टूल से ऐसे एपीआई मिलते हैं जो ऐप्लिकेशन डेवलपर को CastReceiverOptions के ज़रिए SDK टूल को कॉन्फ़िगर करने की अनुमति देते हैं. इन कॉन्फ़िगरेशन का आकलन हर ऐप्लिकेशन को लॉन्च करने के बाद एक बार किया जाता है. साथ ही, start को किए गए कॉल में वैकल्पिक पैरामीटर सेट करते समय, SDK टूल को इन्हें पास कर दिया जाता है.

नीचे दिए गए उदाहरण में यह पता लगाने के लिए डिफ़ॉल्ट व्यवहार को ओवरराइड करने का तरीका बताया गया है कि भेजने वाला कनेक्शन अब भी सक्रिय रूप से कनेक्ट है या नहीं. जब वेब रिसीवर, भेजने वाले से maxInactivity सेकंड तक बातचीत नहीं कर पाता है, तो SENDER_DISCONNECTED इवेंट भेज दिया जाता है. नीचे दिया गया कॉन्फ़िगरेशन, इस टाइम आउट को बदल देता है. यह समस्याओं को डीबग करते समय फ़ायदेमंद हो सकता है, क्योंकि यह वेब रिसीवर ऐप्लिकेशन को 'Chrome रिमोट डीबगर' सेशन बंद करने से रोकता है. ऐसा तब होता है, जब IDLE की स्थिति में कोई भी कनेक्ट किया हुआ ईमेल पता न हो.

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

प्लेयर को कॉन्फ़िगर करें

कॉन्टेंट लोड करते समय, WebRecipientr SDK टूल की मदद से प्लेबैक वैरिएबल को कॉन्फ़िगर किया जा सकता है, जैसे कि डीआरएम (डीआरएम) जानकारी, कॉन्फ़िगरेशन को फिर से आज़माएं, और cast.framework.PlaybackConfig का इस्तेमाल करके अनुरोध हैंडलर. इस जानकारी को PlayerManager मैनेज करता है. जब प्लेयर बनाए जाते हैं, तब इसका आकलन किया जाता है. वेब रिसीवर SDK टूल को हर बार नया लोड मिलने पर प्लेयर बनाए जाते हैं. प्लेयर बनाने के बाद, PlaybackConfig में हुए बदलावों का आकलन अगले कॉन्टेंट लोड में किया जाएगा. PlaybackConfig में बदलाव करने के लिए, SDK टूल ये तरीके देता है.

  • CastReceiverContext को शुरू करते समय, डिफ़ॉल्ट कॉन्फ़िगरेशन के विकल्पों को बदलने के लिए, CastReceiverOptions.playbackConfig का इस्तेमाल करें.
  • PlayerManager.getPlaybackConfig() पर क्लिक करें.
  • PlayerManager.setPlaybackConfig() का इस्तेमाल करें. यह सेटिंग बाद के सभी लोड पर लागू होती है या जब तक इसे फिर से बदल नहीं दिया जाता.
  • PlayerManager.setMediaPlaybackInfoHandler(), सिर्फ़ मौजूदा कॉन्फ़िगरेशन के ऊपर लोड किए जा रहे मीडिया आइटम के लिए अतिरिक्त कॉन्फ़िगरेशन लागू करने के लिए. हैंडलर को प्लेयर बनाने से ठीक पहले कॉल किया जाता है. यहां किए गए बदलाव हमेशा के लिए लागू नहीं होते हैं. साथ ही, getPlaybackConfig() की क्वेरी में इन्हें शामिल नहीं किया जाता. जब अगला मीडिया आइटम लोड होता है, तो इस हैंडलर को फिर से कॉल किया जाता है.

नीचे दिए गए उदाहरण में, CastReceiverContext को शुरू करते समय PlaybackConfig को सेट करने का तरीका बताया गया है. कॉन्फ़िगरेशन, मेनिफ़ेस्ट फ़ाइल पाने के लिए भेजे जाने वाले अनुरोधों को बदल देता है. हैंडलर तय करता है कि सीओआरएस ऐक्सेस-कंट्रोल के अनुरोध कुकी या ऑथराइज़ेशन हेडर जैसे क्रेडेंशियल का इस्तेमाल करके किए जाने चाहिए.

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

इवेंट लिसनर

वेब रिसीवर 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);
    });
  • मैसेज इंटरसेप्शन की मदद से, मैसेज को सुना जा सकता है, उसे रोका जा सकता है, और अनुरोध के डेटा में बदलाव किया जा सकता है.
  • मैसेज इंटरसेप्शन का सबसे अच्छा इस्तेमाल, अनुरोध किए गए डेटा के मामले में कस्टम लॉजिक को मैनेज करने के लिए किया जाता है.

मीडिया लोड हो रहा है

MediaInformationcast.framework.messages.MessageType.LOAD मैसेज में मीडिया लोड करने के लिए कई प्रॉपर्टी देता है. इनमें entity, contentUrl, और contentId प्रॉपर्टी शामिल हैं.

  • entity एक सुझाई गई प्रॉपर्टी है. इसे लागू करने में, भेजने और पाने वाले, दोनों तरह के ऐप्लिकेशन के लिए इसका इस्तेमाल किया जा सकता है. प्रॉपर्टी एक डीप लिंक यूआरएल है, जो प्लेलिस्ट या मीडिया कॉन्टेंट हो सकता है. आपको ऐप्लिकेशन इस यूआरएल को पार्स करना चाहिए और अन्य दो में से कम से कम एक फ़ील्ड भरना चाहिए.
  • contentUrl, चलाए जा सकने वाले उस यूआरएल के हिसाब से होता है जिसका इस्तेमाल प्लेयर, कॉन्टेंट लोड करने के लिए करेगा. उदाहरण के लिए, यह यूआरएल DASH मेनिफ़ेस्ट फ़ाइल को दिखा सकता है.
  • contentId, चलाए जा सकने वाले कॉन्टेंट का यूआरएल (contentUrl प्रॉपर्टी की तरह ही) हो सकता है या लोड किए जा रहे कॉन्टेंट या प्लेलिस्ट के लिए यूनीक आइडेंटिफ़ायर हो सकता है. अगर इस प्रॉपर्टी का इस्तेमाल आइडेंटिफ़ायर के तौर पर किया जा रहा है, तो आपके ऐप्लिकेशन को contentUrl में, चलाने लायक यूआरएल की जानकारी अपने-आप मिलनी चाहिए.

सुझाव दिया जाता है कि रीयल आईडी या मुख्य पैरामीटर को सेव करने के लिए, entity का इस्तेमाल करें. साथ ही, मीडिया के यूआरएल के लिए 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 तरीके से, कनेक्ट किए गए कास्ट डिवाइस और उससे जुड़े वीडियो या ऑडियो डिवाइस पर डिवाइस की जानकारी मिलती है. getDeviceCapabilities वाला तरीका, Google Assistant, ब्लूटूथ, कनेक्ट किए गए डिसप्ले, और ऑडियो डिवाइसों के लिए सहायता की जानकारी देता है.

यह तरीका एक ऑब्जेक्ट देता है, जिसके लिए क्वेरी की जा सकती है. ऐसा करने के लिए, दी गई सूची में से किसी एक को पास किया जा सकता है, ताकि डिवाइस की क्षमता की जानकारी दी जा सके. ईनम के बारे में cast.framework.system.DeviceCapabilities में बताया गया है.

यह उदाहरण यह जांचता है कि वेब रिसीवर डिवाइस पर IS_HDR_SUPPORTED और IS_DV_SUPPORTED कुंजियों का इस्तेमाल करके, एचडीआर और DoolbyVision (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();

उपयोगकर्ता इंटरैक्शन को मैनेज करना

भेजने वाले ऐप्लिकेशन (वेब, Android, और iOS) का इस्तेमाल करके, उपयोगकर्ता आपके वेब रिसीवर ऐप्लिकेशन से इंटरैक्ट कर सकता है. इसके लिए, वह Assistant की सुविधा वाले डिवाइसों पर बोलकर दिए जाने वाले निर्देशों, स्मार्ट डिसप्ले पर टच कंट्रोल, और Android TV डिवाइसों पर रिमोट कंट्रोल का इस्तेमाल कर सकता है. Cast SDK टूल कई तरह के एपीआई उपलब्ध कराता है. इनकी मदद से, वेब रिसीवर ऐप्लिकेशन इन इंटरैक्शन को मैनेज कर सकता है. साथ ही, उपयोगकर्ता की कार्रवाई की स्थिति की मदद से, ऐप्लिकेशन के यूज़र इंटरफ़ेस (यूआई) को अपडेट कर सकता है. साथ ही, किसी भी बैकएंड सेवा को अपडेट करने के लिए, इन बदलावों को (ज़रूरी नहीं) के तौर पर भेज सकता है.

इस्तेमाल किए जा सकने वाले मीडिया निर्देश

यूज़र इंटरफ़ेस (यूआई) कंट्रोल की स्थितियां, iOS और Android से भेजने वाले के लिए एक्सपैंडेड कंट्रोलर, टच डिवाइस पर चलने वाले रिसीवर और रिमोट कंट्रोल ऐप्लिकेशन, और Android TV डिवाइसों पर रिसीवर ऐप्लिकेशन के लिए 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 प्रॉपर्टी में होने वाले बदलाव शामिल होंगे. स्टेटस ब्रॉडकास्ट होने पर, कनेक्ट किए गए भेजने वाले ऐप्लिकेशन, यूज़र इंटरफ़ेस (यूआई) के बटन को अपने हिसाब से अपडेट करेंगे.

इस्तेमाल किए जा सकने वाले मीडिया कमांड और टच डिवाइसों के बारे में ज़्यादा जानकारी के लिए, Accessing UI controls गाइड देखें.

उपयोगकर्ता की कार्रवाई की स्थितियों को मैनेज करना

जब उपयोगकर्ता यूज़र इंटरफ़ेस (यूआई) से इंटरैक्ट करते हैं या बोलकर दिए जाने वाले निर्देश भेजते हैं, तो वे आइटम चलाने से जुड़े कॉन्टेंट और प्रॉपर्टी के प्लेबैक को कंट्रोल कर सकते हैं. वीडियो को कंट्रोल करने वाले अनुरोधों को SDK टूल अपने-आप मैनेज करता है. ऐसे अनुरोध जो चल रहे मौजूदा आइटम की प्रॉपर्टी में बदलाव करते हैं, जैसे कि LIKE कमांड के लिए ज़रूरी है कि रिसीवर ऐप्लिकेशन इन्हें हैंडल करे. इस तरह के अनुरोधों को मैनेज करने के लिए, SDK टूल कई एपीआई उपलब्ध कराता है. इन अनुरोधों को पूरा करने के लिए, ये काम किए जाने होंगे:

  • मीडिया आइटम लोड करते समय, उपयोगकर्ता की पसंद के हिसाब से MediaInformation userActionStates को सेट करें.
  • USER_ACTION मैसेज को छिपाएं और अनुरोध की गई कार्रवाई तय करें.
  • यूज़र इंटरफ़ेस (यूआई) अपडेट करने के लिए, 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 को अपडेट करने से, अनुरोध की गई कार्रवाई से जुड़े बटन की स्थिति बदल जाती है. यह बदलाव स्मार्ट डिसप्ले कंट्रोल यूज़र इंटरफ़ेस (यूआई), रिमोट कंट्रोल ऐप्लिकेशन, और Android TV यूज़र इंटरफ़ेस (यूआई) में दिखता है. इसे आउटगोइंग MediaStatus मैसेज के ज़रिए भी ब्रॉडकास्ट किया जाता है, ताकि iOS और Android से भेजने वालों के लिए बड़े किए गए कंट्रोलर के यूज़र इंटरफ़ेस (यूआई) को अपडेट किया जा सके.

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 की सुविधा वाले डिवाइसों के लिए, वेब रिसीवर SDK टूल में फ़िलहाल ये मीडिया निर्देश काम करते हैं. इन निर्देशों को लागू करने का डिफ़ॉल्ट तरीका cast.framework.PlayerManager में बताया गया है.

आदेश ब्यौरा
खेलें 'रोके गए' की स्थिति से वीडियो चलाना या फिर से शुरू करना.
रोकना वर्तमान में चल रही सामग्री को रोकें.
पीछे जाएं अपनी मीडिया सूची में पिछले मीडिया आइटम पर जाएं.
आगे बढ़ें अपनी मीडिया सूची में अगले मीडिया आइटम पर जाएं.
बंद करें अभी चल रहे मीडिया को बंद करें.
कोई भी न दोहराएं जब सूची का आखिरी आइटम चलना पूरा हो जाए, तो सूची में मौजूद मीडिया आइटम को दोहराना बंद कर दें.
सिंगल को दोहराएं अभी चल रहे मीडिया को अनिश्चित काल तक दोहराएं.
सभी को दोहराएं जब सूची का आखिरी आइटम चल जाए, तो सूची के सभी आइटम दोहराएं.
सभी को दोहराएं और शफ़ल करें जब सूची का आखिरी आइटम चल जाए, तो सूची को शफ़ल करें और उसके सभी आइटम दोहराएं.
शफ़ल करें अपनी मीडिया सूची में मीडिया आइटम शफ़ल करें.
सबटाइटल चालू / बंद करना अपने मीडिया के लिए सबटाइटल चालू / बंद करें. चालू / बंद करें, भाषा के हिसाब से भी उपलब्ध है.
पूरा समय सीक करें बताए गए निरपेक्ष समय पर ले जाता है.
मौजूदा समय के मुकाबले समय पर देना वीडियो चलने के मौजूदा समय के मुकाबले बताई गई समयावधि में, वीडियो को आगे या पीछे ले जाता है.
फिर से खेलें चल रहे मौजूदा मीडिया को रीस्टार्ट करें या अगर कोई मीडिया नहीं चल रहा है, तो पिछली बार चलाया गया मीडिया आइटम चलाएं.
वीडियो चलाने की दर सेट करना अलग-अलग मीडिया चलाने की दर. इसे डिफ़ॉल्ट रूप से मैनेज किया जाना चाहिए. रेट के आने वाले अनुरोधों को बदलने के लिए, SET_PLAYBACK_RATE मैसेज इंटरसेप्टर का इस्तेमाल किया जा सकता है.

बोलकर दिए जा सकने वाले मीडिया निर्देश

Assistant की सुविधा वाले डिवाइस पर, बोलकर निर्देश देने की सुविधा से मीडिया कमांड ट्रिगर होने से रोकने के लिए, आपको सबसे पहले उन मीडिया चलाने के लिए निर्देश सेट करने होंगे जिन पर आपको काम करना है. इसके बाद, आपको CastReceiverOptions.enforceSupportedCommands प्रॉपर्टी को चालू करके, उन निर्देशों को लागू करना होगा. कास्ट SDK टूल भेजने वालों और टच करने की सुविधा वाले डिवाइसों का यूज़र इंटरफ़ेस (यूआई), इन कॉन्फ़िगरेशन को दिखाने के लिए बदल जाएगा. अगर फ़्लैग चालू नहीं है, तो बोलकर दिए जाने वाले निर्देश लागू होंगे.

उदाहरण के लिए, अगर भेजने वाले ऐप्लिकेशन और टच करने की सुविधा वाले डिवाइसों से 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;
  });

आवाज़ के बैकग्राउंड में हो रही गतिविधि

अगर Assistant पर की गई गतिविधि की वजह से, कास्ट प्लैटफ़ॉर्म आपके ऐप्लिकेशन की आवाज़ को बैकग्राउंड में रखता है, जैसे कि उपयोगकर्ता की बातों को सुनना या वापस बात करना, तो FocusState गतिविधि शुरू होने पर, वेब रिसीवर ऐप्लिकेशन को NOT_IN_FOCUS का मैसेज भेजा जाता है. गतिविधि खत्म होने पर, 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 ऐप्लिकेशन या स्मार्ट डिसप्ले का इस्तेमाल करके, मौजूदा ऑडियो और वीडियो स्ट्रीम को अलग-अलग डिवाइसों पर ले जा सकते हैं. मीडिया एक डिवाइस (सोर्स) पर चलना बंद हो जाता है और दूसरे डिवाइस (डेस्टिनेशन) पर चलता रहता है. नए फ़र्मवेयर वाला कोई भी कास्ट डिवाइस, स्ट्रीम ट्रांसफ़र में सोर्स या डेस्टिनेशन के तौर पर काम कर सकता है.

स्ट्रीम ट्रांसफ़र करने का इवेंट फ़्लो:

  1. सोर्स डिवाइस पर:
    1. मीडिया चलना बंद हो जाता है.
    2. वेब रिसीवर ऐप्लिकेशन को मौजूदा मीडिया स्थिति सेव करने के लिए एक निर्देश मिलता है.
    3. वेब रिसीवर ऐप्लिकेशन बंद हो गया है.
  2. चुने गए डिवाइस पर:
    1. वेब रिसीवर ऐप्लिकेशन लोड हो गया.
    2. वेब रिसीवर ऐप्लिकेशन को सेव की गई मीडिया स्थिति को पहले जैसा करने का निर्देश मिलता है.
    3. मीडिया फिर से शुरू हो जाएगा.

मीडिया स्थिति के एलिमेंट में ये शामिल हैं:

  • गाने, वीडियो या मीडिया आइटम में खास पोज़िशन या टाइमस्टैंप.
  • यह किसी बड़ी सूची (जैसे कि प्लेलिस्ट या कलाकार रेडियो) में शामिल होता है.
  • पुष्टि किया गया उपयोगकर्ता.
  • वीडियो चलाने की स्थिति, जैसे कि चलाना या रोकना.

स्ट्रीम ट्रांसफ़र करने की सुविधा चालू की जा रही है

अपने वेब रिसीवर के लिए स्ट्रीम ट्रांसफ़र लागू करने के लिए:

  1. supportedMediaCommands को STREAM_TRANSFER निर्देश के साथ अपडेट करें:
    playerManager.addSupportedMediaCommands(
    cast.framework.messages.Command.STREAM_TRANSFER, true);
  2. विकल्प के तौर पर, SESSION_STATE और RESUME_SESSION मैसेज इंटरसेप्टर को बदलें, जैसा कि सेशन की सुरक्षा की स्थिति में बताया गया है. इन्हें सिर्फ़ तब बदलें, जब कस्टम डेटा को सेशन के स्नैपशॉट के तौर पर सेव करने की ज़रूरत हो. अगर ऐसा नहीं है, तो सेशन की स्थितियों को बनाए रखने के लिए डिफ़ॉल्ट रूप से, स्ट्रीम को ट्रांसफ़र करने की सुविधा काम करेगी.

सेशन की स्थिति को सेव किया जा रहा है

वेब रिसीवर ऐप्लिकेशन, सेशन की स्थितियों को सुरक्षित रखने के लिए डिफ़ॉल्ट रूप से वेब रिसीवर ऐप्लिकेशन उपलब्ध कराता है. इससे, मौजूदा मीडिया स्टेटस का स्नैपशॉट लेकर, स्टेटस को लोड करने के अनुरोध में बदला जाता है और सेशन को फिर से लोड करने के अनुरोध के साथ फिर से शुरू किया जा सकता है.

ज़रूरत पड़ने पर, वेब रिसीवर के जनरेट किए गए लोड के अनुरोध को 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 में बचे समय से ज़्यादा है, तो प्रीलोड जल्द से जल्द होगा. इसलिए, अगर listItem पर प्रीलोड की बहुत बड़ी वैल्यू दी गई है, तो जब भी हम मौजूदा आइटम चला रहे होते हैं, तो हम अगले आइटम को पहले से ही लोड कर देते हैं. हालांकि, हम इसकी सेटिंग और विकल्प डेवलपर पर छोड़ देते हैं, क्योंकि यह मान चल रहे मौजूदा आइटम के बैंडविड्थ और स्ट्रीमिंग परफ़ॉर्मेंस पर असर डाल सकता है.

पहले से लोड करने की सुविधा, डिफ़ॉल्ट रूप से HLS, DASH, और स्मूद स्ट्रीमिंग कॉन्टेंट के लिए काम करेगी.

सामान्य MP4 वीडियो और ऑडियो फ़ाइलें, जैसे कि MP3 पहले से लोड नहीं की जाएंगी, क्योंकि कास्ट डिवाइसों पर सिर्फ़ एक मीडिया एलिमेंट काम करता है. जब कोई मौजूदा कॉन्टेंट आइटम चल रहा हो, तो उसे पहले से लोड करने के लिए इस्तेमाल नहीं किया जा सकता.

पसंद के मुताबिक बनाए गए मैसेज

वेब रिसीवर ऐप्लिकेशन के लिए मैसेज एक्सचेंज, इंटरैक्शन का मुख्य तरीका है.

ईमेल भेजने वाला व्यक्ति, जिस प्लैटफ़ॉर्म (Android, iOS, वेब) का इस्तेमाल कर रहा है उसके लिए भेजने वाले एपीआई का इस्तेमाल करके, वेब रिसीवर को मैसेज भेजता है. इवेंट लिसनर को पास किया गया इवेंट ऑब्जेक्ट, जो मैसेज का मेनिफ़ेस्ट होता है उसमें एक डेटा एलिमेंट (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) का इस्तेमाल करके मैसेज भेज सकता है. वेब रिसीवर, भेजे गए किसी मैसेज के जवाब में या ऐप्लिकेशन की स्थिति बदलने की वजह से, ईमेल भेजने वाले व्यक्ति को मैसेज भेज सकता है. पॉइंट-टू-पॉइंट मैसेजिंग (64 केबी की सीमा वाली) के अलावा, वेब रिसीवर सभी कनेक्ट किए गए भेजने वालों को मैसेज भी ब्रॉडकास्ट कर सकता है.

ऑडियो डिवाइसों के लिए कास्ट करना

सिर्फ़ ऑडियो चलाने पर सहायता पाने के लिए, ऑडियो डिवाइसों के लिए Google Cast की गाइड देखें.

Android TV

इस सेक्शन में इस बात की चर्चा की गई है कि 'Google वेब रिसीवर' आपके इनपुट का इस्तेमाल वीडियो चलाने के लिए कैसे करता है. साथ ही, इस सेक्शन में इस बात की भी जानकारी दी गई है कि Android TV पर यह कैसे काम करता है.

अपने ऐप्लिकेशन को रिमोट कंट्रोल के साथ इंटिग्रेट करना

Android TV डिवाइस पर चल रहा Google वेब रिसीवर, डिवाइस के कंट्रोल इनपुट (जैसे कि हैंड-हेल्ड रिमोट कंट्रोल) से मिले इनपुट को 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 पर छिपी हुई समस्याओं के बारे में पता चल सकता है.
  • मीडिया को अपडेट करते समय, timeupdate, pause, और waiting जैसे <audio>/<video> एलिमेंट से ट्रिगर किए गए मीडिया से जुड़े इवेंट का इस्तेमाल करें. नेटवर्किंग से जुड़े इवेंट का इस्तेमाल करने से बचें, जैसे कि progress, suspend, और stalled, क्योंकि ये इवेंट प्लैटफ़ॉर्म पर निर्भर होते हैं. रिसीवर में मीडिया इवेंट मैनेज करने के बारे में ज़्यादा जानकारी के लिए, मीडिया इवेंट देखें.
  • कॉन्टेंट पाने वाले लोगों की साइट के एचटीटीपीएस सर्टिफ़िकेट कॉन्फ़िगर करते समय, पक्का करें कि इंटरमीडिएट CA सर्टिफ़िकेट शामिल किए गए हों. यह पुष्टि करने के लिए Qualsys SSL टेस्ट पेज पर जाएं: अगर आपकी साइट के भरोसेमंद सर्टिफ़िकेशन पाथ में “एक्स्ट्रा डाउनलोड” लेबल वाला CA सर्टिफ़िकेट शामिल है, तो हो सकता है कि यह Android प्लैटफ़ॉर्म पर लोड न हो.
  • Chromecast, 720 पिक्सल वाले ग्राफ़िक प्लेन में रिसीवर पेज को दिखाता है, जबकि Android TV जैसे दूसरे कास्ट प्लैटफ़ॉर्म पर, पेज को 1080 पिक्सल तक दिखाया जा सकता है. पक्का करें कि डिवाइस पाने वाला आपका पेज अलग-अलग रिज़ॉल्यूशन पर अच्छी तरह फ़िट हो रहा हो.