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