फ़्रेम रेट एपीआई की मदद से, ऐप्लिकेशन Android प्लैटफ़ॉर्म को अपने फ़्रेम रेट के बारे में बता सकते हैं. यह एपीआई, Android 11 (एपीआई लेवल 30) या उसके बाद के वर्शन को टारगेट करने वाले ऐप्लिकेशन के लिए उपलब्ध है. आम तौर पर, ज़्यादातर डिवाइसों में डिसप्ले का रिफ़्रेश रेट एक ही होता है. आम तौर पर, यह 60Hz होता है. हालांकि, अब इसमें बदलाव हो रहा है. अब कई डिवाइसों पर, 90Hz या 120Hz जैसे ज़्यादा रिफ़्रेश रेट का इस्तेमाल किया जा सकता है. कुछ डिवाइसों पर, रीफ़्रेश रेट को बिना किसी रुकावट के स्विच किया जा सकता है. वहीं, कुछ डिवाइसों पर रीफ़्रेश रेट स्विच करने के दौरान, कुछ समय के लिए स्क्रीन काली हो जाती है. आम तौर पर, यह कालापन एक सेकंड तक रहता है.
एपीआई का मुख्य मकसद, ऐप्लिकेशन को डिसप्ले के उन सभी रीफ़्रेश रेट का बेहतर तरीके से फ़ायदा उठाने में मदद करना है जिन पर यह काम करता है. उदाहरण के लिए, setFrameRate()
को कॉल करने वाला 24 हर्ट्ज़ वाला वीडियो चलाने वाले ऐप्लिकेशन की वजह से, डिवाइस का डिसप्ले रीफ़्रेश रेट 60 हर्ट्ज़ से 120 हर्ट्ज़ पर बदल सकता है. नए रिफ़्रेश रेट की मदद से, 24 हर्ट्ज़ वाले वीडियो को बिना किसी रुकावट के और बिना झटके के चलाया जा सकता है. इसके लिए, 3:2 पुल-डाउन की ज़रूरत नहीं होती. 60 हर्ट्ज़ वाले डिसप्ले पर, उसी वीडियो को चलाने के लिए पुल-डाउन की ज़रूरत होती है. इससे उपयोगकर्ताओं को बेहतर अनुभव मिलता है.
बुनियादी इस्तेमाल
Android, प्लैटफ़ॉर्म को ऐक्सेस और कंट्रोल करने के कई तरीके उपलब्ध कराता है. इसलिए, setFrameRate()
एपीआई के कई वर्शन हैं. एपीआई के हर वर्शन में एक जैसे पैरामीटर इस्तेमाल किए जाते हैं और यह दूसरे वर्शन की तरह ही काम करता है:
Surface.setFrameRate()
SurfaceControl.Transaction.setFrameRate()
ANativeWindow_setFrameRate()
ASurfaceTransaction_setFrameRate()
ऐप्लिकेशन को डिसप्ले के काम करने वाले रीफ़्रेश रेट पर ध्यान देने की ज़रूरत नहीं है. setFrameRate()
को सुरक्षित तरीके से कॉल करने के लिए, Display.getSupportedModes()
को कॉल करके, डिसप्ले के रीफ़्रेश रेट की जानकारी पाई जा सकती है. उदाहरण के लिए, अगर डिवाइस सिर्फ़ 60Hz पर काम करता है, तब भी setFrameRate()
को उस फ़्रेम रेट के साथ कॉल करें जो आपके ऐप्लिकेशन के हिसाब से सही हो.
जिन डिवाइसों पर ऐप्लिकेशन के फ़्रेम रेट के हिसाब से बेहतर रीफ़्रेश रेट नहीं है उन पर डिसप्ले का मौजूदा रीफ़्रेश रेट ही रहेगा.
setFrameRate()
को कॉल करने पर, डिसप्ले के रीफ़्रेश रेट में बदलाव होता है या नहीं, यह देखने के लिए डिसप्ले में बदलाव होने की सूचनाएं पाने के लिए रजिस्टर करें. इसके लिए, DisplayManager.registerDisplayListener()
या AChoreographer_registerRefreshRateCallback()
को कॉल करें.
setFrameRate()
को कॉल करते समय, पूर्णांक पर राउंड करने के बजाय, सटीक फ़्रेम रेट डालना बेहतर होता है. उदाहरण के लिए, 29.97 हर्ट्ज़ पर रिकॉर्ड किए गए वीडियो को रेंडर करते समय, उसे 30 के बजाय 29.97 के तौर पर पास करें.
वीडियो ऐप्लिकेशन के लिए, setFrameRate()
को पास किए गए, डिवाइस के साथ काम करने की सुविधा वाले पैरामीटर को Surface.FRAME_RATE_COMPATIBILITY_FIXED_SOURCE
पर सेट किया जाना चाहिए. इससे Android प्लैटफ़ॉर्म को यह अतिरिक्त जानकारी मिलती है कि ऐप्लिकेशन, डिसप्ले के रिफ़्रेश रेट के हिसाब से पुल-डाउन का इस्तेमाल करेगा. ऐसा करने पर, वीडियो में झटके आ सकते हैं.
कुछ मामलों में, वीडियो प्लैटफ़ॉर्म फ़्रेम सबमिट करना बंद कर देगा. हालांकि, वह कुछ समय तक स्क्रीन पर दिखता रहेगा. आम तौर पर, वीडियो के आखिर तक पहुंचने या उपयोगकर्ता के वीडियो को रोकने पर, वीडियो चलाने की प्रोसेस खत्म हो जाती है. इन मामलों में, setFrameRate()
को कॉल करें. इसके लिए, फ़्रेम रेट पैरामीटर को 0 पर सेट करें, ताकि प्लैटफ़ॉर्म के फ़्रेम रेट की सेटिंग को डिफ़ॉल्ट वैल्यू पर वापस लाया जा सके. फ़्रेम रेट की सेटिंग को इस तरह से मिटाना ज़रूरी नहीं है, जब सरफ़ेस को मिटाया जा रहा हो या जब उपयोगकर्ता किसी दूसरे ऐप्लिकेशन पर स्विच करने की वजह से सरफ़ेस छिपा हो. फ़्रेम रेट की सेटिंग को सिर्फ़ तब मिटाएं, जब सरफ़ेस का इस्तेमाल किए बिना ही वह दिखता रहे.
फ़्रेम रेट स्विच करने में लगने वाला समय
कुछ डिवाइसों पर, रीफ़्रेश रेट स्विच करने पर, विज़ुअल में रुकावट आ सकती है. जैसे, एक या दो सेकंड के लिए स्क्रीन का काला होना. आम तौर पर, यह समस्या सेट-टॉप बॉक्स, टीवी पैनल, और मिलते-जुलते डिवाइसों पर होती है. डिफ़ॉल्ट रूप से, Android फ़्रेमवर्क Surface.setFrameRate()
एपीआई को कॉल करने पर, मोड स्विच नहीं करता. ऐसा इसलिए किया जाता है, ताकि विज़ुअल में रुकावट न आए.
कुछ उपयोगकर्ता लंबी अवधि के वीडियो की शुरुआत और आखिर में विज्ञापन देखना पसंद करते हैं. इससे डिसप्ले का रीफ़्रेश रेट, वीडियो के फ़्रेम रेट से मैच हो पाता है. साथ ही, फ़िल्म चलाने के दौरान 3:2 पुल-डाउन जडर जैसे फ़्रेम रेट कन्वर्ज़न आर्टफ़ैक्ट से बचा जा सकता है.
इस वजह से, रिफ़्रेश रेट के बीच अचानक बदलाव होने की सुविधा को तब चालू किया जा सकता है, जब उपयोगकर्ता और ऐप्लिकेशन, दोनों के लिए यह सुविधा चालू की गई हो:
- उपयोगकर्ता: ऑप्ट-इन करने के लिए, उपयोगकर्ता कॉन्टेंट के फ़्रेम रेट से मैच करें उपयोगकर्ता सेटिंग को चालू कर सकते हैं.
- ऐप्लिकेशन: ऑप्ट इन करने के लिए, ऐप्लिकेशन
CHANGE_FRAME_RATE_ALWAYS
कोsetFrameRate()
में भेज सकते हैं.
हमारा सुझाव है कि फ़िल्मों जैसे लंबी अवधि वाले वीडियो के लिए, हमेशा CHANGE_FRAME_RATE_ALWAYS
का इस्तेमाल करें. ऐसा इसलिए है, क्योंकि वीडियो फ़्रेम रेट को मैच करने का फ़ायदा, रीफ़्रेश रेट बदलने पर होने वाली रुकावट से ज़्यादा होता है.
कुछ और सुझाव
आम तौर पर होने वाली समस्याओं के लिए, इन सुझावों का पालन करें.
एक से ज़्यादा प्लैटफ़ॉर्म
Android प्लैटफ़ॉर्म को उन स्थितियों को सही तरीके से मैनेज करने के लिए डिज़ाइन किया गया है जहां अलग-अलग फ़्रेम रेट सेटिंग वाले कई प्लैटफ़ॉर्म होते हैं. अगर आपके ऐप्लिकेशन में अलग-अलग फ़्रेम रेट वाले कई प्लैटफ़ॉर्म हैं, तो हर प्लैटफ़ॉर्म के लिए सही फ़्रेम रेट के साथ setFrameRate()
को कॉल करें. भले ही, डिवाइस पर स्प्लिट स्क्रीन या पिक्चर में पिक्चर मोड का इस्तेमाल करके, एक साथ कई ऐप्लिकेशन चल रहे हों, फिर भी हर ऐप्लिकेशन अपने प्लैटफ़ॉर्म के लिए setFrameRate()
को सुरक्षित तरीके से कॉल कर सकता है.
प्लैटफ़ॉर्म, ऐप्लिकेशन के फ़्रेम रेट में नहीं बदलता
भले ही, डिवाइस उस फ़्रेम रेट के साथ काम करता हो जिसे ऐप्लिकेशन ने setFrameRate()
को कॉल करने में बताया है, लेकिन कुछ मामलों में डिवाइस डिसप्ले को उस रिफ़्रेश रेट पर स्विच नहीं करेगा. उदाहरण के लिए, ज़्यादा प्राथमिकता वाले प्लैटफ़ॉर्म पर फ़्रेम रेट की सेटिंग अलग हो सकती है या डिवाइस बैटरी सेवर मोड में हो सकता है. बैटरी सेवर मोड में, डिसप्ले के रीफ़्रेश रेट पर पाबंदी लगाई जाती है, ताकि बैटरी बचाई जा सके. अगर डिवाइस, डिसप्ले के रीफ़्रेश रेट को ऐप्लिकेशन के फ़्रेम रेट की सेटिंग पर स्विच नहीं करता है, तब भी ऐप्लिकेशन को सही तरीके से काम करना चाहिए. भले ही, डिवाइस सामान्य परिस्थितियों में स्विच करता हो.
जब डिसप्ले की रीफ़्रेश दर, ऐप्लिकेशन के फ़्रेम रेट से मेल नहीं खाती है, तो ऐप्लिकेशन यह तय करता है कि उसे क्या करना है. वीडियो के लिए, फ़्रेम रेट को सोर्स वीडियो के हिसाब से तय किया जाता है. साथ ही, वीडियो कॉन्टेंट दिखाने के लिए, पुल-डाउन की ज़रूरत होगी. इसके बजाय, गेम अपने पसंदीदा फ़्रेम रेट पर काम करने के बजाय, डिसप्ले के रीफ़्रेश रेट पर काम करने का विकल्प चुन सकता है. प्लैटफ़ॉर्म के काम करने के तरीके के आधार पर, ऐप्लिकेशन को setFrameRate()
को भेजी जाने वाली वैल्यू में बदलाव नहीं करना चाहिए. यह ऐप्लिकेशन के पसंदीदा फ़्रेम रेट पर सेट रहना चाहिए. भले ही, ऐप्लिकेशन उन मामलों को कैसे हैंडल करता हो जहां प्लैटफ़ॉर्म, ऐप्लिकेशन के अनुरोध के हिसाब से अडजस्ट नहीं होता. इस तरह, अगर डिवाइस की स्थितियों में बदलाव होता है, ताकि डिसप्ले के रीफ़्रेश रेट का इस्तेमाल किया जा सके, तो प्लैटफ़ॉर्म के पास ऐप्लिकेशन के पसंदीदा फ़्रेम रेट पर स्विच करने के लिए सही जानकारी होती है.
अगर ऐप्लिकेशन, डिसप्ले के रीफ़्रेश रेट पर नहीं चलता या चल नहीं सकता, तो ऐप्लिकेशन को हर फ़्रेम के लिए प्रज़ेंटेशन टाइमस्टैंप बताने चाहिए. इसके लिए, प्रज़ेंटेशन टाइमस्टैंप सेट करने के लिए, प्लैटफ़ॉर्म के किसी एक तरीके का इस्तेमाल करें:
इन टाइमस्टैंप का इस्तेमाल करने से, प्लैटफ़ॉर्म किसी ऐप्लिकेशन फ़्रेम को बहुत जल्दी दिखाना बंद कर देता है. इस वजह से, ऐप्लिकेशन में झटके आ सकते हैं. फ़्रेम के प्रज़ेंटेशन टाइमस्टैंप का सही इस्तेमाल करना थोड़ा मुश्किल है. गेम के लिए, ज़्यादा जानकारी के लिए हमारी फ़्रेम पेसिंग गाइड देखें. इससे आपको गेम में रुकावट आने से बचने में मदद मिलेगी. साथ ही, Android फ़्रेम पेसिंग लाइब्रेरी का इस्तेमाल करें.
कुछ मामलों में, प्लैटफ़ॉर्म setFrameRate()
में ऐप्लिकेशन के तय किए गए फ़्रेम रेट के कई गुना पर स्विच कर सकता है. उदाहरण के लिए, कोई ऐप्लिकेशन 60 हर्ट्ज़ पर setFrameRate()
को कॉल कर सकता है और डिवाइस, डिसप्ले को 120 हर्ट्ज़ पर स्विच कर सकता है. ऐसा होने की एक वजह यह हो सकती है कि किसी दूसरे ऐप्लिकेशन में 24Hz की फ़्रेम रेट सेटिंग वाला कोई प्लैटफ़ॉर्म हो. ऐसे में, डिसप्ले को 120 हर्ट्ज़ पर चलाने से, 60 हर्ट्ज़ और 24 हर्ट्ज़, दोनों तरह के डिसप्ले बिना किसी पुल-डाउन के चल पाएंगे.
जब डिसप्ले, ऐप्लिकेशन के फ़्रेम रेट से कई गुना तेज़ी से चल रहा हो, तो ऐप्लिकेशन को हर फ़्रेम के लिए प्रज़ेंटेशन टाइमस्टैंप बताने चाहिए, ताकि ग़ैर-ज़रूरी झटके से बचा जा सके. गेम के लिए, Android फ़्रेम पेसिंग लाइब्रेरी, फ़्रेम प्रज़ेंटेशन टाइमस्टैंप को सही तरीके से सेट करने में मदद करती है.
setFrameRate() बनाम preferredDisplayModeId
WindowManager.LayoutParams.preferredDisplayModeId
एक और तरीका है जिससे ऐप्लिकेशन, प्लैटफ़ॉर्म को अपना फ़्रेम रेट बता सकते हैं. कुछ ऐप्लिकेशन, डिसप्ले रिज़ॉल्यूशन जैसी डिसप्ले मोड की अन्य सेटिंग बदलने के बजाय, सिर्फ़ डिसप्ले रीफ़्रेश रेट बदलना चाहते हैं. आम तौर पर, preferredDisplayModeId
के बजाय setFrameRate()
का इस्तेमाल करें. setFrameRate()
फ़ंक्शन का इस्तेमाल करना आसान है, क्योंकि ऐप्लिकेशन को किसी खास फ़्रेम रेट वाले मोड को ढूंढने के लिए, डिसप्ले मोड की सूची में खोजने की ज़रूरत नहीं पड़ती.
setFrameRate()
की मदद से, प्लैटफ़ॉर्म को उन स्थितियों में काम करने वाला फ़्रेम रेट चुनने के ज़्यादा अवसर मिलते हैं जहां एक से ज़्यादा डिवाइस अलग-अलग फ़्रेम रेट पर काम कर रहे हों. उदाहरण के लिए, मान लें कि Pixel 4 पर दो ऐप्लिकेशन, स्प्लिट-स्क्रीन मोड में चल रहे हैं. इनमें से एक ऐप्लिकेशन 24Hz वीडियो चला रहा है और दूसरा ऐप्लिकेशन, उपयोगकर्ता को स्क्रोल की जा सकने वाली सूची दिखा रहा है. Pixel 4 में डिसप्ले के दो रीफ़्रेश रेट काम करते हैं: 60 हर्ट्ज़ और 90 हर्ट्ज़. preferredDisplayModeId
एपीआई का इस्तेमाल करने पर, वीडियो प्लैटफ़ॉर्म को 60Hz या 90Hz में से किसी एक को चुनना पड़ता है. 24 हर्ट्ज़ पर setFrameRate()
को कॉल करके, वीडियो प्लैटफ़ॉर्म को सोर्स वीडियो के फ़्रेम रेट के बारे में ज़्यादा जानकारी मिलती है. इससे प्लैटफ़ॉर्म, डिसप्ले रीफ़्रेश रेट के लिए 90 हर्ट्ज़ चुन सकता है, जो इस स्थिति में 60 हर्ट्ज़ से बेहतर है.
हालांकि, कुछ मामलों में setFrameRate()
के बजाय preferredDisplayModeId
का इस्तेमाल किया जाना चाहिए. जैसे:
- अगर ऐप्लिकेशन को रिज़ॉल्यूशन या डिसप्ले मोड की अन्य सेटिंग बदलनी है, तो
preferredDisplayModeId
का इस्तेमाल करें. - प्लैटफ़ॉर्म,
setFrameRate()
को कॉल करने पर डिसप्ले मोड को सिर्फ़ तब स्विच करेगा, जब मोड स्विच करना आसान हो और उपयोगकर्ता को इसका पता न चले. अगर ऐप्लिकेशन, डिसप्ले के रीफ़्रेश रेट को स्विच करना चाहता है, भले ही इसके लिए ज़्यादा मोड स्विच करने की ज़रूरत हो (उदाहरण के लिए, Android TV डिवाइस पर), तोpreferredDisplayModeId
का इस्तेमाल करें. - जिन ऐप्लिकेशन में ऐप्लिकेशन के फ़्रेम रेट के कई गुना पर चलने वाले डिसप्ले को मैनेज करने की सुविधा नहीं होती, उन्हें
preferredDisplayModeId
का इस्तेमाल करना चाहिए. इसके लिए, हर फ़्रेम पर प्रज़ेंटेशन टाइमस्टैंप सेट करना ज़रूरी होता है.
setFrameRate() बनाम preferredRefreshRate
WindowManager.LayoutParams#preferredRefreshRate
, ऐप्लिकेशन की विंडो पर पसंदीदा फ़्रेम रेट सेट करता है. यह रेट, विंडो के सभी प्लैटफ़ॉर्म पर लागू होता है. ऐप्लिकेशन को अपने पसंदीदा फ़्रेम रेट की जानकारी देनी चाहिए. भले ही, डिवाइस पर काम करने वाले रीफ़्रेश रेट, setFrameRate()
की तरह ही हों. इससे शेड्यूलर को ऐप्लिकेशन के लिए सही फ़्रेम रेट का बेहतर अनुमान लगाने में मदद मिलती है.
setFrameRate()
का इस्तेमाल करने वाले Surfaces के लिए, preferredRefreshRate
को अनदेखा किया जाता है. आम तौर पर, अगर हो सके, तो setFrameRate()
का इस्तेमाल करें.
preferredRefreshRate बनाम preferredDisplayModeId
अगर ऐप्लिकेशन सिर्फ़ पसंदीदा रीफ़्रेश रेट बदलना चाहते हैं, तो preferredDisplayModeId
के बजाय preferredRefreshRate
का इस्तेमाल करना बेहतर होता है.
setFrameRate() को बार-बार कॉल करने से बचना
परफ़ॉर्मेंस के लिहाज़ से, setFrameRate()
कॉल की लागत बहुत ज़्यादा नहीं होती. हालांकि, ऐप्लिकेशन को हर फ़्रेम या हर सेकंड में कई बार setFrameRate()
कॉल करने से बचना चाहिए. setFrameRate()
को कॉल करने से, डिसप्ले के रीफ़्रेश रेट में बदलाव हो सकता है. इस वजह से, ट्रांज़िशन के दौरान फ़्रेम ड्रॉप हो सकता है.
आपको पहले से ही सही फ़्रेम रेट का पता लगा लेना चाहिए और एक बार setFrameRate()
को कॉल करना चाहिए.
गेम या वीडियो वाले ऐप्लिकेशन के अलावा अन्य ऐप्लिकेशन के लिए इस्तेमाल करना
setFrameRate()
एपीआई का मुख्य इस्तेमाल वीडियो के लिए किया जाता है. हालांकि, इसका इस्तेमाल अन्य ऐप्लिकेशन के लिए भी किया जा सकता है. उदाहरण के लिए, कोई ऐसा गेम जो 60Hz से ज़्यादा पर न चलने के लिए (बिजली की खपत कम करने और गेमप्ले के सेशन को लंबा करने के लिए) Surface.setFrameRate(60, Surface.FRAME_RATE_COMPATIBILITY_DEFAULT)
को कॉल कर सकता है. इस तरह, डिफ़ॉल्ट रूप से 90Hz पर चलने वाला डिवाइस, गेम के चालू होने पर 60Hz पर चलेगा. इससे, डिसप्ले के 90Hz पर चलने के दौरान गेम के 60Hz पर चलने से होने वाली झटके वाली फ़ील से बचा जा सकेगा.
FRAME_RATE_COMPATIBILITY_FIXED_SOURCE का इस्तेमाल
FRAME_RATE_COMPATIBILITY_FIXED_SOURCE
सिर्फ़ वीडियो ऐप्लिकेशन के लिए है. वीडियो के अलावा, किसी और काम के लिए ट्रैक का इस्तेमाल करने के लिए, FRAME_RATE_COMPATIBILITY_DEFAULT
का इस्तेमाल करें.
फ़्रेम रेट बदलने के लिए रणनीति चुनना
- हमारा सुझाव है कि ऐप्लिकेशन, लंबी अवधि के वीडियो, जैसे कि फ़िल्में दिखाते समय
setFrameRate(
fps, FRAME_RATE_COMPATIBILITY_FIXED_SOURCE, CHANGE_FRAME_RATE_ALWAYS)
को कॉल करें. यहां fps, वीडियो का फ़्रेम रेट होता है. - हमारा सुझाव है कि अगर आपको लगता है कि वीडियो प्लेबैक कुछ मिनट या उससे कम समय तक चलेगा, तो ऐप्लिकेशन
CHANGE_FRAME_RATE_ALWAYS
के साथsetFrameRate()
को कॉल न करें.
वीडियो चलाने वाले ऐप्लिकेशन के लिए इंटिग्रेशन का उदाहरण
हमारा सुझाव है कि वीडियो चलाने वाले ऐप्लिकेशन में रीफ़्रेश रेट स्विच को इंटिग्रेट करने के लिए, यह तरीका अपनाएं:
changeFrameRateStrategy
तय करें:- अगर कोई लंबी अवधि वाला वीडियो चलाना है, जैसे कि कोई फ़िल्म, तो
MATCH_CONTENT_FRAMERATE_ALWAYS
का इस्तेमाल करें - अगर आपको कोई शॉर्ट वीडियो चलाना है, जैसे कि मूवी का ट्रेलर, तो
CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS
का इस्तेमाल करें
- अगर कोई लंबी अवधि वाला वीडियो चलाना है, जैसे कि कोई फ़िल्म, तो
- अगर
changeFrameRateStrategy
CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS
है, तो चौथे चरण पर जाएं. - यह पता लगाएं कि रीफ़्रेश रेट में बिना किसी रुकावट के स्विच होने की संभावना है या नहीं. इसके लिए, यह देखें कि ये दोनों बातें सही हैं या नहीं:
- मौजूदा रिफ़्रेश रेट (इसे C कहें) से वीडियो के फ़्रेम रेट (इसे V कहें) पर, बिना किसी रुकावट के स्विच नहीं किया जा सकता. ऐसा तब होगा, जब C और V अलग-अलग हों और
Display.getMode().getAlternativeRefreshRates
में V का कोई गुणक न हो. - उपयोगकर्ता ने रीफ़्रेश रेट में बिना किसी रुकावट के होने वाले बदलावों के लिए ऑप्ट-इन नहीं किया है. इसकी पहचान करने के लिए, देखें कि
DisplayManager.getMatchContentFrameRateUserPreference
सेMATCH_CONTENT_FRAMERATE_ALWAYS
मिलता है या नहीं
- मौजूदा रिफ़्रेश रेट (इसे C कहें) से वीडियो के फ़्रेम रेट (इसे V कहें) पर, बिना किसी रुकावट के स्विच नहीं किया जा सकता. ऐसा तब होगा, जब C और V अलग-अलग हों और
- अगर स्विच करने में कोई समस्या नहीं आनी है, तो ये काम करें:
setFrameRate
को कॉल करें और उसेfps
,FRAME_RATE_COMPATIBILITY_FIXED_SOURCE
, औरchangeFrameRateStrategy
पास करें. यहांfps
, वीडियो का फ़्रेम रेट है.- वीडियो चलाना
- अगर कोई ऐसा बदलाव होने वाला है जो आसानी से नहीं हो सकता, तो ये काम करें:
- उपयोगकर्ता को सूचना देने के लिए, यूज़र एक्सपीरियंस दिखाएं. ध्यान दें कि हमारा सुझाव है कि आप उपयोगकर्ता को इस यूज़र एक्सपीरियंस को खारिज करने का तरीका दें.इससे, उपयोगकर्ता को पांचवें चरण के डी में ज़्यादा देरी नहीं करनी पड़ेगी. ऐसा इसलिए है, क्योंकि हमारे सुझाए गए डिले की अवधि, तेज़ी से स्विच करने वाले डिसप्ले के लिए ज़रूरत से ज़्यादा है.
setFrameRate
को कॉल करें और उसेfps
,FRAME_RATE_COMPATIBILITY_FIXED_SOURCE
, औरCHANGE_FRAME_RATE_ALWAYS
पास करें. यहांfps
, वीडियो का फ़्रेम रेट है.onDisplayChanged
कॉलबैक का इंतज़ार करें.- मोड स्विच होने में दो सेकंड लगेंगे.
- वीडियो चलाना
आसानी से स्विच करने की सुविधा के लिए, सिर्फ़ सूडो-कोड इस तरह का होना चाहिए:
SurfaceControl.Transaction transaction = new SurfaceControl.Transaction();
transaction.setFrameRate(surfaceControl,
contentFrameRate,
FRAME_RATE_COMPATIBILITY_FIXED_SOURCE,
CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS);
transaction.apply();
beginPlayback();
ऊपर बताए गए तरीके से, अपने-आप स्विच होने की सुविधा और बिना अपने-आप स्विच होने की सुविधा के काम करने वाले आभासी कोड का उदाहरण यहां दिया गया है:
SurfaceControl.Transaction transaction = new SurfaceControl.Transaction();
if (isSeamlessSwitch(contentFrameRate)) {
transaction.setFrameRate(surfaceControl,
contentFrameRate,
FRAME_RATE_COMPATIBILITY_FIXED_SOURCE,
CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS);
transaction.apply();
beginPlayback();
} else if (displayManager.getMatchContentFrameRateUserPreference()
== MATCH_CONTENT_FRAMERATE_ALWAYS) {
showRefreshRateSwitchUI();
sleep(shortDelaySoUserSeesUi);
displayManager.registerDisplayListener(…);
transaction.setFrameRate(surfaceControl,
contentFrameRate,
FRAME_RATE_COMPATIBILITY_FIXED_SOURCE,
CHANGE_FRAME_RATE_ALWAYS);
transaction.apply();
waitForOnDisplayChanged();
sleep(twoSeconds);
hideRefreshRateSwitchUI();
beginPlayback();
}