XR uygulamanıza üç boyutlu ses ekleme

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 sesi 3 boyutlu bir ortamda 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 uzaydaki belirli konumlarda bir veya daha fazla "sanal hoparlör" simüle ederek yapar.

Android XR için tasarlanmamış veya Android XR'a göre 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 çıkar. Örneğin, bir saat uygulamasında zamanlayıcı çaldığında ses, uygulama paneli konumundan geliyormuş gibi duyulur. Android XR, konumsal gerçekçilik için sesi otomatik olarak değiştirir. Örneğin, uygulama paneli ile kullanıcı arasındaki algılanan mesafe, daha fazla gerçekçilik için ses düzeyini hafifçe etkiler.

Mevcut uygulamaların uzamsal sesi nasıl oluşturduğu hakkında daha fazla bilgi için bu sayfadaki Uygulamanıza stereo ve surround ses ekleme başlıklı makaleyi inceleyin.

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 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 oluşturabilirsiniz. Her biri kendi konumundan ses yayan birden fazla öğe olabilir. Konumsal sesin işlenmesi için dosyalar mono veya stereo olmalıdır.

Uzamsallaştırılmış stereo ve surround ses

Konumsal, stereo ve surround ses için tüm Android medya biçimleri desteklenir.

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 kanallı ses biçimlerini ifade eder. Her kanalın ses verileri bir hoparlörle ilişkilendirilir. Örneğin, müziği stereo olarak çalarken sol hoparlör kanalı sağ hoparlör kanalından farklı enstrüman parçaları yayabilir.

Çoklu hoparlör kanalları kullanılarak gerçekçiliği ve etkileyiciliği artırmak için filmlerde ve televizyon programlarında genellikle surround ses kullanılır. Örneğin, diyaloglar genellikle merkez hoparlör kanalından çalınırken uçan bir helikopterin sesi, helikopterin 3D alanınızda uçtuğu hissini vermek için sırayla farklı kanalları kullanabilir.

Ambisonik ses

Ambisonik ses (veya ambisonik) ses için bir skybox gibidir ve kullanıcılarınıza sürükleyici bir ses ortamı sunar. Arka plandaki ortam sesleri veya dinleyiciyi çevreleyen tam küresel bir ses alanı oluşturmak istediğiniz diğer senaryolar için ambisonik ses kullanın. Android XR, birinci, ikinci ve üçüncü derece ambisonics'te AmbiX ambisonic ses biçimini destekler. Opus (.ogg) ve PCM/Wave (.wav) dosya türlerini öneririz.

Jetpack SceneCore ile üç boyutlu ses kullanma

Jetpack SceneCore ile üç boyutlu ses özelliğini 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ın üç boyutlu sesi desteklediğinden emin olun. Aşağıdaki bölümlerdeki tüm kod snippet'lerinde, uzamsallaştırılmış ses çalınmaya çalışılmadan önce özellikler kontrol edilir.

Üç boyutlu ses yükleme

Jetpack SceneCore'da kullanılmak ü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 oynatmaya da olanak tanır.
  • MediaPlayer: Ambisonik ses yüklemenin en basit yolunu sunar.
  • AudioTrack: Ses verilerinin nasıl yükleneceği konusunda en fazla kontrolü sağlar. Ses arabelleklerinin doğrudan yazılmasına veya kendi ses dosyalarınızı sentezlemenize ya da kodunu çözmenize olanak tanı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 uzayda nerede oluşturulacağını belirler.

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
    .hasCapability(SpatialCapabilities.SPATIAL_CAPABILITY_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(entity)

    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,
                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 olarak spatialCapabilities kullanarak üç boyutlu ses özelliklerinin şu anda kullanılıp kullanılamadığını kontrol edin.
  • contentType'ı CONTENT_TYPE_SONIFICATION, usage'ı ise USAGE_ASSISTANCE_SONIFICATION olarak ayarladığınızda sistem bu ses dosyasını ses efekti olarak değerlendirir.
  • Önceki örnekte, ses dosyası havuzda hemen yüklenir ve ardından kodu basit tutmak için kullanılır. İdeal olarak, uygulamanızı yüklerken tüm ses efektlerinizi eşzamansız olarak yüklemelisiniz. Böylece, ihtiyacınız olduğunda tüm ses dosyaları havuzda kullanılabilir.

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ılavuzu'na bakın.

Stereo ve surround ses hoparlör konumlandırması

Surround ses hoparlör konumlandırmasıyla, sanal surround ses hoparlörler, standart bir ITU yapılandırmasında kullanıcının etrafında, merkezi bir 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. Buna, Android XR tarafından otomatik olarak uzamsallaştırılan seslere sahip mobil uygulamalar da dahildir.

Stereo için hoparlör yerleşimi, surround sese benzer. Ancak yalnızca sol ve sağ kanallar panelin sırasıyla sol ve sağ tarafına yerleştirilir.

Birden fazla paneliniz varsa ve hangi panelin ses yayını yapacağını seçmek istiyorsanız veya stereo ya da surround sesin başka bir Entity'ya göre oluşturulmasını istiyorsanız orta kanalın konumunu tanımlamak için PointSourceAttributes simgesini kullanabilirsiniz. Geri kalan kanallar daha önce belirtildiği gibi yerleştirilir. Bu durumlarda MediaPlayer de kullanmanız gerekir.

Kullanıcı alanında hareket ettikçe stereo ve surround ses sanal hoparlörleri, hoparlörlerin her zaman optimum konumda olmasını sağlamak için hareket eder ve ayarlanır.

MediaPlayer veya ExoPlayer simgesini arka planda stereo veya 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ığı için uzamsal ses, kullanıcıyla birlikte hareket eder (diğer bir deyişle "kafa kilidi" uygulanır).

Surround ses örneği

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

// Check spatial capabilities before using spatial audio
if (session.scene.spatialCapabilities.hasCapability(SpatialCapabilities.SPATIAL_CAPABILITY_SPATIAL_AUDIO)) {
    // The session has spatial audio capabilities

    val pointSourceAttributes = PointSourceParams(session.scene.mainPanelEntity)

    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
    )

    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

Ambisonik ses alanlarını oynatmanın en basit yolu, dosyayı MediaPlayer ile yüklemektir. Ambisonik ses, tüm ses ortamı için geçerli olduğundan konum sağlamak üzere Entity belirtmeniz gerekmez. Bunun yerine, kanal sayısını belirten uygun ambisonik sırasıyla SoundFieldAttributes örneği oluşturursunuz.

Ambionics örneği

Aşağıdaki örnekte, MediaPlayer kullanılarak ambisonik bir ses alanı çalınmaktadır.

// Check spatial capabilities before using spatial audio
if (session.scene.spatialCapabilities.hasCapability(SpatialCapabilities.SPATIAL_CAPABILITY_SPATIAL_AUDIO)) {
    // The session has spatial audio capabilities

    val soundFieldAttributes =
        SoundFieldAttributes(SpatializerConstants.AMBISONICS_ORDER_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 hasCapability() kullanarak üç boyutlu ses özelliklerinin kullanılabilir olup olmadığını kontrol etmektir.
  • contentType ve kullanım tamamen bilgilendirme amaçlıdır.
  • AMBISONICS_ORDER_FIRST_ORDER, SceneCore'a ses alanı dosyasının dört kanal tanımladığını bildirir.