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