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

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

डिवाइस पर बनाया गया:

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

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

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

ट्रांसकोडिंग की प्रोसेस में, सिस्टम के हिसाब से काफ़ी खर्चा होता है. इससे, वीडियो फ़ाइल खोलने में देरी. उदाहरण के लिए, एक मिनट की HEVC वीडियो फ़ाइल Pixel 3 फ़ोन पर एवीसी में ट्रांसकोड करने में करीब 20 सेकंड लगते हैं. इस वजह से, आपको किसी वीडियो फ़ाइल को केवल तब ट्रांसकोड करना चाहिए जब आप उसे डिवाइस. उदाहरण के लिए, समान उपयोगकर्ताओं के साथ कोई वीडियो फ़ाइल शेयर करते समय या क्लाउड सर्वर है जो आधुनिक वीडियो के साथ काम नहीं करता फ़ॉर्मैट के बारे में ज़्यादा जानें.

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

ट्रांसकोडिंग कॉन्फ़िगर की जा रही है

ऐप्लिकेशन, मीडिया का एलान करके ट्रांसकोडिंग के व्यवहार को कंट्रोल कर सकते हैं सुविधाएं. इन क्षमताओं की जानकारी देने के दो तरीके हैं: कोड में, या संसाधन में भी उपलब्ध है.

कोड में क्षमताओं के बारे में बताएं

आप एक इंस्टेंस बनाकर कोड में मीडिया क्षमताओं की घोषणा कर सकते हैं: बिल्डर का इस्तेमाल करने वाला ApplicationMediaCapabilities ऑब्जेक्ट:

KotlinJava
val mediaCapabilities = ApplicationMediaCapabilities.Builder()
    .addSupportedVideoMimeType(MediaFormat.MIMETYPE_VIDEO_HEVC)
    .addUnsupportedHdrType(MediaFeature.HdrType.HDR10)
    .addUnsupportedHdrType(MediaFeature.HdrType.HDR10_PLUS)
    .build()
ApplicationMediaCapabilities mediaCapabilities = new ApplicationMediaCapabilities.Builder()
        .addSupportedVideoMimeType(MediaFormat.MIMETYPE_VIDEO_HEVC)
        .addUnsupportedHdrType(MediaFeature.HdrType.HDR10)
        .addUnsupportedHdrType(MediaFeature.HdrType.HDR10_PLUS)
        .build();

इस ऑब्जेक्ट का इस्तेमाल, इन तरीकों से मीडिया कॉन्टेंट ऐक्सेस करते समय करें ContentResolver#openTypedAssetFileDescriptor():

KotlinJava
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.
    }
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>

इस उदाहरण में, डिवाइस पर रिकॉर्ड किए गए एचडीआर वीडियो को आसानी से एवीसी एसडीआर (स्टैंडर्ड डाइनैमिक रेंज) वीडियो में ट्रांसकोड किया जाता है. हालांकि, एचईवीसी वीडियो को ऐसा नहीं किया जाता.

मीडिया की सुविधाओं वाली फ़ाइल का रेफ़रंस जोड़ने के लिए, application टैग में property टैग का इस्तेमाल करें. अपनी AndroidManifest.xml फ़ाइल में इन प्रॉपर्टी को जोड़ें:

<property
    android:name="android.media.PROPERTY_MEDIA_CAPABILITIES"
    android:resource="@xml/media_capabilities" />

वीडियो फ़ाइल खोलने के लिए, किसी दूसरे ऐप्लिकेशन की मीडिया सुविधाओं का इस्तेमाल करना

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

इस मामले को मैनेज करने के लिए, openTypedAssetFileDescriptor का इस्तेमाल करके वीडियो फ़ाइल खोलें और पाने वाले ऐप्लिकेशन का यूआईडी तय करें, जिसे Binder.getCallingUid का इस्तेमाल करके हासिल किया जा सकता है. इसके बाद, यह प्लैटफ़ॉर्म, डेटा पाने वाले ऐप्लिकेशन की मीडिया क्षमताओं का इस्तेमाल करके यह तय करता है कि कि वीडियो फ़ाइल ट्रांसकोड की जानी चाहिए या नहीं.

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

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

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