स्पेशल ऑडियो

स्पेशल ऑडियो, ऑडियो का ऐसा अनुभव है जिसमें उपयोगकर्ताओं को वीडियो में होने वाली हर गतिविधि के बीच महसूस किया जा सकता है. इससे आपके वीडियो की आवाज़ ज़्यादा असली लगती है. मल्टी-स्पीकर इफ़ेक्ट देने के लिए, आवाज़ को "स्पेशलाइज़" किया जाता है. यह इफ़ेक्ट, सराउंड साउंड सेटअप की तरह ही होता है. हालांकि, इसे हेडफ़ोन के ज़रिए सुनने को मिलता है.

उदाहरण के लिए, किसी फ़िल्म में, किसी कार से आने वाली आवाज़ उपयोगकर्ता के पीछे से शुरू हो सकती है, आगे की ओर जा सकती है, और दूर से कहीं दूर जा सकती है. वीडियो चैट में, आवाज़ों को अलग-अलग किया जा सकता है और उपयोगकर्ता के आस-पास रखा जा सकता है. इससे, बोलने वाले लोगों की पहचान करना आसान हो जाता है.

अगर आपका कॉन्टेंट, स्पेशल ऑडियो के साथ काम करने वाले ऑडियो फ़ॉर्मैट का इस्तेमाल करता है, तो 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 ऑब्जेक्ट में, ऑडियो ट्रैक के फ़ॉर्मैट और चैनल कॉन्फ़िगरेशन की जानकारी होती है.

AudioFormat को canBeSpatialized() में जाने के लिए इंस्टैंशिएट करते समय, एन्कोडिंग को डिकोडर से मिले आउटपुट फ़ॉर्मैट के जैसा ही सेट करें. आपको एक ऐसा चैनल मास्क भी सेट करना चाहिए जो आपके कॉन्टेंट के चैनल कॉन्फ़िगरेशन से मेल खाता हो. इस्तेमाल करने के लिए खास वैल्यू के बारे में दिशा-निर्देश पाने के लिए, स्पेशलाइज़ेशन की डिफ़ॉल्ट सेटिंग सेक्शन देखें.

Spatializer में होने वाले बदलावों को सुनना

Spatializer की स्थिति में होने वाले बदलावों को सुनने के लिए, Spatializer.addOnSpatializerStateChangedListener() के साथ एक लिसनर जोड़ा जा सकता है. इसी तरह, हेड ट्रैकर की उपलब्धता में होने वाले बदलावों को सुनने के लिए, Spatializer.addOnHeadTrackerAvailableListener() को कॉल करें.

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

    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)