स्पेशल ऑडियो, सुनने का एक ऐसा अनुभव है जिसमें उपयोगकर्ताओं को ऐसा लगता है कि वे किसी सीन के बीच में मौजूद हैं. इससे आपका कॉन्टेंट ज़्यादा असली लगता है. आवाज़ को "स्पेशलाइज़" किया जाता है, ताकि मल्टी-स्पीकर इफ़ेक्ट तैयार किया जा सके. यह सराउंड साउंड सेटअप की तरह होता है, लेकिन इसमें हेडफ़ोन का इस्तेमाल किया जाता है.
उदाहरण के लिए, किसी फ़िल्म में कार की आवाज़ उपयोगकर्ता के पीछे से शुरू हो सकती है, आगे की ओर बढ़ सकती है, और दूर तक सुनाई दे सकती है. वीडियो चैट में, आवाज़ों को अलग-अलग करके उपयोगकर्ता के आस-पास रखा जा सकता है. इससे यह पता लगाना आसान हो जाता है कि कौन बोल रहा है.
अगर आपके कॉन्टेंट में, काम करने वाले ऑडियो फ़ॉर्मैट का इस्तेमाल किया गया है, तो 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 को इंस्टैंशिएट करते समय, encoding को डिकोडर से मिले आउटपुट फ़ॉर्मैट के बराबर सेट करें. आपको एक ऐसा चैनल मास्क भी सेट करना चाहिए जो आपके कॉन्टेंट के चैनल कॉन्फ़िगरेशन से मेल खाता हो. इस्तेमाल की जाने वाली खास वैल्यू के बारे में दिशा-निर्देश पाने के लिए, डिफ़ॉल्ट स्पैटियलाइज़ेशन का तरीका सेक्शन देखें.
Spatializer में होने वाले बदलावों के बारे में सुनना
Spatializer की स्थिति में होने वाले बदलावों को सुनने के लिए, Spatializer.addOnSpatializerStateChangedListener() के साथ एक लिसनर जोड़ा जा सकता है.
इसी तरह, हेड ट्रैकर की उपलब्धता में होने वाले बदलावों को सुनने के लिए, Spatializer.addOnHeadTrackerAvailableListener() को कॉल करें.
अगर आपको लिसनर के कॉल बैक का इस्तेमाल करके, प्लेबैक के दौरान ट्रैक चुनने की सुविधा को अडजस्ट करना है, तो यह तरीका फ़ायदेमंद हो सकता है. उदाहरण के लिए, जब कोई उपयोगकर्ता अपने हेडसेट को डिवाइस से कनेक्ट या डिसकनेक्ट करता है, तो onSpatializerAvailableChanged कॉलबैक से पता चलता है कि नए ऑडियो आउटपुट राउटिंग के लिए, स्पैटियलाइज़र इफ़ेक्ट उपलब्ध है या नहीं. इस समय, डिवाइस की नई सुविधाओं के हिसाब से, प्लेयर के ट्रैक चुनने के लॉजिक को अपडेट किया जा सकता है. ExoPlayer में ट्रैक चुनने के तरीके के बारे में जानने के लिए, ExoPlayer और स्पेशल ऑडियो सेक्शन देखें.
ExoPlayer और स्पेशल ऑडियो
ExoPlayer के हाल ही के वर्शन में, स्पेशल ऑडियो को आसानी से इस्तेमाल किया जा सकता है. अगर स्टैंडअलोन ExoPlayer लाइब्रेरी (पैकेज का नाम com.google.android.exoplayer2) का इस्तेमाल किया जाता है, तो वर्शन 2.17, प्लैटफ़ॉर्म को स्पेशल ऑडियो आउटपुट करने के लिए कॉन्फ़िगर करता है. साथ ही, वर्शन 2.18 में ऑडियो चैनल की संख्या से जुड़ी पाबंदियां लागू की गई हैं.
अगर Media3 लाइब्रेरी के ExoPlayer मॉड्यूल (पैकेज का नाम
androidx.media3) का इस्तेमाल किया जाता है, तो 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 ऐसे ऑडियो ट्रैक चुनता है जो MIME टाइप (एन्कोडिंग), चैनल की संख्या, और सैंपल रेट के हिसाब से शुरुआती ट्रैक के जैसे ही होते हैं.
ट्रैक चुनने के पैरामीटर बदलना
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)