XR uygulamanıza üç boyutlu ses ekleme

Uygun XR cihazlar
Bu kılavuz, bu tür XR cihazlar için deneyimler geliştirmenize yardımcı olur.
XR Kulaklığı
Kablolu XR Gözlükleri

Jetpack SceneCore'daki üç boyutlu ses özellikleri, Android XR uygulamalarınızda etkileyici ses deneyimleri oluşturmanıza olanak tanır.

Üç boyutlu ses, kullanıcıların 3D ortamda sesi nasıl algıladığını simüle eder. Kullanıcının üstü ve altı da dahil olmak üzere her yönden gelen ses hissi yaratır. Sistem bunu, 3D alandaki belirli konumlarda bir veya daha fazla "sanal hoparlör" simüle ederek yapar.

Android XR için tasarlanmamış veya değiştirilmemiş mevcut uygulamaların sesleri Android XR'da otomatik olarak uzamsallaştırılır. Kullanıcı alanında hareket ederken tüm uygulama sesleri, uygulamanın kullanıcı arayüzünün oluşturulduğu panelden verilir. Örneğin, bir saat uygulamasında zamanlayıcı çalarsa ses, uygulama panelinin bulunduğu konumdan geliyormuş gibi duyulur. Android XR, sesi otomatik olarak değiştirerek konumsal gerçekçilik sağlar. Örneğin, uygulama paneli ile kullanıcı arasındaki algılanan mesafe, daha gerçekçi bir deneyim için ses seviyesini hafifçe etkiler.

Mevcut uygulamaların üç boyutlu sesi nasıl oluşturduğu hakkında daha fazla bilgi için bu sayfadaki Uygulamanıza stereo ve surround ses ekleme bölümünü okuyun.

Uygulamanızı XR için optimize ediyorsanız Jetpack SceneCore, gelişmiş üç boyutlu ses özelleştirmesi için araçlar sağlar. Sesleri 3D ortamda hassas bir şekilde konumlandırabilir, gerçekçi ses alanları için ambisonik ses kullanabilir ve yerleşik surround ses entegrasyonundan yararlanabilirsiniz.

Android XR'da kullanılabilen üç boyutlu ses türleri

Android XR; konumsal, stereo, surround ses ve ambisonik sesleri destekler.

Konumsal ses

Konumsal ses, 3D uzayda belirli bir noktadan çalınacak şekilde konumlandırılabilir. Örneğin, sanal ortamınızın köşesinde havlayan bir köpeğin 3D modelini kullanabilirsiniz. Her biri kendi konumundan ses çıkaran birden fazla öğeniz olabilir. Konumsal sesin oluşturulması için dosyaların mono veya stereo olması gerekir.

Üç boyutlu stereo ve surround ses

Konumsal, stereo ve surround ses için tüm Android medya biçimleri desteklenir. Android XR cihazlar bu biçimlerin yanı sıra Dolby Atmos, Dolby Digital ve Dolby Digital+ ses biçimlerini de destekleyebilir.

Stereo ses, iki kanallı ses biçimlerini ifade eder. Surround ses ise 5.1 surround ses veya 7.1 surround ses yapılandırmaları gibi ikiden fazla kanalı olan ses biçimlerini ifade eder. Her kanalın ses verileri bir hoparlörle ilişkilendirilir. Örneğin, stereo müzik çalarken sol hoparlör kanalı, sağ kanaldan farklı enstrüman parçaları yayabilir.

Surround ses, birden fazla hoparlör kanalı kullanarak gerçekçiliği ve sürükleyiciliği artırmak için genellikle filmlerde ve televizyon programlarında kullanılır. Örneğin, diyaloglar genellikle merkez hoparlör kanalından oynatılırken uçan bir helikopterin sesi, helikopterin 3D alanınızda uçtuğu hissini vermek için sırayla farklı kanalları kullanabilir.

Ambisonic ses

Ambisonic ses (veya ambisonics), ses için bir skybox gibidir ve kullanıcılarınız için etkileyici bir ses ortamı sağlar. Arka plan ortam sesleri veya dinleyiciyi çevreleyen tam küresel bir ses alanını kopyalamak istediğiniz diğer senaryolar için ambisonics kullanın. Android XR, birinci, ikinci ve üçüncü derece ambisoniklerde AmbiX ambisonik ses biçimini destekler. Opus (.ogg) ve PCM/Wave (.wav) dosya türlerini kullanmanızı öneririz.

Jetpack SceneCore ile üç boyutlu ses kullanma

Jetpack SceneCore ile üç boyutlu ses uygulamak için üç boyutlu ses özelliklerini kontrol etmeniz ve üç boyutlu ses yüklemek için bir API seçmeniz gerekir.

Uzamsal özellikleri kontrol etme

Üç boyutlu ses özelliklerini kullanmadan önce Session cihazınızın üç boyutlu ses özelliğini desteklediğinden emin olun. Aşağıdaki bölümlerdeki tüm kod snippet'lerinde, üç boyutlu ses çalmaya çalışmadan önce özellikler kontrol edilir.

Üç boyutlu sesi yükleme

Jetpack SceneCore'da kullanmak üzere üç boyutlu ses yüklemek için aşağıdaki API'lerden herhangi birini kullanabilirsiniz.

  • SoundPool: Boyutu 1 MB'tan küçük olan kısa ses efektleri için idealdir. Önceden yüklenir ve sesler tekrar tekrar kullanılabilir. Bu, konumsal ses için ses yüklemenin harika bir yoludur.
  • ExoPlayer: Müzik ve video gibi stereo ve surround ses içeriklerini yüklemek için idealdir. Ayrıca arka planda medya oynatılmasına olanak tanır.
  • MediaPlayer: Ambisonic ses yüklemenin en basit yolunu sunar.
  • AudioTrack: Ses verilerinin nasıl yükleneceği konusunda en fazla kontrolü sağlar. Ses arabelleklerini doğrudan yazmanıza veya kendi ses dosyalarınızı sentezlemenize ya da kodunu çözmenize olanak tanır.

Medya biçimi desteğini kontrol etme

Bazı medya biçimleri Android platformu tarafından desteklenir. Ancak belirli bir Android XR cihazı, Dolby Atmos gibi ek biçimleri destekleyebilir. Medya biçimi desteğini sorgulamak için ExoPlayer'ın AudioCapabilities sınıfını kullanın:

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.
}

Bu özelliklerin kontrol edilmesi, çağrıların engellenmesine neden olabilir ve ana iş parçacığında çağrılmamalıdır.

Uygulamanıza konumsal ses ekleme

Konumsal ses kaynakları, PointSourceParams ve ilişkili bir Entity ile tanımlanır. Entity öğesinin konumu ve yönü, PointSourceParams öğesinin 3D alanda nerede oluşturulacağını belirler. MediaPlayer örneğinde PointSourceParams ve ilişkili entity değerini ayarlamak için SpatialMediaPlayer üzerinde setPointSourceParams yöntemini çağırın.

Konumsal ses örneği

Aşağıdaki örnekte, bir ses efekti ses dosyası ses havuzuna yüklenir ve Entity konumunda oynatılır.

// 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
}

Kodla ilgili önemli noktalar

  • İlk adım, spatialCapabilities kullanarak üç boyutlu ses özelliklerinin kullanılabilir olup olmadığını kontrol etmektir.
  • contentType değerini CONTENT_TYPE_SONIFICATION ve usage değerini USAGE_ASSISTANCE_SONIFICATION olarak ayarlamak, sistemin bu ses dosyasını ses efekti olarak değerlendirmesini sağlar.
  • Yukarıdaki örnekte, kodu bir arada tutmak için ses dosyası kullanılmadan hemen önce havuza yüklenir. İdeal olarak, uygulamanızı yüklerken tüm ses efektlerinizi eşzamansız olarak yüklemeniz gerekir. Böylece, ihtiyaç duyduğunuzda tüm ses dosyaları havuzda kullanılabilir olur.

Uygulamanıza stereo ve surround ses ekleme

Uygulamanıza stereo ve surround ses eklemenin önerilen yolu Exoplayer kullanmaktır. Üç boyutlu ses özelliğini Exoplayer ile kullanma hakkında daha fazla bilgi için Üç boyutlu ses kılavuzunu inceleyin.

Stereo ve surround ses hoparlörlerinin konumlandırılması

Surround ses hoparlörü konumlandırmasıyla, sanal surround ses hoparlörleri, standart bir ITU yapılandırmasında kullanıcının etrafında bir merkez hoparlöre göre konumlandırılır ve yönlendirilir.

Varsayılan olarak, merkez kanal hoparlörü uygulamanın mainPanelEntity bölümüne yerleştirilir. Sesleri Android XR tarafından otomatik olarak üç boyutlu hale getirilen mobil uygulamalar da buna dahildir.

Stereo için hoparlör yerleşimi, surround sese benzer. Tek fark, yalnızca sol ve sağ kanalların panelin sol ve sağ tarafına yerleştirilmesidir.

Birden fazla paneliniz varsa ve hangi panelin ses yayacağını seçmek istiyorsanız veya stereo ya da surround sesin başka bir Entity ile ilişkili olarak oluşturulmasını istiyorsanız merkez kanalın konumunu tanımlamak için PointSourceAttributes kullanabilirsiniz. Kalan kanallar daha önce belirtildiği şekilde yerleştirilir. Bu durumlarda MediaPlayer da kullanmanız gerekir.

Kullanıcı alanında hareket ettikçe stereo ve surround ses sanal hoparlörleri, hoparlörlerin her zaman en uygun konumda olmasını sağlayacak şekilde hareket eder ve ayarlanır.

MediaPlayer veya ExoPlayer'ı arka planda stereo ya da surround ses çalmaya devam edecek şekilde yapılandırdıysanız uygulama arka plana alındığında sanal hoparlör konumlandırması değiştirilir. Sesi sabitleyecek bir panel veya başka bir nokta olmadığından üç boyutlu ses kullanıcıyla birlikte hareket eder (başka bir deyişle, "başa kilitlenir").

Surround ses örneği

Aşağıdaki örnekte, MediaPlayer kullanılarak 5.1 ses dosyası yüklenir ve dosyanın orta kanalı Entity olarak ayarlanır.

// 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
}

Kodla ilgili önemli noktalar

Uygulamanıza ambisonik ses alanları ekleme

Ambisonic ses alanlarını oynatmanın en basit yolu, dosyayı bir MediaPlayer ile yüklemektir. Ambisonik ses tüm ses ortamına uygulandığından konum belirtmek için Entity öğesini belirtmeniz gerekmez. Bunun yerine, kanal sayısını belirten uygun ambisonik sırayla SoundFieldAttributes örneği oluşturursunuz.

Ambionics örneği

Aşağıdaki örnekte, MediaPlayer kullanılarak ambisonik bir ses alanı oynatılmaktadır.

// 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
}

Kodla ilgili önemli noktalar

  • Önceki snippet'lerde olduğu gibi, ilk adım spatialCapabilities kullanarak üç boyutlu ses özelliklerinin kullanılabilir olup olmadığını kontrol etmektir.
  • contentType ve kullanım yalnızca bilgilendirme amaçlıdır.
  • SpatializerConstants.AmbisonicsOrder.FIRST_ORDER, SceneCore'a ses alanı dosyasının dört kanal tanımladığını bildirir.