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 यह मानता है कि ऐप्लिकेशन, सभी मीडिया फ़ॉर्मैट के प्लेबैक के साथ काम कर सकते हैं. इसलिए, मीडिया ट्रांसकोडिंग की सुविधा डिफ़ॉल्ट रूप से बंद होती है.
ट्रांसकोडिंग का इस्तेमाल कब करना चाहिए
ट्रांसकोडिंग एक ऐसी प्रोसेस है जिसमें काफ़ी कंप्यूटेशनल पावर की ज़रूरत होती है. साथ ही, वीडियो फ़ाइल खोलने में काफ़ी समय लगता है. उदाहरण के लिए, Pixel 3 फ़ोन पर एक मिनट की HEVC वीडियो फ़ाइल को 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. }
इस तरीके से, कोड के कुछ पाथ पर ज़्यादा कंट्रोल मिलता है. जैसे, वीडियो फ़ाइल को डिवाइस से बाहर ट्रांसफ़र करते समय ही ट्रांसकोडिंग शुरू करना. इसे नीचे बताए गए तरीके से ज़्यादा प्राथमिकता दी जाती है.
किसी संसाधन में क्षमताओं की जानकारी देना
किसी संसाधन में सुविधाओं के बारे में जानकारी देने से, ट्रांसकोडिंग पर पूरी तरह से कंट्रोल किया जा सकता है. इस तरीके का इस्तेमाल सिर्फ़ कुछ खास मामलों में किया जाना चाहिए. उदाहरण के लिए, अगर आपका ऐप्लिकेशन सीधे तौर पर वीडियो फ़ाइलें नहीं खोलता, बल्कि सिर्फ़ उन्हें दूसरे ऐप्लिकेशन से पाता है. साथ ही, उन्हें ऐसे सर्वर पर अपलोड करता है जो आधुनिक वीडियो कोडेक के साथ काम नहीं करता. इसके बारे में यहां दिए गए पहले उदाहरण में बताया गया है.
जब इसकी ज़रूरत न हो, तब इस तरीके का इस्तेमाल करने से, अनचाहे मामलों में ट्रांसकोडिंग शुरू हो सकती है. जैसे, वीडियो के थंबनेल बनाते समय. इससे उपयोगकर्ता अनुभव खराब हो सकता है.
इस तरीके का इस्तेमाल करने के लिए, 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 ने ऐप्लिकेशन को सर्वर-साइड फ़ोर्स-ट्रांसकोड सूची में शामिल न किया हो. इस सेटिंग के चालू होने पर, ऐप्लिकेशन ट्रांसकोड नहीं करता है. वहीं, इसके बंद होने पर, ऐप्लिकेशन ट्रांसकोड करता है. यह विकल्प डिफ़ॉल्ट रूप से चालू होता है.
ट्रांसकोडिंग की सूचनाएं दिखाएं: इस सेटिंग को चालू करने पर, ऐप्लिकेशन ऐसी मीडिया फ़ाइल को पढ़ने के दौरान ट्रांसकोडिंग शुरू होने पर, ट्रांसकोडिंग की प्रोग्रेस की सूचना दिखाता है जिसे चलाने की अनुमति नहीं है. यह विकल्प डिफ़ॉल्ट रूप से चालू होता है.
कैश को ट्रांसकोड करने की सुविधा बंद करें अगर यह सुविधा चालू है, तो ट्रांसकोडिंग की सुविधा का इस्तेमाल करने वाले ऐप्लिकेशन, कैश को ट्रांसकोड करने की सुविधा का इस्तेमाल नहीं करते हैं. यह डेवलपमेंट के दौरान, मीडिया फ़ाइल के साथ काम न करने वाले फ़ॉर्मैट को आसानी से ट्रांसकोड करने में मददगार हो सकता है. हालांकि, इससे डिवाइस की परफ़ॉर्मेंस खराब हो सकती है. यह विकल्प डिफ़ॉल्ट रूप से बंद होता है.