HEVC फ़ॉर्मैट पर काम न करने वाले ऐप्लिकेशन के लिए मीडिया ट्रांसकोडिंग

Android 12 (एपीआई लेवल 31) और इसके बाद के वर्शन पर, सिस्टम HEVC (H.265) जैसे फ़ॉर्मैट में रिकॉर्ड किए गए वीडियो को AVC (H.264) में अपने-आप बदल सकता है. ऐसा तब होता है, जब वीडियो को ऐसे ऐप्लिकेशन से खोला जाता है जिसमें HEVC फ़ॉर्मैट काम नहीं करता. इस सुविधा की मदद से, वीडियो कैप्चर करने वाले ऐप्लिकेशन, डिवाइस पर रिकॉर्ड किए गए वीडियो के लिए, ज़्यादा आधुनिक और स्टोरेज बचाने वाली एन्कोडिंग का इस्तेमाल कर सकते हैं. इससे अन्य ऐप्लिकेशन के साथ काम करने की क्षमता पर कोई असर नहीं पड़ता.

उपयोगकर्ता के डिवाइस पर बनाए गए कॉन्टेंट के लिए, इन फ़ॉर्मैट को अपने-आप ट्रांसकोड किया जा सकता है:

मीडिया फ़ॉर्मैट एक्सएमएल एट्रिब्यूट MediaFormat mime type
HEVC (H.265) HEVC MediaFormat.MIMETYPE_VIDEO_HEVC
एचडीआर10एचडीआर10 MediaFeature.HdrType.HDR10
HDR10+ HDR10Plus MediaFeature.HdrType.HDR10_PLUS

Android यह मानकर चलता है कि ऐप्लिकेशन, सभी मीडिया फ़ॉर्मैट के प्लेबैक के साथ काम कर सकते हैं. इसलिए, HEVC फ़ॉर्मैट पर काम न करने वाले ऐप्लिकेशन के लिए मीडिया ट्रांसकोडिंग की सुविधा, डिफ़ॉल्ट रूप से बंद रहती है.

ट्रांसकोडिंग का इस्तेमाल कब करना चाहिए

ट्रांसकोडिंग एक ऐसी प्रोसेस है जिसमें काफ़ी कंप्यूटेशनल पावर लगती है. साथ ही, इसकी वजह से वीडियो फ़ाइल को खोलने में काफ़ी समय लगता है. उदाहरण के लिए, 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.
}

इस तरीके से, कोड के खास पाथ को बारीकी से कंट्रोल किया जा सकता है. जैसे, वीडियो फ़ाइल को डिवाइस से बाहर ट्रांसफ़र करते समय ही ट्रांसकोडिंग को चालू करना. इसे नीचे बताए गए तरीके से ज़्यादा प्राथमिकता दी जाती है.

किसी संसाधन में सुविधाओं के बारे में बताना

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

इस उदाहरण में, डिवाइस पर रिकॉर्ड किए गए एचडीआर वीडियो, AVC एसडीआर (स्टैंडर्ड डाइनैमिक रेंज) वीडियो में आसानी से ट्रांसकोड हो जाते हैं. हालांकि, 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 फ़ॉर्मैट के साथ काम नहीं करता.

पहला उदाहरण. वीडियो कैप्चर करने वाला ऐप्लिकेशन, ट्रांसकोडिंग की प्रोसेस शुरू करता है. उदाहरण 1 वीडियो शेयर करने वाला ऐप्लिकेशन, अपनी मीडिया फ़ॉर्मैट की रिसॉर्स फ़ाइल में यह एलान करता है कि वह HEVC फ़ॉर्मैट के साथ काम नहीं करता. इसके बाद, यह वीडियो कैप्चर करने वाले ऐप्लिकेशन से वीडियो का अनुरोध करता है. वीडियो कैप्चर करने वाला ऐप्लिकेशन, अनुरोध को मैनेज करता है और openTypedAssetFileDescriptor का इस्तेमाल करके फ़ाइल खोलता है. साथ ही, शेयर करने वाले ऐप्लिकेशन का यूआईडी बताता है. इससे ट्रांसकोडिंग की प्रोसेस शुरू हो जाती है. ट्रांसकोड किया गया वीडियो मिलने के बाद, उसे शेयर करने वाले ऐप्लिकेशन को भेज दिया जाता है. इसके बाद, वह ऐप्लिकेशन वीडियो को क्लाउड में मौजूद सर्वर पर अपलोड कर देता है.

दूसरा उदाहरण. वीडियो शेयर करने वाला ऐप्लिकेशन, ट्रांसकोडिंग की प्रोसेस शुरू करता है. उदाहरण 2 वीडियो कैप्चर करने वाला ऐप्लिकेशन, वीडियो शेयर करने वाले ऐप्लिकेशन के साथ MediaStore यूआरआई का इस्तेमाल करके वीडियो शेयर करता है. वीडियो शेयर करने वाला ऐप्लिकेशन, openTypedAssetFileDescriptor का इस्तेमाल करके वीडियो फ़ाइल खोलता है. इससे पता चलता है कि यह ऐप्लिकेशन, HEVC फ़ॉर्मैट में वीडियो नहीं चला सकता. इससे ट्रांसकोडिंग की प्रोसेस शुरू हो जाती है. इसके पूरा होने के बाद, फ़ाइल को क्लाउड में मौजूद सर्वर पर अपलोड कर दिया जाता है.

बिना एलान वाले फ़ॉर्मैट

जिन फ़ॉर्मैट के साथ काम न करने की जानकारी दी गई है उनके लिए, HEVC फ़ॉर्मैट पर काम न करने वाले ऐप्लिकेशन के लिए मीडिया ट्रांसकोडिंग की सुविधा चालू है. साथ ही, जिन फ़ॉर्मैट के साथ काम करने की जानकारी दी गई है उनके लिए यह सुविधा बंद है. जिन फ़ॉर्मैट के बारे में नहीं बताया गया है उनके लिए, प्लैटफ़ॉर्म यह तय करता है कि उन्हें ट्रांसकोड करना है या नहीं. Android 12 में, उन सभी फ़ॉर्मैट के लिए ट्रांसकोडिंग की सुविधा बंद कर दी गई है जिनके बारे में जानकारी नहीं दी गई है. आने वाले समय में, नए फ़ॉर्मैट के लिए यह तरीका बदल सकता है.

डेवलपर के लिए सेटिंग और टूल

Android के डिफ़ॉल्ट ट्रांसकोडिंग व्यवहार को बदलने के लिए, डेवलपर के लिए उपलब्ध इन विकल्पों का इस्तेमाल किया जा सकता है:

  • ट्रांसकोडिंग की डिफ़ॉल्ट सेटिंग को बदलना इस सेटिंग से यह तय होता है कि प्लैटफ़ॉर्म, अपने-आप होने वाली ट्रांसकोडिंग को कंट्रोल करता है या नहीं. ओवरराइड की सुविधा चालू होने पर, प्लैटफ़ॉर्म की डिफ़ॉल्ट सेटिंग को अनदेखा कर दिया जाता है. साथ ही, ट्रांसकोडिंग चालू करें सेटिंग, अपने-आप होने वाली ट्रांसकोडिंग को कंट्रोल करती है. यह विकल्प डिफ़ॉल्ट रूप से बंद रहता है.

  • ट्रांसकोडिंग चालू करें इस सेटिंग से यह तय होता है कि जिन फ़ॉर्मैट के बारे में जानकारी नहीं दी गई है उन्हें अपने-आप ट्रांसकोड किया जाए या नहीं. यह डिफ़ॉल्ट रूप से चालू होती है. हालांकि, यह सिर्फ़ तब असरदार होती है, जब ट्रांसकोडिंग की डिफ़ॉल्ट सेटिंग को बदलने की सुविधा भी चालू हो.

  • यह मान लें कि ऐप्लिकेशन, आधुनिक फ़ॉर्मैट के साथ काम करते हैं इस सेटिंग से यह कंट्रोल किया जाता है कि जब ऐप्लिकेशन किसी ऐसे फ़ॉर्मैट को चलाने की कोशिश करता है जिसके बारे में जानकारी नहीं दी गई है, तो क्या होता है. ऐसा तब होता है, जब मेनिफ़ेस्ट में यह नहीं बताया जाता कि ऐप्लिकेशन किसी खास फ़ॉर्मैट के साथ काम करता है या नहीं. इसके अलावा, ऐसा तब भी हो सकता है, जब Google ने ऐप्लिकेशन को सर्वर-साइड फ़ोर्स-ट्रांसकोड सूची में नहीं जोड़ा हो. सेटिंग चालू होने पर, ऐप्लिकेशन ट्रांसकोड नहीं करता. सेटिंग बंद होने पर, ऐप्लिकेशन ट्रांसकोड करता है. यह विकल्प डिफ़ॉल्ट रूप से चालू होता है.

  • ट्रांसकोडिंग की सूचनाएं दिखाएं इस सेटिंग के चालू होने पर, ऐप्लिकेशन ट्रांसकोडिंग की प्रोग्रेस की सूचना दिखाता है. ऐसा तब होता है, जब काम न करने वाली मीडिया फ़ाइल को पढ़ने से ट्रांसकोडिंग ट्रिगर होती है. यह विकल्प डिफ़ॉल्ट रूप से चालू होता है.

  • ट्रांसकोडिंग कैश मेमोरी बंद करें अगर यह सुविधा चालू है, तो ट्रांसकोडिंग की ज़रूरत वाले ऐप्लिकेशन, ट्रांसकोडिंग कैश मेमोरी का इस्तेमाल नहीं करते. डेवलपमेंट के दौरान, यह सुविधा काम आ सकती है. इससे, काम न करने वाली मीडिया फ़ाइल पर ट्रांसकोडिंग को आसानी से ट्रिगर किया जा सकता है. हालांकि, इससे डिवाइस की परफ़ॉर्मेंस खराब हो सकती है. यह विकल्प डिफ़ॉल्ट रूप से बंद रहता है.