स्पेशल ऑडियो, ऑडियो का बेहतरीन अनुभव देता है. इससे उपयोगकर्ताओं को ऐसा लगता है कि वे कॉन्टेंट के बीच में मौजूद हैं. साथ ही, कॉन्टेंट की आवाज़ ज़्यादा असली लगती है. साउंड को "स्पेशलाइज़" किया जाता है, ताकि मल्टी-स्पीकर इफ़ेक्ट बनाया जा सके. यह इफ़ेक्ट, सराउंड साउंड सेटअप की तरह ही होता है. हालांकि, यह हेडफ़ोन के ज़रिए काम करता है.
उदाहरण के लिए, किसी फ़िल्म में कार की आवाज़, उपयोगकर्ता के पीछे से शुरू हो सकती है, आगे बढ़ सकती है, और दूर तक जा सकती है. वीडियो चैट में, आवाज़ों को अलग-अलग करके उपयोगकर्ता के आस-पास रखा जा सकता है. इससे, बोलने वाले लोगों की पहचान करना आसान हो जाता है.
अगर आपका कॉन्टेंट, काम करने वाले ऑडियो फ़ॉर्मैट का इस्तेमाल करता है, तो Android 13 (एपीआई लेवल 33) से शुरू होने वाले वर्शन पर, अपने ऐप्लिकेशन में स्पेशल ऑडियो की सुविधा जोड़ी जा सकती है.
सुविधाओं के बारे में क्वेरी करना
डिवाइस की स्पेशलाइज़ेशन की सुविधाओं और व्यवहार के बारे में क्वेरी करने के लिए, Spatializer क्लास का इस्तेमाल करें. सबसे पहले, AudioManager से Spatializer का इंस्टेंस पाएं:
Kotlin
val spatializer = audioManager.spatializer
Java
Spatializer spatializer = AudioManager.getSpatializer();
Spatializer मिलने के बाद, देखें कि डिवाइस पर स्पेशल ऑडियो की सुविधा चालू करने के लिए, ये चार शर्तें पूरी हो रही हैं या नहीं:
| मानदंड | चेक |
|---|---|
| क्या डिवाइस में स्पेशलाइज़ेशन की सुविधा काम करती है? |
getImmersiveAudioLevel(), SPATIALIZER_IMMERSIVE_LEVEL_NONE नहीं है
|
| क्या स्पेशलाइज़ेशन की सुविधा उपलब्ध है? इस सुविधा की उपलब्धता, ऑडियो आउटपुट की मौजूदा रूटिंग के साथ काम करने की क्षमता पर निर्भर करती है. |
isAvailable(), true है |
| क्या स्पेशलाइज़ेशन की सुविधा चालू है? | isEnabled(), true है |
| क्या दिए गए पैरामीटर वाले ऑडियो ट्रैक को स्पेशलाइज़ किया जा सकता है? | canBeSpatialized(), true है |
ऐसा हो सकता है कि ये शर्तें पूरी न हों. उदाहरण के लिए, अगर मौजूदा ऑडियो ट्रैक के लिए स्पेशलाइज़ेशन की सुविधा उपलब्ध न हो या ऑडियो आउटपुट डिवाइस पर यह सुविधा पूरी तरह से बंद हो.
सिर के हिलने को ट्रैक करें
यह प्लैटफ़ॉर्म, उपयोगकर्ता के सिर की पोज़िशन के हिसाब से ऑडियो के स्पेशलाइज़ेशन को अडजस्ट कर सकता है. इसके लिए, ज़रूरी है कि हेडसेट इस सुविधा के साथ काम करता हो. यह देखने के लिए कि मौजूदा ऑडियो आउटपुट रूटिंग के लिए हेड ट्रैकर उपलब्ध है या नहीं, isHeadTrackerAvailable() को कॉल करें.
साथ काम करने वाला कॉन्टेंट
Spatializer.canBeSpatialized()
इससे पता चलता है कि दी गई प्रॉपर्टी वाले ऑडियो को मौजूदा आउटपुट डिवाइस की रूटिंग के साथ, स्पेशल ऑडियो में बदला जा सकता है या नहीं. इस तरीके में AudioAttributes और AudioFormat का इस्तेमाल किया जाता है. इन दोनों के बारे में ज़्यादा जानकारी यहां दी गई है.
AudioAttributes
AudioAttributes ऑब्जेक्ट,
ऑडियो स्ट्रीम के इस्तेमाल के बारे में बताता है.
उदाहरण के लिए, गेम ऑडियो
या स्टैंडर्ड मीडिया.
साथ ही, यह ऑडियो चलाने के तरीके और कॉन्टेंट टाइप के बारे में भी बताता है.
canBeSpatialized() को कॉल करते समय, उसी AudioAttributes इंस्टेंस का इस्तेमाल करें जो आपके Player के लिए सेट किया गया है. उदाहरण के लिए, अगर Jetpack Media3 लाइब्रेरी का इस्तेमाल किया जा रहा है और आपने AudioAttributes को पसंद के मुताबिक नहीं बनाया है, तो AudioAttributes.DEFAULT का इस्तेमाल करें.
स्पेशल ऑडियो की सुविधा बंद करना
यह बताने के लिए कि आपके कॉन्टेंट को पहले ही स्पेशलाइज़ कर दिया गया है,
setIsContentSpatialized(true)
को कॉल करें, ताकि ऑडियो को दो बार प्रोसेस न किया जाए. इसके अलावा, setSpatializationBehavior(AudioAttributes.SPATIALIZATION_BEHAVIOR_NEVER) को कॉल करके, स्पेशलाइज़ेशन की सुविधा को पूरी तरह से बंद करने के लिए, स्पेशलाइज़ेशन के व्यवहार में बदलाव करें.
AudioFormat
AudioFormat ऑब्जेक्ट, किसी ऑडियो ट्रैक के फ़ॉर्मैट और चैनल कॉन्फ़िगरेशन के बारे में जानकारी देता है.
canBeSpatialized() में पास करने के लिए, AudioFormat को इंस्टैंशिएट करते समय, एन्कोडिंग को डिकोडर से मिलने वाले आउटपुट फ़ॉर्मैट के मुताबिक सेट करें. आपको एक चैनल मास्क भी सेट करना चाहिए, जो आपके कॉन्टेंट के चैनल कॉन्फ़िगरेशन से मेल खाता हो. इस्तेमाल की जाने वाली खास वैल्यू के बारे में जानने के लिए, डिफ़ॉल्ट स्पेशलाइज़ेशन व्यवहार सेक्शन देखें.
Spatializer में होने वाले बदलावों पर नज़र रखें
Spatializer की स्थिति में होने वाले बदलावों को सुनने के लिए, Spatializer.addOnSpatializerStateChangedListener() की मदद से लिसनर जोड़ा जा सकता है.
इसी तरह, हेड ट्रैकर की उपलब्धता में होने वाले बदलावों को सुनने के लिए, Spatializer.addOnHeadTrackerAvailableListener() को कॉल करें.
अगर आपको लिसनर के कॉलबैक का इस्तेमाल करके, प्लेबैक के दौरान ट्रैक के चुने गए हिस्से में बदलाव करना है, तो यह तरीका फ़ायदेमंद हो सकता है. उदाहरण के लिए, जब कोई उपयोगकर्ता अपने हेडसेट को डिवाइस से कनेक्ट या डिसकनेक्ट करता है, तो onSpatializerAvailableChanged कॉलबैक से पता चलता है कि नए ऑडियो आउटपुट रूटिंग के लिए, स्पेशलाइज़र इफ़ेक्ट उपलब्ध है या नहीं. इस समय, डिवाइस की नई सुविधाओं के हिसाब से, अपने प्लेयर के ट्रैक चुनने के लॉजिक को अपडेट किया जा सकता है. ExoPlayer के ट्रैक चुनने के तरीके के बारे में जानने के लिए, ExoPlayer और स्पेशल ऑडियो सेक्शन देखें.
ExoPlayer और स्पेशल ऑडियो
ExoPlayer के हाल ही में रिलीज़ हुए वर्शन की मदद से, स्पेशल ऑडियो की सुविधा को आसानी से इस्तेमाल किया जा सकता है. अगर ExoPlayer की स्टैंडअलोन लाइब्रेरी (पैकेज का नाम com.google.android.exoplayer2) का इस्तेमाल किया जाता है, तो वर्शन 2.17, स्पेशल ऑडियो आउटपुट देने के लिए प्लैटफ़ॉर्म को कॉन्फ़िगर करता है. साथ ही, वर्शन 2.18 में ऑडियो चैनल की संख्या से जुड़ी पाबंदियां शामिल की गई हैं.
अगर Media3 लाइब्रेरी (पैकेज का नाम androidx.media3) से ExoPlayer मॉड्यूल का इस्तेमाल किया जाता है, तो 1.0.0-beta01 और इसके बाद के वर्शन में ये अपडेट शामिल होते हैं.
ExoPlayer डिपेंडेंसी को नए वर्शन में अपडेट करने के बाद, आपके ऐप्लिकेशन में सिर्फ़ ऐसा कॉन्टेंट शामिल होना चाहिए जिसे स्पेशलाइज़ किया जा सके.
ऑडियो चैनल की संख्या से जुड़ी पाबंदियां
स्पेशल ऑडियो की चारों शर्तें पूरी होने पर, ExoPlayer मल्टी-चैनल ऑडियो ट्रैक चुनता है. अगर ऐसा नहीं है, तो ExoPlayer इसके बजाय स्टीरियो ट्रैक चुनता है.
अगर Spatializer प्रॉपर्टी में बदलाव होता है, तो ExoPlayer एक नया ट्रैक चुनेगा, ताकि मौजूदा प्रॉपर्टी से मैच करने वाला ऑडियो ट्रैक चुना जा सके. ध्यान दें कि नया ट्रैक चुनने पर, कुछ समय के लिए वीडियो फिर से बफ़र हो सकता है.
ऑडियो चैनल की संख्या से जुड़ी पाबंदियों को बंद करने के लिए, प्लेयर पर ट्रैक चुनने के पैरामीटर सेट करें. इसके लिए, यहां दिया गया तरीका अपनाएं:
Kotlin
exoPlayer.trackSelectionParameters = DefaultTrackSelector.Parameters.Builder(context) .setConstrainAudioChannelCountToDeviceCapabilities(false) .build()
Java
exoPlayer.setTrackSelectionParameters( new DefaultTrackSelector.Parameters.Builder(context) .setConstrainAudioChannelCountToDeviceCapabilities(false) .build() );
इसी तरह, किसी मौजूदा ट्रैक सिलेक्टर के पैरामीटर को अपडेट करके, ऑडियो चैनल की संख्या से जुड़ी पाबंदियों को बंद किया जा सकता है. इसके लिए, यह तरीका अपनाएं:
Kotlin
val trackSelector = DefaultTrackSelector(context) ... trackSelector.parameters = trackSelector.buildUponParameters() .setConstrainAudioChannelCountToDeviceCapabilities(false) .build()
Java
DefaultTrackSelector trackSelector = new DefaultTrackSelector(context); ... trackSelector.setParameters( trackSelector .buildUponParameters() .setConstrainAudioChannelCountToDeviceCapabilities(false) .build() );
ऑडियो चैनल की संख्या से जुड़ी पाबंदियां बंद होने पर, अगर कॉन्टेंट में कई ऑडियो ट्रैक हैं, तो ExoPlayer सबसे पहले उस ट्रैक को चुनता है जिसमें सबसे ज़्यादा चैनल हों और जिसे डिवाइस पर चलाया जा सके. उदाहरण के लिए, अगर कॉन्टेंट में मल्टी-चैनल ऑडियो ट्रैक और स्टीरियो ऑडियो ट्रैक है और डिवाइस दोनों को चला सकता है, तो ExoPlayer मल्टी-चैनल ट्रैक को चुनता है. इस व्यवहार को पसंद के मुताबिक बनाने के तरीके के बारे में जानने के लिए, ऑडियो ट्रैक चुनना लेख पढ़ें.
ऑडियो ट्रैक चुनना
ExoPlayer के ऑडियो चैनल की संख्या से जुड़ी पाबंदियों का व्यवहार बंद होने पर, ExoPlayer अपने-आप ऐसा ऑडियो ट्रैक नहीं चुनता जो डिवाइस के स्पेशलाइज़र की प्रॉपर्टी से मेल खाता हो. इसके बजाय, ExoPlayer के ट्रैक चुनने के लॉजिक को पसंद के मुताबिक बनाया जा सकता है. इसके लिए, प्लेबैक से पहले या उसके दौरान, ट्रैक चुनने के पैरामीटर सेट करें. डिफ़ॉल्ट रूप से, ExoPlayer उन ऑडियो ट्रैक को चुनता है जो एमआईएमई टाइप (एन्कोडिंग), चैनल की संख्या, और सैंपल रेट के हिसाब से शुरुआती ट्रैक से मेल खाते हैं.
ट्रैक चुनने के पैरामीटर बदलना
ExoPlayer के ट्रैक चुनने के पैरामीटर बदलने के लिए, Player.setTrackSelectionParameters() का इस्तेमाल करें.
इसी तरह, Player.getTrackSelectionParameters() की मदद से, ExoPlayer के मौजूदा पैरामीटर देखे जा सकते हैं.
उदाहरण के लिए, वीडियो चलने के दौरान स्टीरियो ऑडियो ट्रैक चुनने के लिए:
Kotlin
exoPlayer.trackSelectionParameters = exoPlayer.trackSelectionParameters .buildUpon() .setMaxAudioChannelCount(2) .build()
Java
exoPlayer.setTrackSelectionParameters( exoPlayer.getTrackSelectionParameters() .buildUpon() .setMaxAudioChannelCount(2) .build() );
ध्यान दें कि वीडियो चलने के दौरान, ट्रैक चुनने के पैरामीटर बदलने से वीडियो चलने में रुकावट आ सकती है. ExoPlayer के दस्तावेज़ों के ट्रैक चुनने वाले सेक्शन में, प्लेयर के ट्रैक चुनने के पैरामीटर को ट्यून करने के बारे में ज़्यादा जानकारी उपलब्ध है.
स्पेशलाइज़ेशन की डिफ़ॉल्ट सेटिंग
Android में डिफ़ॉल्ट रूप से, स्पेशलाइज़ेशन के ये व्यवहार शामिल होते हैं. इन्हें ओईएम अपनी ज़रूरत के मुताबिक बना सकते हैं:
सिर्फ़ मल्टी-चैनल कॉन्टेंट को स्पेशल ऑडियो में बदला जाता है, स्टीरियो कॉन्टेंट को नहीं. अगर ExoPlayer का इस्तेमाल नहीं किया जाता है, तो मल्टी-चैनल ऑडियो कॉन्टेंट के फ़ॉर्मैट के आधार पर, आपको चैनलों की ज़्यादा से ज़्यादा संख्या को कॉन्फ़िगर करना पड़ सकता है. ऐसा इसलिए, ताकि ऑडियो डिकोडर से ज़्यादा संख्या में आउटपुट मिल सके. इससे यह पक्का होता है कि ऑडियो डिकोडर, प्लैटफ़ॉर्म के लिए मल्टी-चैनल पीसीएम आउटपुट देता है, ताकि प्लैटफ़ॉर्म उसे स्पेशलाइज़ कर सके.
Kotlin
val mediaFormat = MediaFormat() mediaFormat.setInteger(MediaFormat.KEY_MAX_OUTPUT_CHANNEL_COUNT, 99)
Java
MediaFormat mediaFormat = new MediaFormat(); mediaFormat.setInteger(MediaFormat.KEY_MAX_OUTPUT_CHANNEL_COUNT, 99);
उदाहरण के लिए, ExoPlayer का
MediaCodecAudioRenderer.javaदेखें. स्पेशलाइज़ेशन की सुविधा को खुद बंद करने के लिए, ओईएम के कस्टमाइज़ेशन से कोई फ़र्क़ नहीं पड़ता, स्पेशल ऑडियो की सुविधा बंद करना लेख पढ़ें.AudioAttributes: ऑडियो को स्पेशलाइज़ किया जा सकता है, अगरusageकोUSAGE_MEDIAयाUSAGE_GAMEपर सेट किया गया हो.AudioFormat: ऑडियो को स्पेशलाइज़ करने के लिए, ऐसे चैनल मास्क का इस्तेमाल करें जिसमें कम से कमAudioFormat.CHANNEL_OUT_QUADचैनल (फ़्रंट-लेफ़्ट, फ़्रंट-राइट, बैक-लेफ़्ट, और बैक-राइट) हों. यहां दिए गए उदाहरण में, हमने 5.1 ऑडियो ट्रैक के लिएAudioFormat.CHANNEL_OUT_5POINT1का इस्तेमाल किया है. स्टीरियो ऑडियो ट्रैक के लिए,AudioFormat.CHANNEL_OUT_STEREOका इस्तेमाल करें.अगर Media3 का इस्तेमाल किया जा रहा है, तो चैनल की संख्या को चैनल मास्क में बदलने के लिए,
Util.getAudioTrackChannelConfig(int channelCount)का इस्तेमाल किया जा सकता है.इसके अलावा, अगर आपने डिकोडर को मल्टी-चैनल पीसीएम आउटपुट करने के लिए कॉन्फ़िगर किया है, तो एन्कोडिंग को
AudioFormat.ENCODING_PCM_16BITपर सेट करें.Kotlin
val audioFormat = AudioFormat.Builder() .setEncoding(AudioFormat.ENCODING_PCM_16BIT) .setChannelMask(AudioFormat.CHANNEL_OUT_5POINT1) .build()
Java
AudioFormat audioFormat = new AudioFormat.Builder() .setEncoding(AudioFormat.ENCODING_PCM_16BIT) .setChannelMask(AudioFormat.CHANNEL_OUT_5POINT1) .build();
स्पेशल ऑडियो की सुविधा को टेस्ट करना
पक्का करें कि टेस्ट डिवाइस पर स्पेशल ऑडियो की सुविधा चालू हो:
- तार वाले हेडसेट के लिए, सिस्टम सेटिंग > आवाज़ और वाइब्रेशन > स्पेशल ऑडियो पर जाएं.
- वायरलेस हेडसेट के लिए, सिस्टम सेटिंग > कनेक्ट किए गए डिवाइस > अपने वायरलेस डिवाइस के लिए गियर आइकॉन > स्पेशल ऑडियो पर जाएं.
मौजूदा रूटिंग के लिए स्पेशल ऑडियो की उपलब्धता देखने के लिए, अपने डिवाइस पर adb shell dumpsys audio कमांड चलाएं. प्लेबैक चालू होने पर, आपको आउटपुट में ये पैरामीटर दिखने चाहिए:
Spatial audio:
mHasSpatializerEffect:true (effect present)
isSpatializerEnabled:true (routing dependent)