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