स्पेशल ऑडियो

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

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

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