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