इस पेज पर, कस्टम वेब रिसीवर ऐप्लिकेशन के लिए उपलब्ध सुविधाओं के कोड स्निपेट और ब्यौरे दिए गए हैं.
cast-media-playerएलिमेंट, जो वेब रिसीवर के साथ दिए गए बिल्ट-इन प्लेयर यूज़र इंटरफ़ेस (यूआई) को दिखाता है.cast-media-playerएलिमेंट के लिए कस्टम सीएसएस जैसी स्टाइलिंग, ताकिbackground-image,splash-image, औरfont-familyजैसे अलग-अलग यूज़र इंटरफ़ेस (यूआई) एलिमेंट को स्टाइल किया जा सके.- वेब रिसीवर फ़्रेमवर्क को लोड करने के लिए स्क्रिप्ट एलिमेंट.
- मैसेज को इंटरसेप्ट करने और इवेंट को मैनेज करने के लिए JavaScript कोड.
- वीडियो अपने-आप चलने की सुविधा के लिए सूची.
- वीडियो चलाने की सुविधा को कॉन्फ़िगर करने के विकल्प.
- वेब रिसीवर का कॉन्टेक्स्ट सेट करने के विकल्प.
- वेब रिसीवर ऐप्लिकेशन के साथ काम करने वाले निर्देशों को सेट करने के विकल्प.
- वेब रिसीवर ऐप्लिकेशन को शुरू करने के लिए JavaScript कॉल.
ऐप्लिकेशन को कॉन्फ़िगर करना और उससे जुड़े विकल्प
ऐप्लिकेशन को कॉन्फ़िगर करना
CastReceiverContext, डेवलपर को दिखने वाली सबसे बाहरी क्लास है. यह क्लास, पहले से मौजूद लाइब्रेरी को लोड करने और वेब रिसीवर SDK टूल को शुरू करने की प्रोसेस को मैनेज करती है. एसडीके, ऐसे एपीआई उपलब्ध कराता है जिनकी मदद से ऐप्लिकेशन डेवलपर, CastReceiverOptions का इस्तेमाल करके एसडीके को कॉन्फ़िगर कर सकते हैं.
इन कॉन्फ़िगरेशन का आकलन, ऐप्लिकेशन के हर बार लॉन्च होने पर किया जाता है. साथ ही, 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);
प्लेयर को कॉन्फ़िगर करना
कॉन्टेंट लोड करते समय, वेब रिसीवर एसडीके, प्लेबैक वैरिएबल को कॉन्फ़िगर करने का तरीका उपलब्ध कराता है. जैसे, डीआरएम की जानकारी, फिर से कोशिश करने के कॉन्फ़िगरेशन, और cast.framework.PlaybackConfig का इस्तेमाल करके अनुरोध हैंडलर.
इस जानकारी को
PlayerManager
मैनेज करता है. साथ ही, प्लेयर बनाते समय इसका आकलन किया जाता है. जब भी वेब रिसीवर SDK टूल को नया लोड पास किया जाता है, तब प्लेयर बनाए जाते हैं. प्लेयर बनाने के बाद, PlaybackConfig में किए गए बदलावों का आकलन, कॉन्टेंट के अगले लोड में किया जाता है. एसडीके, PlaybackConfig में बदलाव करने के लिए ये तरीके उपलब्ध कराता है.
CastReceiverOptions.playbackConfigका इस्तेमाल करेंCastReceiverContext.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 को बदलने का तरीका बताया गया है. हैंडलर, ऐप्लिकेशन में लागू किए गए तरीके getLicenseUrlForMedia को कॉल करता है, ताकि मौजूदा आइटम के contentId से licenseUrl को हासिल किया जा सके.
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 पैरामीटर लेता है. इससे यह तय होता है कि किस तरह के मैसेज को इंटरसेप्ट किया जाना चाहिए.
इंटरसेप्टर को बदलाव किया गया अनुरोध या ऐसा Promise दिखाना चाहिए जो बदलाव किए गए अनुरोध की वैल्यू के साथ रिज़ॉल्व हो. null को वापस करने से, डिफ़ॉल्ट मैसेज हैंडलर को कॉल नहीं किया जा सकेगा. ज़्यादा जानकारी के लिए, मीडिया लोड करना देखें.
उदाहरण के लिए, अगर आपको लोड अनुरोध के डेटा में बदलाव करना है, तो उसे इंटरसेप्ट करने और उसमें बदलाव करने के लिए, इस लॉजिक का इस्तेमाल किया जा सकता है:
const context = cast.framework.CastReceiverContext.getInstance();
const playerManager = context.getPlayerManager();
playerManager.setMessageInterceptor(
cast.framework.messages.MessageType.LOAD, loadRequestData => {
const error = new cast.framework.messages.ErrorData(
cast.framework.messages.ErrorType.LOAD_FAILED);
if (!loadRequestData.media) {
error.reason = cast.framework.messages.ErrorReason.INVALID_PARAM;
return error;
}
if (!loadRequestData.media.entity) {
return loadRequestData;
}
return thirdparty.fetchAssetAndAuth(loadRequestData.media.entity,
loadRequestData.credentials)
.then(asset => {
if (!asset) {
throw cast.framework.messages.ErrorReason.INVALID_REQUEST;
}
loadRequestData.media.contentUrl = asset.url;
loadRequestData.media.metadata = asset.metadata;
loadRequestData.media.tracks = asset.tracks;
return loadRequestData;
}).catch(reason => {
error.reason = reason; // cast.framework.messages.ErrorReason
return error;
});
});
context.start();
गड़बड़ी ठीक करना
मैसेज इंटरसेप्टर में गड़बड़ियां होने पर, आपके वेब रिसीवर ऐप्लिकेशन को सही
cast.framework.messages.ErrorType
और
cast.framework.messages.ErrorReason दिखाना चाहिए.
playerManager.setMessageInterceptor(
cast.framework.messages.MessageType.LOAD, loadRequestData => {
const error = new cast.framework.messages.ErrorData(
cast.framework.messages.ErrorType.LOAD_CANCELLED);
if (!loadRequestData.media) {
error.reason = cast.framework.messages.ErrorReason.INVALID_PARAM;
return error;
}
...
return fetchAssetAndAuth(loadRequestData.media.entity,
loadRequestData.credentials)
.then(asset => {
...
return loadRequestData;
}).catch(reason => {
error.reason = reason; // cast.framework.messages.ErrorReason
return error;
});
});
मैसेज इंटरसेप्शन बनाम इवेंट लिसनर
मैसेज इंटरसेप्शन और इवेंट लिसनर के बीच कुछ मुख्य अंतर इस तरह हैं:
- इवेंट लिसनर की मदद से, अनुरोध के डेटा में बदलाव नहीं किया जा सकता.
- इवेंट लिसनर का इस्तेमाल, आंकड़ों या किसी कस्टम फ़ंक्शन को ट्रिगर करने के लिए सबसे सही होता है.
playerManager.addEventListener(cast.framework.events.category.CORE,
event => {
console.log(event);
});
- मैसेज इंटरसेप्शन की मदद से, किसी मैसेज को सुना जा सकता है, उसे इंटरसेप्ट किया जा सकता है, और अनुरोध के डेटा में बदलाव किया जा सकता है.
- मैसेज इंटरसेप्शन का इस्तेमाल, अनुरोध के डेटा के हिसाब से कस्टम लॉजिक को मैनेज करने के लिए किया जाता है.
मीडिया लोड हो रहा है
MediaInformation, cast.framework.messages.MessageType.LOAD मैसेज में मीडिया लोड करने के लिए कई प्रॉपर्टी उपलब्ध कराता है. इनमें entity, contentUrl, और contentId शामिल हैं.
entity, सुझाई गई प्रॉपर्टी है. इसका इस्तेमाल, भेजने और पाने वाले, दोनों ऐप्लिकेशन के लिए किया जा सकता है. यह प्रॉपर्टी एक डीप लिंक यूआरएल है, जो प्लेलिस्ट या मीडिया कॉन्टेंट हो सकता है. आपके ऐप्लिकेशन को इस यूआरएल को पार्स करना चाहिए और अन्य दो फ़ील्ड में से कम से कम एक को भरना चाहिए.contentUrl, उस यूआरएल से मेल खाता है जिसका इस्तेमाल करके प्लेयर, कॉन्टेंट को लोड करेगा. उदाहरण के लिए, यह यूआरएल किसी DASH मेनिफ़ेस्ट पर ले जा सकता है.contentIdचलाए जा सकने वाले कॉन्टेंट का यूआरएल (contentUrlप्रॉपर्टी की तरह) या लोड किए जा रहे कॉन्टेंट या प्लेलिस्ट का यूनीक आइडेंटिफ़ायर हो सकता है. अगर इस प्रॉपर्टी का इस्तेमाल आइडेंटिफ़ायर के तौर पर किया जा रहा है, तो आपके ऐप्लिकेशन कोcontentUrlमें, चलाए जा सकने वाले यूआरएल की जानकारी भरनी चाहिए.
हमारा सुझाव है कि असली आईडी या मुख्य पैरामीटर को स्टोर करने के लिए, entity का इस्तेमाल करें. साथ ही, मीडिया के यूआरएल के लिए 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
तरीके से, कनेक्ट किए गए Cast डिवाइस और उससे जुड़े वीडियो या ऑडियो डिवाइस की जानकारी मिलती है. getDeviceCapabilities तरीके से, Google Assistant, ब्लूटूथ, और कनेक्ट किए गए डिसप्ले और ऑडियो डिवाइसों के बारे में सहायता जानकारी मिलती है.
यह तरीका एक ऑब्जेक्ट दिखाता है. इस ऑब्जेक्ट के बारे में क्वेरी की जा सकती है. इसके लिए, आपको दिए गए enum में से किसी एक को पास करना होगा, ताकि उस enum के लिए डिवाइस की क्षमता के बारे में जानकारी मिल सके. इन enum को
cast.framework.system.DeviceCapabilities में
डिफ़ाइन किया गया है.
इस उदाहरण में यह जांच की जाती है कि वेब रिसीवर डिवाइस, IS_HDR_SUPPORTED और IS_DV_SUPPORTED बटन की मदद से, एचडीआर और डॉल्बी विज़न (डीवी) वीडियो चला सकता है या नहीं.
const context = cast.framework.CastReceiverContext.getInstance();
context.addEventListener(cast.framework.system.EventType.READY, () => {
const deviceCapabilities = context.getDeviceCapabilities();
if (deviceCapabilities &&
deviceCapabilities[cast.framework.system.DeviceCapabilities.IS_HDR_SUPPORTED]) {
// Write your own event handling code, for example
// using the deviceCapabilities[cast.framework.system.DeviceCapabilities.IS_HDR_SUPPORTED] value
}
if (deviceCapabilities &&
deviceCapabilities[cast.framework.system.DeviceCapabilities.IS_DV_SUPPORTED]) {
// Write your own event handling code, for example
// using the deviceCapabilities[cast.framework.system.DeviceCapabilities.IS_DV_SUPPORTED] value
}
});
context.start();
उपयोगकर्ता के इंटरैक्शन को मैनेज करना
कोई उपयोगकर्ता, वेब रिसीवर ऐप्लिकेशन के साथ इंटरैक्ट कर सकता है. इसके लिए, वह वेब, Android, और iOS पर मौजूद सेंडर ऐप्लिकेशन का इस्तेमाल कर सकता है. इसके अलावा, Assistant की सुविधा वाले डिवाइसों पर बोले गए निर्देशों, स्मार्ट डिसप्ले पर टच कंट्रोल, और Android TV डिवाइसों पर रिमोट कंट्रोल का इस्तेमाल करके भी इंटरैक्ट किया जा सकता है. Cast SDK टूल, वेब रिसीवर ऐप्लिकेशन को कई एपीआई उपलब्ध कराता है. इनकी मदद से, वेब रिसीवर ऐप्लिकेशन इन इंटरैक्शन को मैनेज कर सकता है. साथ ही, उपयोगकर्ता की कार्रवाई की स्थितियों के ज़रिए, ऐप्लिकेशन के यूज़र इंटरफ़ेस (यूआई) को अपडेट कर सकता है. इसके अलावा, बैकएंड की किसी भी सेवा को अपडेट करने के लिए, बदलावों को भेजा जा सकता है.
मीडिया से जुड़े निर्देश
यूज़र इंटरफ़ेस (यूआई) कंट्रोल की स्थितियां,
MediaStatus.supportedMediaCommands
से तय होती हैं. यह iOS और Android सेंडर के बड़े किए गए कंट्रोलर, टच डिवाइसों पर चलने वाले रिसीवर और रिमोट कंट्रोल ऐप्लिकेशन, और Android TV डिवाइसों पर मौजूद रिसीवर ऐप्लिकेशन के लिए होता है. जब प्रॉपर्टी में कोई खास बिटवाइज़ Command चालू होता है, तो उस कार्रवाई से जुड़े बटन चालू हो जाते हैं. अगर वैल्यू सेट नहीं की जाती है, तो बटन बंद हो जाता है. वेब रिसीवर पर इन वैल्यू को इस तरह बदला जा सकता है:
PlayerManager.setSupportedMediaCommandsका इस्तेमाल करके,Commandsको सेट करनाaddSupportedMediaCommandsका इस्तेमाल करके नया निर्देश जोड़नाremoveSupportedMediaCommandsका इस्तेमाल करके, किसी मौजूदा निर्देश को हटाना.
playerManager.setSupportedMediaCommands(cast.framework.messages.Command.SEEK |
cast.framework.messages.Command.PAUSE);
जब रिसीवर अपडेट किया गया MediaStatus तैयार करेगा, तो उसमें supportedMediaCommands प्रॉपर्टी में किए गए बदलाव शामिल होंगे. स्टेटस ब्रॉडकास्ट होने पर, कनेक्ट किए गए सेंडर ऐप्लिकेशन अपने यूज़र इंटरफ़ेस (यूआई) में मौजूद बटन को उसी हिसाब से अपडेट कर देंगे.
इस्तेमाल किए जा सकने वाले मीडिया कमांड और टच डिवाइसों के बारे में ज़्यादा जानने के लिए,
Accessing UI controls
गाइड देखें.
उपयोगकर्ता की कार्रवाई की स्थितियों को मैनेज करना
जब उपयोगकर्ता यूज़र इंटरफ़ेस (यूआई) से इंटरैक्ट करते हैं या बोलकर निर्देश देते हैं, तो वे कॉन्टेंट के प्लेबैक और चलाए जा रहे आइटम से जुड़ी प्रॉपर्टी को कंट्रोल कर सकते हैं. प्लेबैक को कंट्रोल करने वाले अनुरोधों को SDK टूल अपने-आप मैनेज करता है. ऐसे अनुरोध जो मौजूदा आइटम की प्रॉपर्टी में बदलाव करते हैं, जैसे कि LIKE निर्देश, उन्हें रिसीवर ऐप्लिकेशन को मैनेज करना होगा. एसडीके, इस तरह के अनुरोधों को मैनेज करने के लिए एपीआई की एक सीरीज़ उपलब्ध कराता है. इन अनुरोधों को पूरा करने के लिए, ये काम करने ज़रूरी हैं:
- किसी मीडिया आइटम को लोड करते समय, उपयोगकर्ता की प्राथमिकताओं के हिसाब से
MediaInformationuserActionStatesको सेट करें. USER_ACTIONमैसेज को इंटरसेप्ट करना और अनुरोध की गई कार्रवाई का पता लगाना.- यूज़र इंटरफ़ेस (यूआई) को अपडेट करने के लिए,
MediaInformationUserActionStateको अपडेट करें.
यहां दिया गया स्निपेट, 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 की सुविधा वाले डिवाइसों के लिए, वेब रिसीवर एसडीके में ये मीडिया कमांड इस्तेमाल किए जा सकते हैं. इन कमांड के डिफ़ॉल्ट लागू करने के तरीके,
cast.framework.PlayerManager में मिलते हैं.
| निर्देश | ब्यौरा |
|---|---|
| चलाएं | रुके हुए वीडियो को चलाना या फिर से शुरू करना. |
| रोकना | फ़िलहाल चल रहे कॉन्टेंट को रोकें. |
| पीछे जाएं | मीडिया सूची में मौजूद पिछले मीडिया आइटम पर जाएं. |
| आगे बढ़ें | मीडिया सूची में मौजूद अगले मीडिया आइटम पर जाएं. |
| बंद करें | चल रहे मीडिया को बंद करना. |
| दोहराने की सुविधा बंद करें | सूची में मौजूद आखिरी आइटम के चलने के बाद, सूची में मौजूद मीडिया आइटम को फिर से चलाने की सुविधा बंद करें. |
| एक ही गाने को बार-बार चलाएं | अभी चल रहे मीडिया को बार-बार चलाएं. |
| सभी को दोहराएं | सूची में मौजूद आखिरी आइटम के चलने के बाद, सूची में मौजूद सभी आइटम को फिर से चलाएं. |
| सभी को दोहराएं और शफ़ल करें | सूची में मौजूद आखिरी आइटम के चलने के बाद, सूची को शफ़ल करें और सूची में मौजूद सभी आइटम फिर से चलाएं. |
| शफ़ल करें | मीडिया सूची में मौजूद मीडिया आइटम को शफ़ल करें. |
| सबटाइटल चालू / बंद करना | अपने मीडिया के लिए सबटाइटल की सुविधा चालू या बंद करें. भाषा के हिसाब से भी, इस सुविधा को चालू या बंद किया जा सकता है. |
| सीक करके तय समय पर जाना | यह तय किए गए समय पर ले जाता है. |
| मौजूदा समय के हिसाब से, समय को आगे या पीछे करना | यह फ़ंक्शन, मौजूदा प्लेबैक समय के हिसाब से, तय की गई समयावधि के हिसाब से आगे या पीछे ले जाता है. |
| फिर से खेलें | फ़िलहाल चल रहे मीडिया को रीस्टार्ट करें या अगर फ़िलहाल कुछ नहीं चल रहा है, तो पिछली बार चलाए गए मीडिया आइटम को चलाएं. |
| वीडियो चलाने की स्पीड सेट करना | मीडिया चलाने की स्पीड में बदलाव करना. यह डिफ़ॉल्ट रूप से मैनेज होना चाहिए. इनकमिंग रेट के अनुरोधों को बदलने के लिए, SET_PLAYBACK_RATE मैसेज इंटरसेप्टर का इस्तेमाल किया जा सकता है. |
बोलकर दिए जाने वाले मीडिया निर्देश
Assistant की सुविधा वाले डिवाइस पर, बोले गए निर्देश से मीडिया निर्देश को ट्रिगर होने से रोकने के लिए, आपको सबसे पहले काम करने वाले मीडिया निर्देश सेट करने होंगे. इसके बाद, आपको CastReceiverOptions.enforceSupportedCommands प्रॉपर्टी को चालू करके, उन निर्देशों को लागू करना होगा. Cast SDK टूल के सेंडर और टच की सुविधा वाले डिवाइसों पर यूज़र इंटरफ़ेस (यूआई) बदल जाएगा, ताकि ये कॉन्फ़िगरेशन दिख सकें. अगर फ़्लैग चालू नहीं है, तो बोले गए निर्देश लागू होंगे.
उदाहरण के लिए, अगर आपने भेजने वाले ऐप्लिकेशन और टच की सुविधा वाले डिवाइसों से PAUSE की अनुमति दी है, तो आपको पाने वाले ऐप्लिकेशन को भी कॉन्फ़िगर करना होगा, ताकि वह उन सेटिंग को दिखा सके. कॉन्फ़िगर किए जाने पर, बोलकर दिए जाने वाले ऐसे सभी निर्देश छोड़ दिए जाएंगे जो इस्तेमाल किए जा सकने वाले निर्देशों की सूची में शामिल नहीं हैं.
यहां दिए गए उदाहरण में, CastReceiverContext को शुरू करते समय CastReceiverOptions की वैल्यू दी गई है. हमने PAUSE कमांड के लिए सहायता जोड़ी है और प्लेयर को सिर्फ़ उस कमांड के साथ काम करने के लिए मजबूर किया है. अब अगर बोले गए निर्देश से किसी अन्य कार्रवाई का अनुरोध किया जाता है, जैसे कि SEEK, तो उसे अस्वीकार कर दिया जाएगा. उपयोगकर्ता को सूचना दी जाएगी कि फ़िलहाल, इस निर्देश का इस्तेमाल नहीं किया जा सकता.
const context = cast.framework.CastReceiverContext.getInstance();
context.start({
enforceSupportedCommands: true,
supportedCommands: cast.framework.messages.Command.PAUSE
});
जिस कमांड को प्रतिबंधित करना है उसके लिए अलग लॉजिक लागू किया जा सकता है. enforceSupportedCommands फ़्लैग को हटाएं. साथ ही, जिस निर्देश पर पाबंदी लगानी है उसके लिए, आने वाले मैसेज को इंटरसेप्ट करें. यहां हम एसडीके से मिले अनुरोध को रोकते हैं, ताकि 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 की गतिविधि की वजह से, Cast प्लैटफ़ॉर्म आपके ऐप्लिकेशन की आवाज़ को बैकग्राउंड में चलाता है, जैसे कि उपयोगकर्ता की बात सुनना या जवाब देना, तो गतिविधि शुरू होने पर वेब रिसीवर ऐप्लिकेशन को NOT_IN_FOCUS का FocusState मैसेज भेजा जाता है. गतिविधि खत्म होने पर, IN_FOCUS के साथ एक और मैसेज भेजा जाता है.
अपने ऐप्लिकेशन और चलाए जा रहे मीडिया के आधार पर, हो सकता है कि आप FocusState के NOT_IN_FOCUS होने पर मीडिया को रोकना चाहें. इसके लिए, आपको FOCUS_STATE टाइप के मैसेज को इंटरसेप्ट करना होगा.
उदाहरण के लिए, अगर Assistant किसी उपयोगकर्ता की क्वेरी का जवाब दे रही है, तो ऑडियो बुक के प्लेबैक को रोकना उपयोगकर्ता को बेहतर अनुभव देता है.
playerManager.setMessageInterceptor(cast.framework.messages.MessageType.FOCUS_STATE,
focusStateRequestData => {
// Pause content when the app is out of focus. Resume when focus is restored.
if (focusStateRequestData.state == cast.framework.messages.FocusState.NOT_IN_FOCUS) {
playerManager.pause();
} else {
playerManager.play();
}
return focusStateRequestData;
});
आवाज़ के हिसाब से कैप्शन की भाषा
अगर कोई उपयोगकर्ता कैप्शन के लिए साफ़ तौर पर भाषा नहीं बताता है, तो कैप्शन के लिए वही भाषा इस्तेमाल की जाती है जिसमें निर्देश दिया गया था.
इन मामलों में, आने वाले मैसेज का isSuggestedLanguage पैरामीटर यह बताता है कि उससे जुड़ी भाषा का सुझाव दिया गया था या उपयोगकर्ता ने साफ़ तौर पर उसका अनुरोध किया था.
उदाहरण के लिए, "Ok Google, कैप्शन चालू करो" निर्देश के लिए, isSuggestedLanguage को true पर सेट किया गया है. ऐसा इसलिए, क्योंकि निर्देश देने के लिए इस्तेमाल की गई भाषा से, भाषा का पता लगाया गया था. अगर किसी भाषा के लिए साफ़ तौर पर अनुरोध किया जाता है, जैसे कि "OK Google, अंग्रेज़ी में कैप्शन चालू करो", तो isSuggestedLanguage को false पर सेट किया जाता है.
मेटाडेटा और वॉइस कास्टिंग
बोले गए निर्देशों को वेब रिसीवर डिफ़ॉल्ट रूप से मैनेज करता है. हालांकि, आपको यह पक्का करना चाहिए कि आपके कॉन्टेंट का मेटाडेटा पूरा और सटीक हो. इससे यह पक्का होता है कि Assistant, बोलकर दिए गए निर्देशों को सही तरीके से मैनेज करे. साथ ही, Google Home ऐप्लिकेशन जैसे नए तरह के इंटरफ़ेस और Google Home Hub जैसे स्मार्ट डिसप्ले पर, मेटाडेटा सही तरीके से दिखे.
स्ट्रीम ट्रांसफ़र
सेशन की स्थिति को बनाए रखना, स्ट्रीम ट्रांसफ़र का आधार है. इसकी मदद से, उपयोगकर्ता बोले गए निर्देशों, Google Home ऐप्लिकेशन या स्मार्ट डिसप्ले का इस्तेमाल करके, मौजूदा ऑडियो और वीडियो स्ट्रीम को एक डिवाइस से दूसरे डिवाइस पर ट्रांसफ़र कर सकते हैं. मीडिया एक डिवाइस (सोर्स) पर चलना बंद हो जाता है और दूसरे डिवाइस (डेस्टिनेशन) पर चलने लगता है. नए फ़र्मवेयर वाले किसी भी Cast डिवाइस का इस्तेमाल, संगीत को दूसरे स्पीकर पर चलाने की सुविधा के लिए, सोर्स या डेस्टिनेशन के तौर पर किया जा सकता है.
स्ट्रीम ट्रांसफ़र के लिए इवेंट फ़्लो इस तरह है:
- सोर्स डिवाइस पर:
- मीडिया चलना बंद हो जाता है.
- वेब रिसीवर ऐप्लिकेशन को मौजूदा मीडिया की स्थिति सेव करने का निर्देश मिलता है.
- वेब रिसीवर ऐप्लिकेशन बंद हो गया है.
- जिस डिवाइस पर डेटा ट्रांसफ़र करना है उस पर:
- Web Receiver ऐप्लिकेशन लोड हो गया है.
- वेब रिसीवर ऐप्लिकेशन को, सेव की गई मीडिया की स्थिति को वापस लाने का निर्देश मिलता है.
- मीडिया फिर से चलने लगता है.
मीडिया की स्थिति में ये एलिमेंट शामिल होते हैं:
- गाने, वीडियो या मीडिया आइटम की खास पोज़िशन या टाइमस्टैंप.
- किसी बड़ी सूची (जैसे, प्लेलिस्ट या कलाकार रेडियो) में गाने की जगह.
- जिस उपयोगकर्ता की पुष्टि हो चुकी है.
- प्लेबैक की स्थिति (उदाहरण के लिए, वीडियो चल रहा है या रुका हुआ है).
स्ट्रीम ट्रांसफ़र की सुविधा चालू करना
अपने वेब रिसीवर के लिए, स्ट्रीम ट्रांसफ़र की सुविधा लागू करने के लिए:
STREAM_TRANSFERकमांड का इस्तेमाल करके,supportedMediaCommandsको अपडेट करें:playerManager.addSupportedMediaCommands( cast.framework.messages.Command.STREAM_TRANSFER, true);
- सेशन की स्थिति को सुरक्षित रखना लेख में बताए गए तरीके से,
SESSION_STATEऔरRESUME_SESSIONमैसेज इंटरसेप्टर को बदला जा सकता है. इन्हें सिर्फ़ तब बदलें, जब कस्टम डेटा को सेशन स्नैपशॉट के हिस्से के तौर पर सेव करना हो. ऐसा न करने पर, सेशन की स्थितियों को सुरक्षित रखने के लिए डिफ़ॉल्ट तौर पर लागू किया गया तरीका, स्ट्रीम ट्रांसफ़र की सुविधा के साथ काम करेगा.
सेशन की स्थिति को सेव रखना
Web Receiver 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;
});
कस्टम डेटा को loadRequestData.customData से RESUME_SESSION मैसेज इंटरसेप्टर में वापस पाया जा सकता है.
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 पर प्रीलोड की बहुत ज़्यादा वैल्यू तय की जाती है, तो मौजूदा आइटम को चलाते समय, अगले आइटम को पहले से लोड करने का असर हासिल किया जा सकता है. हालांकि, हम इस सेटिंग और विकल्प को डेवलपर पर छोड़ देते हैं, क्योंकि इस वैल्यू से मौजूदा आइटम के बैंडविड्थ और स्ट्रीमिंग की परफ़ॉर्मेंस पर असर पड़ सकता है.
पहले से लोड करने की सुविधा, एचएलएस, डैश, और स्मूथ स्ट्रीमिंग कॉन्टेंट के लिए डिफ़ॉल्ट रूप से काम करेगी.
MP4 वीडियो और MP3 जैसी ऑडियो फ़ाइलें पहले से लोड नहीं की जाएंगी. ऐसा इसलिए, क्योंकि Cast डिवाइसों पर एक बार में सिर्फ़ एक मीडिया एलिमेंट चलाया जा सकता है. साथ ही, मौजूदा कॉन्टेंट आइटम के चलने के दौरान, पहले से लोड करने की सुविधा का इस्तेमाल नहीं किया जा सकता.
पसंद के मुताबिक बनाए गए मैसेज
मैसेज एक्सचेंज, वेब रिसीवर ऐप्लिकेशन के लिए इंटरैक्शन का मुख्य तरीका है.
भेजने वाला व्यक्ति, वेब रिसीवर को मैसेज भेजता है. इसके लिए, वह उस प्लैटफ़ॉर्म (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 केबी की सीमा के साथ) के अलावा, वेब रिसीवर, कनेक्ट किए गए सभी सेंडर को मैसेज ब्रॉडकास्ट भी कर सकता है.
ऑडियो डिवाइसों के लिए Cast
सिर्फ़ ऑडियो चलाने की सुविधा के बारे में जानने के लिए, ऑडियो डिवाइसों के लिए 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 पर छिपी हुई थीं.
- मीडिया को अपडेट करते समय,
<audio>/<video>एलिमेंट से ट्रिगर होने वाले मीडिया से जुड़े इवेंट का इस्तेमाल करें. जैसे,timeupdate,pause, औरwaiting. नेटवर्किंग से जुड़े इवेंट, जैसे किprogress,suspend, औरstalledका इस्तेमाल करने से बचें. ऐसा इसलिए, क्योंकि ये प्लैटफ़ॉर्म पर निर्भर करते हैं. अपने रिसीवर में मीडिया इवेंट मैनेज करने के बारे में ज़्यादा जानकारी के लिए, मीडिया इवेंट देखें. - रिसीवर साइट के एचटीटीपीएस सर्टिफ़िकेट कॉन्फ़िगर करते समय, इंटरमीडिएट सीए सर्टिफ़िकेट शामिल करना न भूलें. इसकी पुष्टि करने के लिए, Qualsys SSL टेस्ट पेज देखें: अगर आपकी साइट के भरोसेमंद सर्टिफ़िकेशन पाथ में “अतिरिक्त डाउनलोड” लेबल वाला सीए सर्टिफ़िकेट शामिल है, तो हो सकता है कि वह Android पर आधारित प्लैटफ़ॉर्म पर लोड न हो.
- Chromecast, रिसीवर पेज को 720 पिक्सल के ग्राफ़िक प्लेन पर दिखाता है. वहीं, Android TV जैसे अन्य Cast प्लैटफ़ॉर्म, पेज को 1080 पिक्सल तक दिखा सकते हैं. पक्का करें कि आपका रिसीवर पेज, अलग-अलग रिज़ॉल्यूशन पर सही तरीके से स्केल हो.