फ़्रेम रेट एपीआई की मदद से, ऐप्लिकेशन Android प्लैटफ़ॉर्म को अपने तय किए गए फ़्रेम रेट के बारे में बता सकते हैं. यह एपीआई, Android 11 (एपीआई लेवल 30) या इसके बाद के वर्शन को टारगेट करने वाले ऐप्लिकेशन के लिए उपलब्ध है. आम तौर पर, ज़्यादातर डिवाइसों पर डिसप्ले की रीफ़्रेश दर सिर्फ़ एक होती है. आम तौर पर, यह 60 हर्ट्ज़ होती है. हालांकि, अब इसमें बदलाव हो रहा है. अब कई डिवाइसों पर 90 हर्ट्ज़ या 120 हर्ट्ज़ जैसी अन्य रीफ़्रेश दरें भी उपलब्ध हैं. कुछ डिवाइसों पर, रीफ़्रेश दर में बिना किसी रुकावट के बदलाव किया जा सकता है. वहीं, कुछ डिवाइसों पर एक या दो सेकंड के लिए काली स्क्रीन दिखती है.
इस एपीआई का मुख्य मकसद, ऐप्लिकेशन को डिसप्ले की सभी उपलब्ध रीफ़्रेश दरों का बेहतर तरीके से फ़ायदा उठाने की सुविधा देना है. उदाहरण के लिए, अगर कोई ऐप्लिकेशन 24 हर्ट्ज़ का वीडियो चला रहा है और वह setFrameRate() को कॉल करता है, तो हो सकता है कि डिवाइस, डिसप्ले की रीफ़्रेश दर को 60 हर्ट्ज़ से बदलकर 120 हर्ट्ज़ कर दे. इस नई रीफ़्रेश दर से, 24 हर्ट्ज़ का वीडियो बिना किसी रुकावट के और आसानी से चलाया जा सकता है. इसके लिए, 3:2 पुलडाउन की ज़रूरत नहीं होती. हालांकि, 60 हर्ट्ज़ के डिसप्ले पर वही वीडियो चलाने के लिए, इसकी ज़रूरत होती है. इससे उपयोगकर्ताओं को बेहतर अनुभव मिलता है.
बुनियादी इस्तेमाल
Android, प्लैटफ़ॉर्म को ऐक्सेस करने और कंट्रोल करने के कई तरीके उपलब्ध कराता है. इसलिए, setFrameRate() एपीआई के कई वर्शन उपलब्ध हैं. एपीआई के हर वर्शन में एक ही पैरामीटर इस्तेमाल किए जाते हैं और वे सभी एक ही तरह से काम करते हैं:
Surface.setFrameRate()SurfaceControl.Transaction.setFrameRate()ANativeWindow_setFrameRate()ASurfaceTransaction_setFrameRate()
`setFrameRate()` को सुरक्षित तरीके से कॉल करने के लिए, ऐप्लिकेशन को डिसप्ले की उन रीफ़्रेश दरों के बारे में जानने की ज़रूरत नहीं होती जो काम करती हैं,
इन दरों की जानकारी,
Display.getSupportedModes() को कॉल करके हासिल की जा सकती है. उदाहरण के लिए, भले ही डिवाइस पर सिर्फ़ 60 हर्ट्ज़ की रीफ़्रेश दर काम करती हो, फिर भी अपने ऐप्लिकेशन के लिए तय किए गए फ़्रेम रेट के साथ setFrameRate() को कॉल करें.
जिन डिवाइसों पर ऐप्लिकेशन के फ़्रेम रेट के हिसाब से बेहतर रीफ़्रेश दर उपलब्ध नहीं है उन पर, डिसप्ले की मौजूदा रीफ़्रेश दर ही बनी रहेगी.
यह देखने के लिए कि setFrameRate() को कॉल करने पर, डिसप्ले की रीफ़्रेश
दर में बदलाव होता है या नहीं, डिसप्ले में होने वाले बदलावों की सूचनाएं पाने के लिए
DisplayManager.registerDisplayListener()
या AChoreographer_registerRefreshRateCallback() को कॉल करके रजिस्टर करें.
setFrameRate() को कॉल करते समय, फ़्रेम रेट को पूर्णांक में राउंड करने के बजाय, सटीक फ़्रेम रेट पास करना सबसे अच्छा होता है. उदाहरण के लिए, 29.97 हर्ट्ज़ पर रिकॉर्ड किए गए वीडियो को रेंडर करते समय, 30 में राउंड करने के बजाय 29.97 पास करें.
वीडियो ऐप्लिकेशन के लिए, setFrameRate() को पास किया गया कंपैटिबिलिटी पैरामीटर, Surface.FRAME_RATE_COMPATIBILITY_FIXED_SOURCE पर सेट होना चाहिए. इससे Android प्लैटफ़ॉर्म को यह अतिरिक्त जानकारी मिलती है कि ऐप्लिकेशन, डिसप्ले की ऐसी रीफ़्रेश दर के हिसाब से काम करेगा जो वीडियो के फ़्रेम रेट से मेल नहीं खाती. इसके लिए, पुलडाउन का इस्तेमाल किया जाएगा. इससे वीडियो में रुकावट आ सकती है.
कुछ मामलों में, वीडियो प्लैटफ़ॉर्म, फ़्रेम सबमिट करना बंद कर देगा. हालांकि, यह कुछ समय के लिए स्क्रीन पर दिखता रहेगा. आम तौर पर, ऐसा तब होता है, जब वीडियो खत्म होने वाला हो या जब उपयोगकर्ता वीडियो को पॉज़ करता है. इन मामलों में, प्लैटफ़ॉर्म के फ़्रेम रेट की सेटिंग को डिफ़ॉल्ट वैल्यू पर वापस लाने के लिए, फ़्रेम रेट पैरामीटर को 0 पर सेट करके setFrameRate() को कॉल करें. प्लैटफ़ॉर्म को बंद करते समय या जब उपयोगकर्ता किसी दूसरे ऐप्लिकेशन पर स्विच करता है, तब प्लैटफ़ॉर्म को छिपाने पर, फ़्रेम रेट की सेटिंग को साफ़ करने की ज़रूरत नहीं होती. फ़्रेम रेट की सेटिंग सिर्फ़ तब साफ़ करें, जब प्लैटफ़ॉर्म इस्तेमाल किए बिना दिखता रहे.
रीफ़्रेश दर में बिना किसी रुकावट के बदलाव न होना
कुछ डिवाइसों पर, रीफ़्रेश दर में बदलाव करने पर, एक या दो सेकंड के लिए काली स्क्रीन दिखने जैसी समस्याएं हो सकती हैं. आम तौर पर, ऐसा सेट टॉप बॉक्स, टीवी पैनल, और इसी तरह के अन्य डिवाइसों पर होता है. डिफ़ॉल्ट तौर पर, Android फ़्रेमवर्क, मोड स्विच नहीं करता है
जब Surface.setFrameRate()
एपीआई को कॉल किया जाता है, ताकि ऐसी समस्याओं से बचा जा सके.
कुछ उपयोगकर्ताओं को लंबे वीडियो की शुरुआत और आखिर में, एक या दो सेकंड के लिए काली स्क्रीन दिखने जैसी समस्याएं पसंद होती हैं. इससे डिसप्ले की रीफ़्रेश दर, वीडियो के फ़्रेम रेट से मेल खाती है. साथ ही, फ़्रेम रेट कन्वर्ज़न से जुड़ी समस्याएं नहीं होतीं. जैसे, फ़िल्म चलाने के लिए 3:2 पुलडाउन की वजह से होने वाली रुकावट.
इसलिए, रीफ़्रेश दर में बिना किसी रुकावट के बदलाव न होने की सुविधा, तब चालू की जा सकती है, जब उपयोगकर्ता और ऐप्लिकेशन, दोनों ऑप्ट-इन करें:
- उपयोगकर्ता: ऑप्ट-इन करने के लिए, उपयोगकर्ता, कॉन्टेंट के फ़्रेम रेट से मैच करने वाली सेटिंग को चालू कर सकते हैं.
- ऐप्लिकेशन: ऑप्ट-इन करने के लिए, ऐप्लिकेशन
CHANGE_FRAME_RATE_ALWAYSकोsetFrameRate()में पास कर सकते हैं.
हमारा सुझाव है कि फ़िल्मों जैसे लंबे वीडियो के लिए, हमेशा CHANGE_FRAME_RATE_ALWAYS
का इस्तेमाल करें. ऐसा इसलिए, क्योंकि रीफ़्रेश दर में बदलाव करने पर होने वाली रुकावट के मुकाबले, वीडियो के फ़्रेम रेट से मैच करने का फ़ायदा ज़्यादा होता है.
कुछ और सुझाव
आम तौर पर होने वाली समस्याओं के लिए, इन सुझावों को अपनाएं.
एक से ज़्यादा प्लैटफ़ॉर्म
Android प्लैटफ़ॉर्म को इस तरह से डिज़ाइन किया गया है कि वह उन स्थितियों को सही तरीके से हैंडल कर सके जहां अलग-अलग फ़्रेम रेट सेटिंग वाले एक से ज़्यादा प्लैटफ़ॉर्म मौजूद हों. जब आपके ऐप्लिकेशन में अलग-अलग फ़्रेम रेट वाले एक से ज़्यादा प्लैटफ़ॉर्म मौजूद हों, तो हर प्लैटफ़ॉर्म के लिए सही फ़्रेम रेट के साथ setFrameRate() को कॉल करें. भले ही, डिवाइस पर एक साथ कई ऐप्लिकेशन चल रहे हों, स्प्लिट स्क्रीन या पिक्चर-इन-पिक्चर मोड का इस्तेमाल किया जा रहा हो, हर ऐप्लिकेशन अपने प्लैटफ़ॉर्म के लिए सुरक्षित तरीके से setFrameRate() को कॉल कर सकता है.
प्लैटफ़ॉर्म, ऐप्लिकेशन के फ़्रेम रेट पर स्विच नहीं करता
भले ही, डिवाइस उस फ़्रेम रेट के साथ काम करता हो जिसे ऐप्लिकेशन, setFrameRate() को कॉल करके तय करता है, लेकिन कुछ मामलों में डिवाइस, डिसप्ले को उस रीफ़्रेश दर पर स्विच नहीं करेगा. उदाहरण के लिए, ज़्यादा प्राथमिकता वाले प्लैटफ़ॉर्म की फ़्रेम रेट सेटिंग अलग हो सकती है या डिवाइस, बैटरी सेवर मोड में हो सकता है. इस मोड में, बैटरी बचाने के लिए, डिसप्ले की रीफ़्रेश दर पर पाबंदी लगाई जाती है. जब डिवाइस, डिसप्ले की रीफ़्रेश दर को ऐप्लिकेशन के फ़्रेम रेट सेटिंग पर स्विच नहीं करता है, तब भी ऐप्लिकेशन को सही तरीके से काम करना चाहिए. भले ही, सामान्य परिस्थितियों में डिवाइस स्विच करता हो.
यह तय करना ऐप्लिकेशन पर निर्भर करता है कि डिसप्ले की रीफ़्रेश दर, ऐप्लिकेशन के फ़्रेम रेट से मेल न खाने पर, उसे कैसे जवाब देना है. वीडियो के लिए, फ़्रेम रेट, सोर्स वीडियो के फ़्रेम रेट पर फ़िक्स होता है. साथ ही, वीडियो कॉन्टेंट दिखाने के लिए, पुलडाउन की ज़रूरत होगी. कोई गेम, अपने तय किए गए फ़्रेम रेट पर बने रहने के बजाय, डिसप्ले की रीफ़्रेश दर पर चलने की कोशिश कर सकता है. प्लैटफ़ॉर्म के काम करने के तरीके के आधार पर, ऐप्लिकेशन को setFrameRate() को पास की गई वैल्यू में बदलाव नहीं करना चाहिए. इसे ऐप्लिकेशन के तय किए गए फ़्रेम रेट पर सेट रहना चाहिए. भले ही, ऐप्लिकेशन उन मामलों को कैसे हैंडल करता हो जहां प्लैटफ़ॉर्म, ऐप्लिकेशन के अनुरोध के हिसाब से अडजस्ट नहीं होता. इससे, अगर डिवाइस की स्थितियां बदलकर, डिसप्ले की अन्य रीफ़्रेश दरों का इस्तेमाल करने की अनुमति मिलती है, तो प्लैटफ़ॉर्म के पास ऐप्लिकेशन के तय किए गए फ़्रेम रेट पर स्विच करने के लिए सही जानकारी होती है.
ऐसे मामलों में जहां ऐप्लिकेशन, डिसप्ले की रीफ़्रेश दर पर नहीं चलेगा या नहीं चल सकता, ऐप्लिकेशन को हर फ़्रेम के लिए, प्रज़ेंटेशन टाइमस्टैंप तय करने चाहिए. इसके लिए, प्लैटफ़ॉर्म के प्रज़ेंटेशन टाइमस्टैंप सेट करने के किसी एक तरीके का इस्तेमाल करें:
इन टाइमस्टैंप का इस्तेमाल करने से, प्लैटफ़ॉर्म, ऐप्लिकेशन के फ़्रेम को बहुत पहले नहीं दिखाएगा. ऐसा होने पर, वीडियो में रुकावट आ सकती है. फ़्रेम प्रज़ेंटेशन टाइमस्टैंप का सही तरीके से इस्तेमाल करना थोड़ा मुश्किल है. गेम के लिए, रुकावट से बचने के बारे में ज़्यादा जानने के लिए, हमारी फ़्रेम पेसिंग गाइड देखें. साथ ही, Android Frame Pacing लाइब्रेरीका इस्तेमाल करने पर विचार करें.
कुछ मामलों में, प्लैटफ़ॉर्म, setFrameRate() में ऐप्लिकेशन के तय किए गए फ़्रेम रेट के मल्टीपल पर स्विच कर सकता है. उदाहरण के लिए, कोई ऐप्लिकेशन 60 हर्ट्ज़ के साथ setFrameRate() को कॉल कर सकता है और डिवाइस, डिसप्ले को 120 हर्ट्ज़ पर स्विच कर सकता है. ऐसा होने की एक वजह यह हो सकती है कि किसी दूसरे ऐप्लिकेशन के पास 24 हर्ट्ज़ की फ़्रेम रेट सेटिंग वाला प्लैटफ़ॉर्म हो. ऐसे में, डिसप्ले को 120 हर्ट्ज़ पर चलाने से, 60 हर्ट्ज़ और 24 हर्ट्ज़, दोनों प्लैटफ़ॉर्म बिना पुलडाउन के चल सकेंगे.
जब डिसप्ले, ऐप्लिकेशन के फ़्रेम रेट के मल्टीपल पर चल रहा हो, तो ऐप्लिकेशन को हर फ़्रेम के लिए, प्रज़ेंटेशन टाइमस्टैंप तय करने चाहिए, ताकि वीडियो में रुकावट न आए. गेम के लिए, Android Frame Pacing लाइब्रेरी, फ़्रेम प्रज़ेंटेशन टाइमस्टैंप को सही तरीके से सेट करने में मददगार होती है.
setFrameRate() बनाम preferredDisplayModeId
WindowManager.LayoutParams.preferredDisplayModeId
एक और तरीका है, जिससे ऐप्लिकेशन, प्लैटफ़ॉर्म को अपने फ़्रेम रेट के बारे में बता सकते हैं. कुछ ऐप्लिकेशन, डिसप्ले रिज़ॉल्यूशन जैसी अन्य डिसप्ले मोड सेटिंग बदलने के बजाय, सिर्फ़ डिसप्ले की रीफ़्रेश दर बदलना चाहते हैं. आम तौर पर, preferredDisplayModeId के बजाय setFrameRate() का इस्तेमाल करें. setFrameRate() फ़ंक्शन का इस्तेमाल करना आसान है, क्योंकि ऐप्लिकेशन को किसी खास फ़्रेम रेट वाले मोड को ढूंढने के लिए, डिसप्ले मोड की सूची में खोजने की ज़रूरत नहीं होती.
setFrameRate() की मदद से, प्लैटफ़ॉर्म को उन स्थितियों में, कंपैटिबल फ़्रेम रेट चुनने के ज़्यादा मौके मिलते हैं जहां अलग-अलग फ़्रेम रेट पर चलने वाले एक से ज़्यादा प्लैटफ़ॉर्म मौजूद हों. उदाहरण के लिए, Pixel 4 पर स्प्लिट-स्क्रीन मोड में चल रहे दो ऐप्लिकेशन की स्थिति पर विचार करें. इनमें से एक ऐप्लिकेशन, 24 हर्ट्ज़ का वीडियो चला रहा है और दूसरा, उपयोगकर्ता को स्क्रोल की जा सकने वाली सूची दिखा रहा है. Pixel 4 पर, डिसप्ले की दो रीफ़्रेश दरें काम करती हैं: 60 हर्ट्ज़ और 90 हर्ट्ज़. preferredDisplayModeId एपीआई का इस्तेमाल करने पर, वीडियो प्लैटफ़ॉर्म को 60 हर्ट्ज़ या 90 हर्ट्ज़ में से कोई एक रीफ़्रेश दर चुननी पड़ती है. 24 हर्ट्ज़ के साथ setFrameRate() को कॉल करके, वीडियो प्लैटफ़ॉर्म, सोर्स वीडियो के फ़्रेम रेट के बारे में प्लैटफ़ॉर्म को ज़्यादा जानकारी देता है. इससे प्लैटफ़ॉर्म, डिसप्ले की रीफ़्रेश दर के लिए 90 हर्ट्ज़ चुन सकता है. इस स्थिति में, यह 60 हर्ट्ज़ से बेहतर है.
हालांकि, कुछ स्थितियों में setFrameRate() के बजाय preferredDisplayModeId का इस्तेमाल करना चाहिए. जैसे:
- अगर ऐप्लिकेशन को रिज़ॉल्यूशन या डिसप्ले मोड की अन्य सेटिंग बदलनी हैं, तो
preferredDisplayModeIdका इस्तेमाल करें. - प्लैटफ़ॉर्म,
setFrameRate()को कॉल करने पर, सिर्फ़ तब डिसप्ले मोड स्विच करेगा, जब मोड स्विच करना आसान हो और उपयोगकर्ता को इसकी जानकारी न मिले. अगर ऐप्लिकेशन, डिसप्ले की रीफ़्रेश दर को तब भी स्विच करना चाहता है, जब इसके लिए मुश्किल मोड स्विच की ज़रूरत हो (उदाहरण के लिए, Android TV डिवाइस पर), तोpreferredDisplayModeIdका इस्तेमाल करें. - जिन ऐप्लिकेशन को, ऐप्लिकेशन के फ़्रेम रेट के मल्टीपल पर चलने वाले डिसप्ले को हैंडल करने में परेशानी होती है उन्हें
preferredDisplayModeIdका इस्तेमाल करना चाहिए. इसके लिए, हर फ़्रेम पर प्रज़ेंटेशन टाइमस्टैंप सेट करने की ज़रूरत होती है.
setFrameRate() बनाम preferredRefreshRate
WindowManager.LayoutParams#preferredRefreshRate
से, ऐप्लिकेशन की विंडो पर तय किया गया फ़्रेम रेट सेट होता है. यह रेट, विंडो में मौजूद सभी प्लैटफ़ॉर्म पर लागू होता है. ऐप्लिकेशन को अपना तय किया गया फ़्रेम रेट तय करना चाहिए. भले ही, डिवाइस पर कौनसी रीफ़्रेश दरें काम करती हैं. ऐसा setFrameRate() की तरह ही किया जाता है, ताकि शेड्यूल करने वाले टूल को ऐप्लिकेशन के तय किए गए फ़्रेम रेट के बारे में बेहतर जानकारी मिल सके.
setFrameRate() का इस्तेमाल करने वाले प्लैटफ़ॉर्म के लिए, preferredRefreshRate को अनदेखा कर दिया जाता है. आम तौर पर, अगर मुमकिन हो, तो setFrameRate() का इस्तेमाल करें.
preferredRefreshRate बनाम preferredDisplayModeId
अगर ऐप्लिकेशन सिर्फ़ तय की गई रीफ़्रेश दर बदलना चाहते हैं, तो preferredDisplayModeId के बजाय preferredRefreshRate का इस्तेमाल करना बेहतर है.
setFrameRate() को बार-बार कॉल करने से बचना
हालांकि, परफ़ॉर्मेंस के मामले में setFrameRate() को कॉल करना ज़्यादा महंगा नहीं है, लेकिन ऐप्लिकेशन को हर फ़्रेम या हर सेकंड में कई बार setFrameRate() को कॉल करने से बचना चाहिए. setFrameRate() को कॉल करने पर, डिसप्ले की रीफ़्रेश दर में बदलाव होने की संभावना होती है. इससे ट्रांज़िशन के दौरान, फ़्रेम ड्रॉप हो सकता है.
आपको पहले से ही सही फ़्रेम रेट का पता लगा लेना चाहिए और setFrameRate() को एक बार कॉल करना चाहिए.
गेम या वीडियो के अलावा अन्य ऐप्लिकेशन के लिए इस्तेमाल
हालांकि, setFrameRate() एपीआई का मुख्य इस्तेमाल वीडियो के लिए किया जाता है, लेकिन इसका इस्तेमाल अन्य ऐप्लिकेशन के लिए भी किया जा सकता है. उदाहरण के लिए, कोई गेम, पावर का इस्तेमाल कम करने और ज़्यादा समय तक खेलने के लिए, 60 हर्ट्ज़ से ज़्यादा पर नहीं चलना चाहता. इसके लिए, वह Surface.setFrameRate(60, Surface.FRAME_RATE_COMPATIBILITY_DEFAULT) को कॉल कर सकता है. इस तरह, डिफ़ॉल्ट तौर पर 90 हर्ट्ज़ पर चलने वाला डिवाइस, गेम चालू होने पर 60 हर्ट्ज़ पर चलेगा. इससे वीडियो में रुकावट नहीं आएगी. ऐसा इसलिए, क्योंकि अगर डिसप्ले 90 हर्ट्ज़ पर चलता है और गेम 60 हर्ट्ज़ पर चलता है, तो वीडियो में रुकावट आ सकती है.
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का इस्तेमाल करें
- फ़िल्म जैसे लंबे वीडियो चलाने के लिए,
- अगर
changeFrameRateStrategyCHANGE_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, वीडियो का फ़्रेम रेट है.- वीडियो चलाना शुरू करें
- अगर मोड में बिना किसी रुकावट के बदलाव होने वाला है, तो यह तरीका अपनाएं:
- उपयोगकर्ता को सूचना देने के लिए, यूएक्स दिखाएं. ध्यान दें कि हमारा सुझाव है कि आप उपयोगकर्ता को इस यूएक्स को बंद करने और पांचवें चरण के d में होने वाली अतिरिक्त देरी को स्किप करने का तरीका उपलब्ध कराएं. ऐसा इसलिए, क्योंकि हमारी सुझाई गई देरी, उन डिसप्ले पर ज़रूरत से ज़्यादा है जो तेज़ी से स्विच होते हैं.
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();
}