इस पेज में कोड स्निपेट और कस्टम वेब रिसीवर ऐप्लिकेशन बनाने के लिए.
cast-media-player
एलिमेंट, जो पहले से मौजूद प्लेयर का यूज़र इंटरफ़ेस (यूआई) दिखाता है वेब रिसीवर के साथ उपलब्ध कराया जाता है.- अलग-अलग स्टाइल को स्टाइल करने के लिए,
cast-media-player
एलिमेंट के लिए पसंद के मुताबिक सीएसएस जैसी स्टाइलिंग यूज़र इंटरफ़ेस (यूआई) एलिमेंट, जैसे किbackground-image
,splash-image
, औरfont-family
. - वेब रिसीवर फ़्रेमवर्क को लोड करने के लिए स्क्रिप्ट एलिमेंट.
- मैसेज और इवेंट हैंडल करने में रुकावट डालने वाला JavaScript कोड.
- वीडियो अपने-आप चलने के लिए सूची.
- प्लेबैक कॉन्फ़िगर करने के विकल्प.
- वेब रिसीवर का संदर्भ सेट करने के विकल्प.
- वेब रिसीवर ऐप्लिकेशन के साथ काम करने वाले निर्देशों को सेट करने के विकल्प.
- वेब पाने वाले ऐप्लिकेशन को शुरू करने के लिए JavaScript कॉल.
ऐप्लिकेशन को कॉन्फ़िगर करने और विकल्प
ऐप्लिकेशन कॉन्फ़िगर करें
कॉन्टेंट बनाने
CastReceiverContext
बाहरी क्लास है जो डेवलपर को दिखाई जाती है और यह
पहले से मौजूद लाइब्रेरी और वेब रिसीवर SDK टूल इनिशलाइज़ेशन को हैंडल करती है. SDK टूल
ऐसे एपीआई उपलब्ध कराता है जो ऐप्लिकेशन डेवलपर को
CastReceiverOptions
.
इन कॉन्फ़िगरेशन का आकलन, हर ऐप्लिकेशन के लॉन्च के लिए एक बार किया जाता है. इसके बाद, इन्हें
SDK टूल का इस्तेमाल
start
.
नीचे दिए गए उदाहरण में यह पता लगाने के लिए डिफ़ॉल्ट व्यवहार को बदलने का तरीका बताया गया है कि क्या
भेजने वाला कनेक्शन अब भी कनेक्ट है. जब वेब रिसीवर के पास
इस समय के लिए,
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);
प्लेयर कॉन्फ़िगर करें
कॉन्टेंट लोड करते समय, Web रिसीवर SDK टूल, प्लेबैक को कॉन्फ़िगर करने का एक तरीका उपलब्ध कराता है
DRM जैसे चर
जानकारी,
कॉन्फ़िगरेशन का पुनः प्रयास करें और इसका उपयोग करके हैंडलर का अनुरोध करें
cast.framework.PlaybackConfig
.
इस जानकारी को यह कंपनी मैनेज करती है
PlayerManager
और उसी समय खिलाड़ियों का आकलन किया जाता है. खिलाड़ी बनाए जाते हैं
हर बार जब वेब पाने वाले SDK टूल को नया लोड पास किया जाता है.
प्लेयर बनाने के बाद, अगले PlaybackConfig
में उसका आकलन किया जाएगा
कॉन्टेंट लोड होता है. SDK टूल में बदलाव करने के लिए, SDK टूल ये तरीके उपलब्ध कराता है
PlaybackConfig
.
CastReceiverOptions.playbackConfig
डिफ़ॉल्ट कॉन्फ़िगरेशन को ओवरराइड करने के लिएCastReceiverContext
.PlayerManager.getPlaybackConfig()
.PlayerManager.setPlaybackConfig()
. यह सेटिंग सभी पर लागू होती है या जब तक कि इसे फिर से ओवरराइड नहीं किया जाता.PlayerManager.setMediaPlaybackInfoHandler()
सिर्फ़ लोड किए जा रहे मीडिया आइटम के लिए, अतिरिक्त कॉन्फ़िगरेशन लागू करने के लिए ऊपर की ओर ले जाएं. हैंडलर को प्लेयर से ठीक पहले कॉल किया जाता है बनाना. यहां किए गए बदलाव हमेशा के लिए नहीं होते और इन्हें क्वेरी में शामिल नहीं किया जाताgetPlaybackConfig()
तक. अगला मीडिया आइटम लोड होने पर, यह हैंडलर को फिर से कॉल किया जाएगा.
नीचे दिया उदाहरण दिखाता है कि स्निपेट को शुरू करते समय PlaybackConfig
को कैसे सेट करें
CastReceiverContext
. कॉन्फ़िगरेशन,
मेनिफ़ेस्ट हासिल करने के लिए किया जा सकता है. हैंडलर यह तय करता है कि सीओआरएस ऐक्सेस-कंट्रोल अनुरोध
कुकी या अनुमति देने वाले हेडर जैसे क्रेडेंशियल का इस्तेमाल करके किया जाना चाहिए.
const playbackConfig = new cast.framework.PlaybackConfig();
playbackConfig.manifestRequestHandler = requestInfo => {
requestInfo.withCredentials = true;
};
context.start({playbackConfig: playbackConfig});
नीचे दिए गए उदाहरण में गैटर का इस्तेमाल करके PlaybackConfig
को बदलने का तरीका बताया गया है
और सेटर PlayerManager
में दिया गया है. सेटिंग, प्लेयर को इसके लिए कॉन्फ़िगर करती है:
एक सेगमेंट लोड होने के बाद, कॉन्टेंट को फिर से शुरू करें.
const playerManager =
cast.framework.CastReceiverContext.getInstance().getPlayerManager();
const playbackConfig = (Object.assign(
new cast.framework.PlaybackConfig(), playerManager.getPlaybackConfig()));
playbackConfig.autoResumeNumberOfSegments = 1;
playerManager.setPlaybackConfig(playbackConfig);
नीचे दिए गए उदाहरण में किसी खास लोड के लिए, PlaybackConfig
को बदलने का तरीका बताया गया है
मीडिया प्लेबैक की जानकारी वाले हैंडलर का इस्तेमाल करके अनुरोध किया जा सकता है. हैंडलर किसी ऐप्लिकेशन को कॉल करता है
इस तरीके से licenseUrl
पाने के लिए, getLicenseUrlForMedia
तरीका लागू किया गया
मौजूदा आइटम का contentId
.
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
वह चलाए जा सकने वाले यूआरएल से जुड़ा हो जिसे प्लेयर, कॉन्टेंट लोड करने के लिए इस्तेमाल करेगा. उदाहरण के लिए, यह यूआरएल किसी DASH मेनिफ़ेस्ट पर ले जा सकता है.contentId
या तो चलाने लायक कॉन्टेंट का यूआरएल हो सकता है (contentUrl
से मिलता-जुलता प्रॉपर्टी) या लोड किए जा रहे कॉन्टेंट या प्लेलिस्ट के लिए यूनीक आइडेंटिफ़ायर. अगर इस प्रॉपर्टी का इस्तेमाल आइडेंटिफ़ायर के तौर पर किया जा रहा है, तो आपके ऐप्लिकेशन कोcontentUrl
में चलाने लायक यूआरएल.
रीयल आईडी या मुख्य पैरामीटर को स्टोर करने के लिए, entity
का इस्तेमाल करने का सुझाव दिया जाता है, और
मीडिया के यूआरएल के लिए contentUrl
का इस्तेमाल करें. इसका एक उदाहरण
LOAD
अनुरोध में entity
मौजूद होने पर और
Playables का 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
बटन से 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();
उपयोगकर्ता के इंटरैक्शन को मैनेज करना
उपयोगकर्ता, भेजने वाले के ज़रिए आपके वेब पाने वाले ऐप्लिकेशन से इंटरैक्ट कर सकता है ऐप्लिकेशन (वेब, 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
निर्देश,
के लिए यह ज़रूरी है कि रिसीवर ऐप्लिकेशन उन्हें हैंडल करे. यह 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;
}
बोलकर दिए जाने वाले निर्देश
वेब रिसीवर SDK टूल में, फ़िलहाल इन मीडिया कमांड का इस्तेमाल किया जा सकता है:
Assistant की सुविधा वाले डिवाइस. इन निर्देशों को डिफ़ॉल्ट तौर पर इन पर लागू किया जाता है
इसमें मिला
cast.framework.PlayerManager
.
आदेश | ब्यौरा |
---|---|
खेलें | 'रोके गए' स्टेटस से वीडियो चलाना या उसे फिर से शुरू करना. |
रोकना | चल रहे मौजूदा वीडियो को रोकें. |
पीछे जाएं | अपनी मीडिया सूची में पिछले मीडिया आइटम पर जाएं. |
आगे बढ़ें | अपनी मीडिया सूची में अगले मीडिया आइटम पर जाएं. |
बंद करें | अभी चल रहे मीडिया को बंद करें. |
किसी को न दोहराएं | सूची में सबसे आखिर में मौजूद आइटम के चलने के बाद, सूची में मौजूद मीडिया आइटम को दोहराना बंद करें. |
एक गाना दोहराएं | मौजूदा समय में चल रहे मीडिया को हमेशा के लिए दोहराएं. |
सभी को दोहराएं | सूची का आखिरी आइटम सुनने के बाद, सूची में मौजूद सभी आइटम दोबारा सुनें. |
सभी को दोहराएं और शफ़ल करें | सूची का आखिरी आइटम चलाने के बाद, सूची को शफ़ल करें और सूची के सभी आइटम दोहराएं. |
शफ़ल करें | अपनी मीडिया सूची में मौजूद मीडिया आइटम शफ़ल करें. के loadRequestData में सेट किया गया है, तो shuffle फ़्लैग का इस्तेमाल करके, वीडियो चलाने से पहले उसे शफ़ल किया जा सकता है. |
सबटाइटल चालू या बंद करना | मीडिया के लिए सबटाइटल चालू / बंद करें. चालू / बंद करने की सुविधा भाषा के हिसाब से भी उपलब्ध है. |
कुल समय के लिए आगे बढ़ें | सीधे तय किए गए समय पर ले जाता है. |
मौजूदा समय के हिसाब से समय पर आगे बढ़ें | वीडियो चलाने के मौजूदा समय के हिसाब से, तय समयावधि के हिसाब से आगे या पीछे जाएं. |
फिर से खेलें | अगर अभी चल रहा मीडिया आइटम नहीं चल रहा है, तो उसे रीस्टार्ट करें. इसके अलावा, अगर आखिरी बार चलाया गया मीडिया आइटम चलाया जा रहा है, तो उसे फिर से चलाएं. |
वीडियो चलाने की स्पीड सेट करना | अलग-अलग मीडिया प्लेबैक रेट. इसे डिफ़ॉल्ट रूप से हैंडल किया जाना चाहिए. किराये की दर के अनुरोधों को बदलने के लिए, SET_PLAYBACK_RATE मैसेज इंटरसेप्टर का इस्तेमाल किया जा सकता है. |
बोलकर दिए जाने वाले निर्देशों की मदद से मीडिया चलाने के लिए
बोलकर दिए गए निर्देश को Assistant पर मीडिया निर्देश ट्रिगर करने से रोकने के लिए-
सक्षम डिवाइस, आपको पहले इसे सेट करना होगा
इस्तेमाल किए जा सकने वाले मीडिया निर्देश
किस तरह की मदद चाहिए. इसके बाद आपको चालू करके उन निर्देशों को लागू करना होगा
यह
CastReceiverOptions.enforceSupportedCommands
प्रॉपर्टी. कास्ट SDK टूल और टच की सुविधा वाले डिवाइसों पर यूज़र इंटरफ़ेस (यूआई) इस तरह बदल जाएगा
ये कॉन्फ़िगरेशन दिखाते हैं. अगर फ़्लैग की सुविधा चालू नहीं है, तो इनकमिंग वॉइस का इस्तेमाल किया जा सकता है
कमांड काम करेंगे.
उदाहरण के लिए, अगर आपने ईमेल भेजने वाले के ऐप्लिकेशन से PAUSE
को इस्तेमाल करने की अनुमति दी है और
टच-चालू डिवाइस, आपको उन डिवाइस को दिखाने के लिए अपने रिसीवर को भी कॉन्फ़िगर करना होगा
सेटिंग. कॉन्फ़िगर किए जाने के बाद, बोलकर दिए जाने वाले निर्देश हटा दिए जाएंगे.
यह सूची, इस्तेमाल किए जा सकने वाले Command की सूची में शामिल की गई है.
नीचे दिए गए उदाहरण में, हम शुरू होने पर CastReceiverOptions
की सप्लाई कर रहे हैं
CastReceiverContext
. हमने 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 की वजह से ऐप्लिकेशन की आवाज़ को बैकग्राउंड में इस्तेमाल करता है
उपयोगकर्ता की बात को सुनने या वापस बात करने जैसी गतिविधि
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
कैप्शन चालू करो," क्योंकि भाषा का अनुमान
में कोई निर्देश दिया गया था. अगर भाषा का अनुरोध खास तौर पर किया गया हो, जैसे कि "ठीक है
Google, अंग्रेज़ी में कैप्शन की सुविधा चालू करो," isSuggestedLanguage
को false
पर सेट किया गया.
मेटाडेटा और वॉइस कास्ट करना
हालांकि, बोलकर दिए जाने वाले निर्देशों का इस्तेमाल डिफ़ॉल्ट रूप से वेब पाने वाला व्यक्ति मैनेज करता है, लेकिन आपको यह पक्का करें कि आपके कॉन्टेंट का मेटाडेटा पूरा और सटीक हो. इससे पक्का होता है कि Assistant, बोलकर दिए जाने वाले निर्देशों का सही तरीके से इस्तेमाल करती है. साथ ही, मेटाडेटा सभी नए टाइप के इंटरफ़ेस पर ठीक से दिखेगा. जैसे, Google Home ऐप्लिकेशन और Google Home Hub जैसे स्मार्ट डिसप्ले पर.
स्ट्रीम को ट्रांसफ़र करें
सेशन की स्थिति को बनाए रखना, स्ट्रीम ट्रांसफ़र का आधार होता है, जहां उपयोगकर्ता, बोलकर निर्देश देने की सुविधा और Google Home का इस्तेमाल करके, मौजूदा ऑडियो और वीडियो स्ट्रीम को सभी डिवाइसों पर ले जा सकते हैं ऐप्लिकेशन या स्मार्ट डिसप्ले. मीडिया एक डिवाइस (सोर्स) पर चलना बंद हो जाता है और दूसरे डिवाइस पर चलता रहता है ( गंतव्य). सबसे नए फ़र्मवेयर वाला कोई भी कास्ट डिवाइस, स्ट्रीम ट्रांसफ़र करने के लिए किया जा सकता है.
स्ट्रीम ट्रांसफ़र के लिए इवेंट फ़्लो यह है:
- सोर्स डिवाइस पर:
- मीडिया चलना बंद हो जाता है.
- वेब प्राप्तकर्ता ऐप्लिकेशन को वर्तमान मीडिया सहेजने के लिए आदेश प्राप्त होता है राज्य.
- वेब रिसीवर ऐप्लिकेशन बंद है.
- डेस्टिनेशन डिवाइस पर:
- वेब रिसीवर ऐप्लिकेशन लोड हो गया.
- वेब रिसीवर ऐप्लिकेशन को सेव किए गए मीडिया को वापस लाने के लिए निर्देश मिलता है राज्य.
- मीडिया फिर से चल रहा है.
मीडिया स्टेट के एलिमेंट में ये शामिल हैं:
- गाने, वीडियो या मीडिया आइटम की खास स्थिति या टाइमस्टैंप.
- यह प्लेलिस्ट या किसी कलाकार के रेडियो चैनल जैसी लंबी सूची में है.
- पुष्टि किया गया उपयोगकर्ता.
- वीडियो चलाने की स्थिति (उदाहरण के लिए, चलाना या रोकना).
स्ट्रीम ट्रांसफ़र करने की सुविधा चालू की जा रही है
अपने वेब पाने वाले के लिए स्ट्रीम ट्रांसफ़र लागू करने के लिए:
- अपडेट करें
supportedMediaCommands
STREAM_TRANSFER
निर्देश के साथ:playerManager.addSupportedMediaCommands( cast.framework.messages.Command.STREAM_TRANSFER, true);
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;
});
कस्टम डेटा यहां से वापस पाया जा सकता है
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;
});
पहले से लोड किया गया कॉन्टेंट
वेब रिसीवर मौजूदा प्लेबैक के बाद मीडिया आइटम को पहले से लोड करने की सुविधा देता है आइटम सूची में है.
पहले से लोड करने की कार्रवाई, साइट के कई सेगमेंट पहले से डाउनलोड कर लेती है आने वाले आइटम. यह स्पेसिफ़िकेशन यहां किया गया है: preloadTime मान में QueueItem ऑब्जेक्ट (अगर यह पैरामीटर उपलब्ध नहीं है, तो इसकी डिफ़ॉल्ट अवधि 20 सेकंड होती है). समय को सेकंड में दिखाया जाता है, वर्तमान में चल रहे आइटम के अंत से संबंधित . सिर्फ़ पॉज़िटिव वैल्यू ही मान्य. उदाहरण के लिए, अगर वैल्यू 10 सेकंड की है, तो इस आइटम में पहले से लोड 10 सेकंड होंगे पिछला आइटम खत्म होने से कुछ सेकंड पहले. अगर पेजों को पहले से लोड करने में ज़्यादा समय लगता है, तो मौजूदा आइटम के लिए बचे हुए समय से कम समय तक, पहले से लोड किया गया डेटा किया जा सकता है. इसलिए अगर listItem में प्रीलोड की बहुत बड़ी वैल्यू दी गई है, तो एक जब भी हम वर्तमान आइटम को खेल रहे हैं, तो उसके प्रभाव को प्राप्त किया जा सकता है अगले आइटम को पहले से लोड कर रहा है. हालांकि, हम सेटिंग और विकल्प को बेहतर बनाया है, क्योंकि इस वैल्यू से बैंडविथ और स्ट्रीमिंग की परफ़ॉर्मेंस पर असर पड़ सकता है चल रहे आइटम का हिस्सा दिख रहा है.
कॉन्टेंट को पहले से लोड करने की सुविधा, डिफ़ॉल्ट रूप से एचएलएस, डैश, और स्मूद स्ट्रीमिंग कॉन्टेंट के लिए काम करेगी.
सामान्य 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();
इसी तरह, वेब रिसीवर ऐप्लिकेशन, भेजने वालों को स्थिति के बारे में सूचित रख सकते हैं
के ज़रिए संपर्क करने के लिए बनाया गया है. वेब रिसीवर
ऐप्लिकेशन इसका उपयोग करके संदेश भेज सकता है
sendCustomMessage(namespace, senderId, message)
तारीख
CastReceiverContext
.
वेब प्राप्तकर्ता किसी व्यक्ति को संदेश भेज सकता है, भले ही वह उसके जवाब में हो
मिलने वाला मैसेज या ऐप्लिकेशन की स्थिति में बदलाव की वजह से एक जगह से दूसरी जगह तक
(64 केबी की सीमा की सीमा के साथ), वेब प्राप्तकर्ता भी संदेशों को
सभी कनेक्टेड भेजने वाले.
ऑडियो डिवाइसों के लिए कास्ट करें
ऑडियो पर सहायता पाने के लिए ऑडियो डिवाइस के लिए Google Cast गाइड देखें सिर्फ़ प्लेबैक.
Android TV
इस सेक्शन में बताया गया है कि Google Web रिसीवर, आपके इनपुट का इस्तेमाल प्लेबैक के तौर पर कैसे करता है, और Android TV के साथ काम करता है.
आपके ऐप्स को रिमोट कंट्रोल के साथ एकीकृत करना
Android TV डिवाइस पर चल रहा Google Web रिसीवर, डिवाइस से इनपुट का अनुवाद करता है
मीडिया प्लेबैक के तौर पर डिवाइस के कंट्रोल इनपुट (जैसे, हैंडहेल्ड रिमोट कंट्रोल)
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
. ऐसा इसलिए, क्योंकि ये अक्सर प्लैटफ़ॉर्म निर्भर करता है. मीडिया इवेंट देखें कृपया इसे पढ़ें. - कॉन्टेंट पाने वाले व्यक्ति की साइट के एचटीटीपीएस सर्टिफ़िकेट कॉन्फ़िगर करते समय, इंटरमीडिएट CA सर्टिफ़िकेट. ज़्यादा जानकारी के लिए, Qualsys एसएसएल टेस्ट पेज की मदद से पुष्टि करें: क्या आपकी साइट के भरोसेमंद सर्टिफ़िकेशन पाथ में कोई सीए (सर्टिफ़िकेट देने वाली संस्था) शामिल है ऐसे सर्टिफ़िकेट देते हैं जिस पर “अतिरिक्त डाउनलोड” लेबल लगा हो, तो हो सकता है कि यह Android प्लैटफ़ॉर्म.
- जहां Chromecast रिसीवर पेज को 720p ग्राफ़िक्स प्लेन पर दिखाता है, अन्य Android TV जैसे कास्ट प्लैटफ़ॉर्म पर पेज 1080 पिक्सल तक दिख सकता है. पक्का करें कि आपका रिसीवर पेज अलग-अलग रिज़ॉल्यूशन पर ग्रेसफ़ुली स्केल हो जाता है.