स्पेशल ऑडियो

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

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

अगर आपके कॉन्टेंट में ऑडियो फ़ॉर्मैट काम करता है, तो उसमें स्पेशल ऑडियो जोड़ा जा सकता है Android 13 (एपीआई लेवल 33) से शुरू होने वाला ऐप्लिकेशन.

क्षमताओं के लिए क्वेरी

इन कामों के लिए, Spatializer क्लास का इस्तेमाल करें डिवाइस की स्पेशलाइज़ेशन क्षमताओं और व्यवहार के बारे में क्वेरी कर सकते हैं. वापस पाने से शुरू करें Spatializer का एक इंस्टेंस AudioManager:

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 इंस्टेंस. उदाहरण के लिए, अगर आप Jetpack Media3 लाइब्रेरी का इस्तेमाल कर रहे हैं और आपने AudioAttributes, 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(). इसी तरह, ExoPlayer के मौजूदा पैरामीटर को Player.getTrackSelectionParameters(). उदाहरण के लिए, वीडियो के बीच में मौजूद किसी स्टीरियो ऑडियो ट्रैक को चुनने के लिए:

Kotlin

exoPlayer.trackSelectionParameters = exoPlayer.trackSelectionParameters
  .buildUpon()
  .setMaxAudioChannelCount(2)
  .build()

Java

exoPlayer.setTrackSelectionParameters(
  exoPlayer.getTrackSelectionParameters()
    .buildUpon()
    .setMaxAudioChannelCount(2)
    .build()
);

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

डिफ़ॉल्ट स्पेशलाइज़ेशन बिहेवियर

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 चैनल (सामने-बाएं, सामने-दाएं, बैक-लेफ़्ट, और बैक-राइट) की मदद से ऑडियो को स्पेशलाइज़ेशन के लिए मंज़ूरी मिलनी चाहिए. नीचे दिए गए उदाहरण में, हमने AudioFormat.CHANNEL_OUT_5POINT1 का इस्तेमाल किया है 5.1 ऑडियो ट्रैक के लिए. स्टीरियो ऑडियो ट्रैक के लिए, AudioFormat.CHANNEL_OUT_STEREO का इस्तेमाल करें.

    अगर Media3 का इस्तेमाल किया जा रहा है, तो Util.getAudioTrackChannelConfig(int channelCount) को भी इस्तेमाल किया जा सकता है का इस्तेमाल, चैनल की गिनती को चैनल मास्क में बदलने के लिए किया जा सकता है.

    इसके अलावा, कोड में बदलने के तरीके को AudioFormat.ENCODING_PCM_16BIT पर सेट करें अगर आपने डिकोडर को मल्टी-चैनल PCM से आउटपुट करने के लिए कॉन्फ़िगर किया है.

    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)