Android 12 (एपीआई लेवल 31) और इसके बाद के वर्शन पर, सिस्टम HEVC (H.265) जैसे फ़ॉर्मैट में रिकॉर्ड किए गए वीडियो को AVC (H.264) में अपने-आप बदल सकता है. ऐसा तब होता है, जब वीडियो को किसी ऐसे ऐप्लिकेशन से खोला जाता है जो HEVC फ़ॉर्मैट के साथ काम नहीं करता. इस सुविधा की मदद से, वीडियो कैप्चर करने वाले ऐप्लिकेशन, डिवाइस पर रिकॉर्ड किए गए वीडियो के लिए ज़्यादा आधुनिक और स्टोरेज की बचत करने वाली एन्कोडिंग का इस्तेमाल कर सकते हैं. इससे, अन्य ऐप्लिकेशन के साथ काम करने की सुविधा पर कोई असर नहीं पड़ता.
डिवाइस पर बनाए गए कॉन्टेंट के लिए, इन फ़ॉर्मैट को अपने-आप ट्रांसकोड किया जा सकता है:
मीडिया फ़ॉर्मैट | एक्सएमएल एट्रिब्यूट | MediaFormat का माइम टाइप |
---|---|---|
HEVC (H.265) | HEVC | MediaFormat.MIMETYPE_VIDEO_HEVC |
HDR10 | HDR10 | MediaFeature.HdrType.HDR10 |
HDR10+ | HDR10Plus | MediaFeature.HdrType.HDR10_PLUS |
Android यह मानता है कि ऐप्लिकेशन, सभी मीडिया फ़ॉर्मैट के प्लेबैक के साथ काम कर सकते हैं. इसलिए, मीडिया ट्रांसकोडिंग की सुविधा डिफ़ॉल्ट रूप से बंद होती है.
ट्रांसकोडिंग का इस्तेमाल कब करना चाहिए
ट्रांसकोडिंग एक ऐसी प्रोसेस है जिसमें काफ़ी कंप्यूटेशनल पावर की ज़रूरत होती है. साथ ही, वीडियो फ़ाइल खोलने में काफ़ी समय लगता है. उदाहरण के लिए, एक मिनट की HEVC वीडियो फ़ाइल को Pixel 3 फ़ोन पर AVC में ट्रांसकोड होने में करीब 20 सेकंड लगते हैं. इसलिए, आपको वीडियो फ़ाइल को सिर्फ़ तब ट्रांसकोड करना चाहिए, जब आपको उसे डिवाइस से बाहर भेजना हो. उदाहरण के लिए, जब किसी वीडियो फ़ाइल को एक ही ऐप्लिकेशन के अन्य उपयोगकर्ताओं के साथ शेयर किया जाता है या किसी ऐसे क्लाउड सर्वर के साथ शेयर किया जाता है जो आधुनिक वीडियो फ़ॉर्मैट के साथ काम नहीं करता.
डिवाइस पर वीडियो फ़ाइलें चलाने या थंबनेल इमेज बनाने के लिए, वीडियो फ़ाइलों को खोलते समय ट्रांसकोड न करें.
ट्रांसकोडिंग को कॉन्फ़िगर करना
ऐप्लिकेशन, मीडिया की क्षमताओं के बारे में जानकारी देकर, ट्रांसकोडिंग के तरीके को कंट्रोल कर सकते हैं. इन सुविधाओं के बारे में बताने के दो तरीके हैं: कोड में या किसी संसाधन में.
कोड में सुविधाओं के बारे में जानकारी देना
कोड में मीडिया की सुविधाओं के बारे में बताया जा सकता है. इसके लिए, बिल्डर का इस्तेमाल करके ApplicationMediaCapabilities
ऑब्जेक्ट का इंस्टेंस बनाएं:
Kotlin
val mediaCapabilities = ApplicationMediaCapabilities.Builder() .addSupportedVideoMimeType(MediaFormat.MIMETYPE_VIDEO_HEVC) .addUnsupportedHdrType(MediaFeature.HdrType.HDR10) .addUnsupportedHdrType(MediaFeature.HdrType.HDR10_PLUS) .build()
Java
ApplicationMediaCapabilities mediaCapabilities = new ApplicationMediaCapabilities.Builder() .addSupportedVideoMimeType(MediaFormat.MIMETYPE_VIDEO_HEVC) .addUnsupportedHdrType(MediaFeature.HdrType.HDR10) .addUnsupportedHdrType(MediaFeature.HdrType.HDR10_PLUS) .build();
इस ऑब्जेक्ट का इस्तेमाल तब करें, जब आपको ContentResolver#openTypedAssetFileDescriptor()
जैसे तरीकों से मीडिया कॉन्टेंट ऐक्सेस करना हो:
Kotlin
val providerOptions = Bundle().apply { putParcelable(MediaStore.EXTRA_MEDIA_CAPABILITIES, mediaCapabilities) } contentResolver.openTypedAssetFileDescriptor(mediaUri, mediaMimeType, providerOptions) .use { fileDescriptor -> // Content will be transcoded based on values defined in the // ApplicationMediaCapabilities provided. }
Java
Bundle providerOptions = new Bundle(); providerOptions.putParcelable(MediaStore.EXTRA_MEDIA_CAPABILITIES, mediaCapabilities); try (AssetFileDescriptor fileDescriptor = contentResolver.openTypedAssetFileDescriptor(mediaUri, mediaMimeType, providerOptions)) { // Content will be transcoded based on values defined in the // ApplicationMediaCapabilities provided. }
इस तरीके से, कोड के कुछ पाथ पर ज़्यादा कंट्रोल मिलता है. जैसे, किसी वीडियो फ़ाइल को डिवाइस से बाहर ट्रांसफ़र करते समय ही ट्रांसकोडिंग शुरू करना. इसे नीचे बताए गए तरीके से ज़्यादा प्राथमिकता दी जाती है.
किसी संसाधन में क्षमताओं की जानकारी देना
किसी संसाधन में सुविधाओं के बारे में जानकारी देने से, ट्रांसकोडिंग पर पूरी तरह से कंट्रोल किया जा सकता है. इस तरीके का इस्तेमाल सिर्फ़ कुछ खास मामलों में किया जाना चाहिए. उदाहरण के लिए, अगर आपका ऐप्लिकेशन सीधे तौर पर वीडियो फ़ाइलें नहीं खोलता, बल्कि सिर्फ़ उन्हें दूसरे ऐप्लिकेशन से पाता है और उन्हें ऐसे सर्वर पर अपलोड करता है जो आधुनिक वीडियो कोडेक के साथ काम नहीं करता (नीचे उदाहरण 1 देखें).
जब इसकी ज़रूरत न हो, तब इस तरीके का इस्तेमाल करने से, अनचाहे मामलों में ट्रांसकोडिंग शुरू हो सकती है. जैसे, वीडियो के थंबनेल बनाते समय. इससे उपयोगकर्ता अनुभव खराब हो सकता है.
इस तरीके का इस्तेमाल करने के लिए, media_capabilities.xml
रिसॉर्स फ़ाइल बनाएं:
<?xml version="1.0" encoding="utf-8"?>
<media-capabilities xmlns:android="http://schemas.android.com/apk/res/android">
<format android:name="HEVC" supported="true"/>
<format android:name="HDR10" supported="false"/>
<format android:name="HDR10Plus" supported="false"/>
</media-capabilities>
इस उदाहरण में, डिवाइस पर रिकॉर्ड किए गए एचडीआर वीडियो को बिना किसी रुकावट के एवीसी एसडीआर (स्टैंडर्ड डाइनैमिक रेंज) वीडियो में ट्रांसकोड किया जाता है. हालांकि, HEVC वीडियो को ट्रांसकोड नहीं किया जाता.
मीडिया की सुविधाओं वाली फ़ाइल का रेफ़रंस जोड़ने के लिए, application
टैग में property
टैग का इस्तेमाल करें. अपनी AndroidManifest.xml
फ़ाइल में ये प्रॉपर्टी जोड़ें:
<property
android:name="android.media.PROPERTY_MEDIA_CAPABILITIES"
android:resource="@xml/media_capabilities" />
वीडियो फ़ाइल खोलने के लिए, किसी दूसरे ऐप्लिकेशन की मीडिया सुविधाओं का इस्तेमाल करना
अगर आपका ऐप्लिकेशन, किसी वीडियो फ़ाइल को दूसरे ऐप्लिकेशन के साथ शेयर करता है, तो हो सकता है कि वीडियो फ़ाइल को ट्रांसकोड करने की ज़रूरत पड़े. ऐसा तब होता है, जब वीडियो फ़ाइल को पाने वाला ऐप्लिकेशन उसे खोल न पाए.
इस मामले को हल करने के लिए, openTypedAssetFileDescriptor
का इस्तेमाल करके वीडियो फ़ाइल खोलें. इसके बाद, वीडियो पाने वाले ऐप्लिकेशन का यूआईडी डालें. यह यूआईडी, Binder.getCallingUid
का इस्तेमाल करके पाया जा सकता है.
इसके बाद, प्लैटफ़ॉर्म, वीडियो पाने वाले ऐप्लिकेशन की मीडिया क्षमताओं का इस्तेमाल करके यह तय करता है कि वीडियो फ़ाइल को ट्रांसकोड किया जाना चाहिए या नहीं.
Kotlin
val providerOptions = Bundle().apply { putParcelable(MediaStore.EXTRA_MEDIA_CAPABILITIES_UID, Binder.getCallingUid()) } contentResolver.openTypedAssetFileDescriptor(mediaUri, mediaMimeType, providerOptions) .use { fileDescriptor -> // Content will be transcoded based on the media capabilities of the // calling app. }
Java
Bundle providerOptions = new Bundle(); providerOptions.putParcelable(MediaStore.EXTRA_MEDIA_CAPABILITIES_UID, Binder.getCallingUid()); try (AssetFileDescriptor fileDescriptor = contentResolver.openTypedAssetFileDescriptor(mediaUri, mediaMimeType, providerOptions)) { // Content will be transcoded based on the media capabilities of the // calling app. }
उदाहरण के तौर पर दिए गए मामले
यहां दिए गए डायग्राम में, इस्तेमाल के दो सामान्य उदाहरण दिखाए गए हैं. दोनों ही मामलों में, ओरिजनल वीडियो को HEVC फ़ॉर्मैट में सेव किया जाता है. साथ ही, वीडियो शेयर करने वाला ऐप्लिकेशन HEVC फ़ॉर्मैट के साथ काम नहीं करता.
पहला उदाहरण. ट्रांसकोडिंग की प्रोसेस, वीडियो कैप्चर करने वाला ऐप्लिकेशन शुरू करता है.
वीडियो शेयर करने वाला ऐप्लिकेशन यह एलान करता है कि वह मीडिया की क्षमताओं वाली रिसॉर्स फ़ाइल में HEVC फ़ॉर्मैट का इस्तेमाल नहीं करता. इसके बाद, यह वीडियो कैप्चर करने वाले ऐप्लिकेशन से वीडियो का अनुरोध करता है. वीडियो कैप्चर करने वाला ऐप्लिकेशन, अनुरोध को मैनेज करता है और
openTypedAssetFileDescriptor
का इस्तेमाल करके फ़ाइल खोलता है. साथ ही, शेयर करने वाले ऐप्लिकेशन का यूआईडी तय करता है. इससे ट्रांसकोडिंग की प्रोसेस शुरू हो जाती है.
ट्रांसकोड किया गया वीडियो मिलने पर, उसे शेयर करने वाले ऐप्लिकेशन को भेज दिया जाता है. यह ऐप्लिकेशन, वीडियो को क्लाउड में मौजूद सर्वर पर अपलोड करता है.
दूसरा उदाहरण. वीडियो शेयर करने वाला ऐप्लिकेशन, ट्रांसकोडिंग शुरू करता है.
वीडियो कैप्चर करने वाला ऐप्लिकेशन, वीडियो शेयर करने वाले ऐप्लिकेशन के साथ
MediaStore
यूआरआई का इस्तेमाल करके वीडियो शेयर करता है. वीडियो शेयर करने वाला ऐप्लिकेशन, openTypedAssetFileDescriptor
का इस्तेमाल करके वीडियो फ़ाइल खोलता है. इससे पता चलता है कि यह ऐप्लिकेशन, मीडिया फ़ाइलों के लिए HEVC फ़ॉर्मैट का इस्तेमाल नहीं करता. इससे ट्रांसकोडिंग की प्रोसेस शुरू हो जाती है. प्रोसेस पूरी होने के बाद, फ़ाइल को क्लाउड में मौजूद सर्वर पर अपलोड कर दिया जाता है.
ऐसे फ़ॉर्मैट जिनके बारे में जानकारी नहीं दी गई है
जिन फ़ॉर्मैट के लिए यह बताया गया है कि वे काम नहीं करते उनके लिए, मीडिया ट्रांसकोडिंग की सुविधा चालू होती है. वहीं, जिन फ़ॉर्मैट के लिए यह बताया गया है कि वे काम करते हैं उनके लिए, यह सुविधा बंद होती है. जिन फ़ॉर्मैट के बारे में नहीं बताया गया है उनके लिए, प्लैटफ़ॉर्म यह तय करता है कि ट्रांसकोड करना है या नहीं. Android 12 में, बिना बताए गए सभी फ़ॉर्मैट के लिए ट्रांसकोडिंग की सुविधा बंद कर दी गई है. आने वाले समय में, नए फ़ॉर्मैट के लिए यह तरीका बदल सकता है.
डेवलपर के लिए सेटिंग और टूल
Android के डिफ़ॉल्ट ट्रांसकोडिंग व्यवहार को बदलने के लिए, डेवलपर के इन विकल्पों का इस्तेमाल किया जा सकता है:
ट्रांसकोडिंग की डिफ़ॉल्ट सेटिंग बदलना इस सेटिंग से यह तय होता है कि प्लैटफ़ॉर्म, वीडियो को अपने-आप ट्रांसकोड करेगा या नहीं. ओवरराइड करने की सुविधा चालू होने पर, प्लैटफ़ॉर्म की डिफ़ॉल्ट सेटिंग को अनदेखा किया जाता है. साथ ही, ट्रांसकोडिंग की सुविधा चालू करें सेटिंग, अपने-आप होने वाली ट्रांसकोडिंग को कंट्रोल करती है. यह विकल्प डिफ़ॉल्ट रूप से बंद होता है.
ट्रांसकोडिंग चालू करें इस सेटिंग से यह तय होता है कि बिना बताए गए फ़ॉर्मैट अपने-आप ट्रांसकोड होंगे या नहीं. यह डिफ़ॉल्ट रूप से चालू होता है. हालांकि, इसका असर सिर्फ़ तब होता है, जब ट्रांसकोडिंग की डिफ़ॉल्ट सेटिंग को बदलने की सुविधा भी चालू हो.
मानकर चलें कि ऐप्लिकेशन, नए फ़ॉर्मैट के साथ काम करेंगे इस सेटिंग से यह कंट्रोल किया जाता है कि जब ऐप्लिकेशन, ऐसे फ़ॉर्मैट को चलाने की कोशिश करता है जिसके बारे में जानकारी नहीं दी गई है, तो क्या होगा. ऐसा तब होता है, जब मेनिफ़ेस्ट में यह जानकारी नहीं दी जाती कि ऐप्लिकेशन किसी फ़ॉर्मैट के साथ काम करता है या नहीं. इसके अलावा, ऐसा तब भी हो सकता है, जब Google ने ऐप्लिकेशन को सर्वर-साइड फ़ोर्स-ट्रांसकोड सूची में नहीं जोड़ा हो. इस सेटिंग के चालू होने पर, ऐप्लिकेशन ट्रांसकोड नहीं करता है. वहीं, इसके बंद होने पर, ऐप्लिकेशन ट्रांसकोड करता है. यह विकल्प डिफ़ॉल्ट रूप से चालू होता है.
ट्रांसकोडिंग की सूचनाएं दिखाएं इस सेटिंग को चालू करने पर, ऐप्लिकेशन ऐसी मीडिया फ़ाइल को पढ़ने पर ट्रांसकोडिंग की प्रोग्रेस की सूचना दिखाता है जिसे चलाने की अनुमति नहीं है. यह विकल्प डिफ़ॉल्ट रूप से चालू होता है.
कैश को ट्रांसकोड करने की सुविधा बंद करें अगर यह सुविधा चालू है, तो जिन ऐप्लिकेशन के लिए ट्रांसकोडिंग की ज़रूरत होती है वे कैश को ट्रांसकोड करने की सुविधा का इस्तेमाल नहीं करते हैं. यह सुविधा, डेवलपमेंट के दौरान काम आ सकती है. इससे, ऐसे मीडिया फ़ाइल पर ट्रांसकोडिंग को आसानी से ट्रिगर किया जा सकता है जिसे इस्तेमाल नहीं किया जा सकता. हालांकि, इससे डिवाइस की परफ़ॉर्मेंस खराब हो सकती है. यह विकल्प डिफ़ॉल्ट रूप से बंद होता है.