इस सुविधा के साथ काम करने वाली मीडिया ट्रांसकोडिंग

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

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

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

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

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

ट्रांसकोडिंग की प्रोसेस में, सिस्टम के हिसाब से काफ़ी खर्चा होता है. इससे, वीडियो फ़ाइल खोलने में देरी. उदाहरण के लिए, एक मिनट की HEVC वीडियो फ़ाइल Pixel 3 फ़ोन पर एवीसी में ट्रांसकोड करने में करीब 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>

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

मीडिया में रेफ़रंस जोड़ने के लिए, 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 का इस्तेमाल करके वीडियो फ़ाइल खोलता है. इसमें बताया जाता है कि वीडियो में एचईवीसी की सुविधा काम नहीं करती. यह ट्रांसकोडिंग की प्रक्रिया शुरू करता है और इसके पूरा होने पर, फ़ाइल क्लाउड में सेव किया गया सर्वर है.

ऐसे फ़ॉर्मैट जिनका एलान नहीं किया गया है

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

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

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

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

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

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

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

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