Jetpack SceneCore में मौजूद स्पेशल ऑडियो की सुविधाओं की मदद से, Android XR ऐप्लिकेशन में शानदार ऑडियो अनुभव दिया जा सकता है.
स्पेशल ऑडियो से यह पता चलता है कि उपयोगकर्ता 3D एनवायरमेंट में आवाज़ को कैसे सुनता है. इससे आवाज़ हर दिशा से आने का एहसास होता है. इसमें उपयोगकर्ता के ऊपर और नीचे से आने वाली आवाज़ भी शामिल है. सिस्टम, 3D स्पेस में खास जगहों पर एक या उससे ज़्यादा "वर्चुअल स्पीकर" की आवाज़ को सिम्युलेट करके ऐसा करता है.
Android XR के लिए डिज़ाइन या उसमें बदलाव नहीं किए गए मौजूदा ऐप्लिकेशन में, ऑडियो अपने-आप स्पेशल ऑडियो में बदल जाता है. उपयोगकर्ता के अपने स्पेस में घूमने पर, ऐप्लिकेशन का सारा ऑडियो उस पैनल से सुनाई देगा जिस पर ऐप्लिकेशन का यूज़र इंटरफ़ेस (यूआई) रेंडर किया गया है. उदाहरण के लिए, अगर घड़ी वाले ऐप्लिकेशन में टाइमर बजता है, तो ऑडियो ऐसा लगेगा कि वह ऐप्लिकेशन के पैनल की पोज़िशन से आ रहा है. Android XR, पोज़िशन के हिसाब से रीयल साउंड के लिए, आवाज़ में अपने-आप बदलाव करेगा. उदाहरण के लिए, ऐप्लिकेशन पैनल और उपयोगकर्ता के बीच की दूरी का असर, आवाज़ के वॉल्यूम पर पड़ेगा. इससे रीयल साउंड का बेहतर अनुभव मिलेगा.
मौजूदा ऐप्लिकेशन, स्पेशल ऑडियो को कैसे रेंडर करते हैं, इस बारे में ज़्यादा जानने के लिए, इस पेज पर अपने ऐप्लिकेशन में स्टीरियो और सराउंड साउंड जोड़ना लेख पढ़ें.
अगर अपने ऐप्लिकेशन को एक्सआर के लिए ऑप्टिमाइज़ किया जा रहा है, तो Jetpack SceneCore, स्पेशल ऑडियो को पसंद के मुताबिक बनाने के लिए टूल उपलब्ध कराता है. 3D एनवायरमेंट में आवाज़ों को सटीक पोज़िशन पर सेट किया जा सकता है. साथ ही, रीयल साउंड फ़ील्ड के लिए ऐम्बिसॉनिक ऑडियो का इस्तेमाल किया जा सकता है. इसके अलावा, बिल्ट-इन सराउंड साउंड इंटिग्रेशन का फ़ायदा लिया जा सकता है.
Android XR में उपलब्ध स्पेशल ऑडियो के टाइप
Android XR, पोज़िशनल, स्टीरियो, सराउंड साउंड, और ऐम्बिसॉनिक ऑडियो को सपोर्ट करता है.
पोज़िशनल ऑडियो
पोज़िशनल ऑडियो को 3D स्पेस में किसी खास पॉइंट से चलाने के लिए सेट किया जा सकता है. उदाहरण के लिए, वर्चुअल एनवायरमेंट के किसी कोने पर भौंकते हुए कुत्ते का 3D मॉडल बनाया जा सकता है. कई एंटिटी, अपनी-अपनी पोज़िशन से आवाज़ें निकाल सकती हैं. पोज़िशनल ऑडियो रेंडर करने के लिए, फ़ाइलें मोनो या स्टीरियो होनी चाहिए.
स्पेशलाइज़्ड स्टीरियो और सराउंड साउंड
पोज़िशनल, स्टीरियो, और सराउंड साउंड के लिए, Android के सभी मीडिया फ़ॉर्मैट काम करते हैं. इन फ़ॉर्मैट के अलावा, Android XR डिवाइस, Dolby Atmos, Dolby Digital, और Dolby Digital+ ऑडियो फ़ॉर्मैट को भी सपोर्ट कर सकते हैं.
स्टीरियो ऑडियो, दो चैनलों वाले ऑडियो फ़ॉर्मैट को कहते हैं. वहीं, सराउंड साउंड, दो से ज़्यादा चैनलों वाले ऑडियो फ़ॉर्मैट को कहते हैं. जैसे, 5.1 सराउंड साउंड या 7.1 सराउंड साउंड कॉन्फ़िगरेशन. हर चैनल का साउंड डेटा, एक स्पीकर से जुड़ा होता है. उदाहरण के लिए, स्टीरियो में संगीत चलाने पर, बाएं स्पीकर चैनल से दाएं स्पीकर चैनल के मुकाबले अलग-अलग इंस्ट्रूमेंट ट्रैक सुनाई दे सकते हैं.
फ़िल्मों और टीवी शो में, सराउंड साउंड का इस्तेमाल अक्सर रीयल साउंड का बेहतर अनुभव देने और दर्शकों को कहानी में पूरी तरह डुबोने के लिए किया जाता है. इसके लिए, कई स्पीकर चैनलों का इस्तेमाल किया जाता है. उदाहरण के लिए, बातचीत अक्सर सेंटर स्पीकर चैनल से सुनाई देती है. वहीं, हेलिकॉप्टर के उड़ने की आवाज़ के लिए, अलग-अलग चैनलों का इस्तेमाल किया जा सकता है. इससे ऐसा लगता है कि हेलिकॉप्टर, आपके 3D स्पेस में उड़ रहा है.
ऐम्बिसॉनिक ऑडियो
ऐम्बिसॉनिक ऑडियो (या ऐम्बिसॉनिक्स), ऑडियो के लिए स्काईबॉक्स की तरह होता है.
इससे उपयोगकर्ताओं को शानदार साउंडस्केप मिलता है. बैकग्राउंड में एनवायरमेंटल साउंड या अन्य ऐसे सीन के लिए ऐम्बिसॉनिक्स का इस्तेमाल करें जहां आपको सुनने वाले व्यक्ति के आस-पास, पूरी तरह से गोलाकार साउंड फ़ील्ड बनाना हो. Android XR, फ़र्स्ट, सेकंड, और थर्ड-ऑर्डर
ऐम्बिसॉनिक्स में,
AmbiX ऐम्बिसॉनिक ऑडियो फ़ॉर्मैट को सपोर्ट करता है. हमारा सुझाव है कि Opus (.ogg) और
PCM/Wave (.wav) फ़ाइल टाइप इस्तेमाल करें.
Jetpack SceneCore के साथ स्पेशल ऑडियो का इस्तेमाल करना
Jetpack SceneCore के साथ स्पेशल ऑडियो को लागू करने के लिए, स्पेशल ऑडियो की सुविधाओं की जांच करें और स्पेशल ऑडियो लोड करने के लिए कोई एपीआई चुनें.
स्पेशल ऑडियो की सुविधाओं की जांच करना
स्पेशल ऑडियो की सुविधाओं का इस्तेमाल करने से पहले, यह देखें कि Session में
स्पेशल ऑडियो की सुविधा काम करती है या नहीं. यहां दिए गए कोड स्निपेट में, स्पेशलाइज़्ड ऑडियो चलाने की कोशिश करने से पहले, सुविधाओं की जांच की जाती है.
स्पेशल ऑडियो लोड करना
Jetpack SceneCore में स्पेशल ऑडियो लोड करने के लिए, इनमें से कोई भी एपीआई इस्तेमाल किया जा सकता है.
SoundPool: यह 1 एमबी से कम साइज़ वाले छोटे साउंड इफ़ेक्ट के लिए सबसे सही है. इन्हें पहले से लोड किया जाता है और आवाज़ों का बार-बार इस्तेमाल किया जा सकता है. पोज़िशनल ऑडियो के लिए, ऑडियो लोड करने का यह सबसे अच्छा तरीका है.ExoPlayer: यह स्टीरियो और सराउंड साउंड कॉन्टेंट लोड करने के लिए सबसे सही है. जैसे, संगीत और वीडियो. इससे बैकग्राउंड में मीडिया चलाया जा सकता है.MediaPlayer: यह ऐम्बिसॉनिक ऑडियो लोड करने का सबसे आसान तरीका है.AudioTrack: यह ऑडियो डेटा लोड करने के तरीके पर सबसे ज़्यादा कंट्रोल देता है. इससे ऑडियो के बफ़र को सीधे तौर पर लिखा जा सकता है. साथ ही, अगर आपने अपनी ऑडियो फ़ाइलें सिंथेसाइज़ या डिकोड की हैं, तो भी इसका इस्तेमाल किया जा सकता है.
मीडिया फ़ॉर्मैट के लिए, डिवाइस की सुविधाओं की जांच करना
Android प्लैटफ़ॉर्म, कुछ मीडिया फ़ॉर्मैट को सपोर्ट करता है. हालांकि, कोई खास Android XR डिवाइस, Dolby Atmos जैसे अन्य फ़ॉर्मैट को भी सपोर्ट कर सकता है. मीडिया फ़ॉर्मैट के लिए, डिवाइस की सुविधाओं के बारे में जानने के लिए, ExoPlayer के
AudioCapabilities का इस्तेमाल करें:
val audioCapabilities = AudioCapabilities.getCapabilities( context, androidx.media3.common.AudioAttributes.DEFAULT, null, emptyList() ) if (audioCapabilities.supportsEncoding(C.ENCODING_AC3)) { // Device supports playback of the Dolby Digital media format. } if (audioCapabilities.supportsEncoding(C.ENCODING_E_AC3)) { // Device supports playback of the Dolby Digital Plus media format. } if (audioCapabilities.supportsEncoding(C.ENCODING_E_AC3_JOC)) { // Device supports playback of the Dolby Digital Plus with Dolby Atmos media format. }
इन सुविधाओं की जांच करने के लिए, कॉल ब्लॉक करने की ज़रूरत पड़ सकती है. इसलिए, इन्हें मुख्य थ्रेड पर कॉल नहीं किया जाना चाहिए.
अपने ऐप्लिकेशन में पोज़िशनल ऑडियो जोड़ना
पोज़िशनल साउंड सोर्स, PointSourceParams और उससे जुड़े
Entity से तय होते हैं. Entity की पोज़िशन और ओरिएंटेशन से यह तय होता है कि PointSourceParams को 3D स्पेस में कहां रेंडर किया जाएगा.
setPointSourceParams पर
SpatialMediaPlayer को कॉल करें, ताकि PointSourceParams और उससे जुड़ी entity को MediaPlayer इंस्टेंस पर सेट किया जा सके.
पोज़िशनल ऑडियो का उदाहरण
यहां दिए गए उदाहरण में, साउंड इफ़ेक्ट वाली ऑडियो फ़ाइल को साउंड पूल में लोड किया गया है. साथ ही, इसे Entity की पोज़िशन पर वापस चलाया गया है.
// Check spatial capabilities before using spatial audio if (session.scene.spatialCapabilities.contains(SpatialCapability.SPATIAL_AUDIO) ) { // The session has spatial audio capabilities val maxVolume = 1F val lowPriority = 0 val infiniteLoop = -1 val normalSpeed = 1F val soundPool = SoundPool.Builder() .setAudioAttributes( AudioAttributes.Builder() .setContentType(CONTENT_TYPE_SONIFICATION) .setUsage(USAGE_ASSISTANCE_SONIFICATION) .build() ) .build() val pointSource = PointSourceParams() val soundEffect = appContext.assets.openFd("sounds/tiger_16db.mp3") val pointSoundId = soundPool.load(soundEffect, lowPriority) soundPool.setOnLoadCompleteListener { soundPool, sampleId, status -> // wait for the sound file to be loaded into the soundPool if (status == 0) { SpatialSoundPool.play( session = session, entity = entity, soundPool = soundPool, soundID = pointSoundId, params = pointSource, volume = maxVolume, priority = lowPriority, loop = infiniteLoop, rate = normalSpeed ) } } } else { // The session does not have spatial audio capabilities }
कोड के बारे में अहम जानकारी
- पहला चरण यह है कि स्पेशल ऑडियो की सुविधाएं उपलब्ध हैं या नहीं, यह देखने के लिए
spatialCapabilitiesका इस्तेमाल किया जाए. - contentType को
CONTENT_TYPE_SONIFICATIONऔर usage कोUSAGE_ASSISTANCE_SONIFICATIONपर सेट करने से, सिस्टम इस ऑडियो फ़ाइल को साउंड इफ़ेक्ट के तौर पर ट्रीट करता है. - ऊपर दिए गए उदाहरण में, ऑडियो फ़ाइल को पूल में तुरंत लोड किया जाता है. इसके बाद, इसे इस्तेमाल किया जाता है. इससे कोड को आसान बनाया जा सकता है. हमारा सुझाव है कि अपने सभी साउंड इफ़ेक्ट को एसिंक्रोनस तरीके से लोड करें. इससे जब आपको इनकी ज़रूरत होगी, तब ये पूल में उपलब्ध होंगी.
अपने ऐप्लिकेशन में स्टीरियो और सराउंड साउंड जोड़ना
अपने ऐप्लिकेशन में स्टीरियो और सराउंड साउंड जोड़ने के लिए, Exoplayer का इस्तेमाल करने का सुझाव दिया जाता है. Exoplayer स्पेशल ऑडियो का इस्तेमाल करने के बारे में ज़्यादा जानने के लिए, स्पेशल ऑडियो की गाइड देखें.
स्टीरियो और सराउंड साउंड स्पीकर की पोज़िशनिंग
सराउंड साउंड स्पीकर की पोज़िशनिंग में, वर्चुअल सराउंड साउंड स्पीकर को सेंटर स्पीकर के मुकाबले, स्टैंडर्ड ITU कॉन्फ़िगरेशन में उपयोगकर्ता के आस-पास सेट किया जाता है.
डिफ़ॉल्ट रूप से, सेंटर चैनल स्पीकर को ऐप्लिकेशन की
mainPanelEntity पर रखा जाता है. इसमें वे मोबाइल ऐप्लिकेशन शामिल हैं जिनमें Android XR, ऑडियो को अपने-आप स्पेशल ऑडियो में बदल देता है.
स्टीरियो के लिए, स्पीकर प्लेसमेंट, सराउंड साउंड जैसा ही होता है. हालांकि, इसमें सिर्फ़ बाएं और दाएं चैनल को पैनल के बाएं और दाएं हिस्से पर रखा जाता है.
अगर आपके पास एक से ज़्यादा पैनल हैं और आपको यह चुनना है कि किस पैनल से ऑडियो सुनाई देगा या अगर आपको स्टीरियो या सराउंड ऑडियो को किसी अन्य Entity के मुकाबले रेंडर करना है, तो सेंटर चैनल की जगह तय करने के लिए, PointSourceAttributes का इस्तेमाल किया जा सकता है. बाकी चैनलों को पहले बताए गए तरीके से रखा जाएगा. इन
स्थितियों में, आपको MediaPlayer का भी इस्तेमाल करना होगा.
उपयोगकर्ता के अपने स्पेस में घूमने पर, स्टीरियो और सराउंड साउंड के वर्चुअल स्पीकर, हमेशा सही पोज़िशन पर रहेंगे. इसके लिए, वे अपनी पोज़िशन में बदलाव करते रहेंगे.
अगर आपने MediaPlayer या ExoPlayer को बैकग्राउंड में स्टीरियो या सराउंड साउंड चलाने के लिए कॉन्फ़िगर किया है, तो ऐप्लिकेशन के बैकग्राउंड में होने पर, वर्चुअल स्पीकर
की पोज़िशनिंग बदल जाएगी. ऐसा इसलिए होता है, क्योंकि आवाज़ को ऐंकर करने के लिए, स्पेस में कोई पैनल या अन्य पॉइंट नहीं होता. इसलिए, स्पेशल ऑडियो, उपयोगकर्ता के साथ घूमता है. दूसरे शब्दों में कहें, तो यह "हेड-लॉक" होता है.
सराउंड साउंड का उदाहरण
यहां दिए गए उदाहरण में, MediaPlayer का इस्तेमाल करके 5.1 ऑडियो फ़ाइल लोड की गई है. साथ ही, फ़ाइल के सेंटर चैनल को Entity के तौर पर सेट किया गया है.
// Check spatial capabilities before using spatial audio if (session.scene.spatialCapabilities.contains(SpatialCapability.SPATIAL_AUDIO)) { // The session has spatial audio capabilities val pointSourceAttributes = PointSourceParams() val mediaPlayer = MediaPlayer() val fivePointOneAudio = appContext.assets.openFd("sounds/aac_51.ogg") mediaPlayer.reset() mediaPlayer.setDataSource(fivePointOneAudio) val audioAttributes = AudioAttributes.Builder() .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) .setUsage(AudioAttributes.USAGE_MEDIA) .build() SpatialMediaPlayer.setPointSourceParams( session, mediaPlayer, pointSourceAttributes, entity = session.scene.mainPanelEntity, ) mediaPlayer.setAudioAttributes(audioAttributes) mediaPlayer.prepare() mediaPlayer.start() } else { // The session does not have spatial audio capabilities }
कोड के बारे में अहम जानकारी
- पोज़िशनल ऑडियो के उदाहरण की तरह, पहला चरण यह है कि
स्पेशल ऑडियो की सुविधाएं उपलब्ध हैं या नहीं, यह देखने के लिए
spatialCapabilitiesका इस्तेमाल किया जाए. contentTypeकोAudioAttributes.CONTENT_TYPE_MUSICऔर usage कोAudioAttributes.USAGE_MEDIAपर सेट करने से, सिस्टम इस ऑडियो फ़ाइल को सराउंड साउंड के तौर पर ट्रीट करता है.
अपने ऐप्लिकेशन में ऐम्बिसॉनिक साउंड फ़ील्ड जोड़ना
ऐम्बिसॉनिक साउंड फ़ील्ड को वापस चलाने का सबसे आसान तरीका है कि फ़ाइल को MediaPlayer से लोड किया जाए. ऐम्बिसॉनिक साउंड, पूरे साउंडस्केप पर लागू होता है. इसलिए, पोज़िशन तय करने के लिए, Entity तय करने की ज़रूरत नहीं होती. इसके बजाय, चैनलों की संख्या तय करने के लिए, सही ऐम्बिसॉनिक
ऑर्डर के साथ SoundFieldAttributes का
इंस्टेंस बनाएं.
ऐम्बिसॉनिक्स का उदाहरण
यहां दिए गए उदाहरण में, MediaPlayer का इस्तेमाल करके ऐम्बिसॉनिक साउंड फ़ील्ड चलाया गया है.
// Check spatial capabilities before using spatial audio if (session.scene.spatialCapabilities.contains(SpatialCapability.SPATIAL_AUDIO)) { // The session has spatial audio capabilities val soundFieldAttributes = SoundFieldAttributes(SpatializerConstants.AmbisonicsOrder.FIRST_ORDER) val mediaPlayer = MediaPlayer() val soundFieldAudio = appContext.assets.openFd("sounds/foa_basketball_16bit.wav") mediaPlayer.reset() mediaPlayer.setDataSource(soundFieldAudio) val audioAttributes = AudioAttributes.Builder() .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) .setUsage(AudioAttributes.USAGE_MEDIA) .build() SpatialMediaPlayer.setSoundFieldAttributes( session, mediaPlayer, soundFieldAttributes ) mediaPlayer.setAudioAttributes(audioAttributes) mediaPlayer.prepare() mediaPlayer.start() } else { // The session does not have spatial audio capabilities }
कोड के बारे में अहम जानकारी
- पिछले स्निपेट की तरह, पहला चरण यह है कि स्पेशल ऑडियो
की सुविधाएं उपलब्ध हैं या नहीं, यह देखने के लिए
hasCapability()का इस्तेमाल किया जाए. contentTypeऔर usage सिर्फ़ जानकारी के लिए हैं.AMBISONICS_ORDER_FIRST_ORDERसे SceneCore को यह सिग्नल मिलता है कि साउंड फ़ील्ड फ़ाइल में चार चैनल तय किए गए हैं.