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ünden ve altından da dahil olmak üzere her yönden gelen ses hissi oluşturur. Sistem bunu, 3D alanda belirli konumlarda bir veya daha fazla "sanal hoparlör" simüle ederek yapar.
Android XR için tasarlanmamış veya Android XR için değiştirilmemiş mevcut uygulamaların sesleri Android XR'de otomatik olarak uzamsallaştırılır. Kullanıcı alanında dolaşırken tüm uygulama sesleri, uygulamanın kullanıcı arayüzünün oluşturulduğu panelden çıkar. Örneğin, bir saat uygulamasındaki 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 gerçekçi bir deneyim için ses hacmini 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 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 ambisonal ses kullanabilir ve yerleşik surround ses entegrasyonundan yararlanabilirsiniz.
Android XR'de kullanılabilen üç boyutlu ses türleri
Android XR; konumsal, stereo, surround ses ve ambisonal sesi destekler.
Konumsal ses
Konumsal ses, 3D alandaki 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 ses oluşturmak 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.
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 kanala sahip ses biçimlerini ifade eder. Her kanalın ses verileri bir hoparlörle ilişkilendirilir. Örneğin, stereo sesle müzik çalarken sol hoparlör kanalı sağdakinden farklı enstrüman parçaları yayınlayabilir.
Çevre sesi, birden fazla hoparlör kanalı kullanılarak gerçekçiliği ve sürükleyiciliği artırmak için genellikle filmlerde ve televizyon programlarında kullanılır. Örneğin, diyalog genellikle merkez hoparlör kanalından çalınır. Uçan bir helikopterin sesi ise helikopterin 3D alanınızda uçtuğunu hissettirmek için sırayla farklı kanallar kullanabilir.
Ambisoni ses
Ambisonic ses (veya ambisonics), ses için bir gökyüzü kutusu gibidir ve kullanıcılarınıza etkileyici bir ses ortamı sunar. Arka planda çevre sesleri veya dinleyiciyi çevreleyen tam küresel bir ses alanını taklit etmek istediğiniz diğer senaryolar için ambisonikleri 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 uygulamak, üç boyutlu ses özelliklerini kontrol etmeyi ve üç boyutlu ses yüklemek için bir API seçmeyi içerir.
Mekansal özellikleri kontrol etme
Üç boyutlu ses özelliklerini kullanmadan önce Session
cihazınızın üç boyutlu sesi destekleyip desteklemediğini kontrol edin. Aşağıdaki bölümlerdeki tüm kod snippet'lerinde, uzamsal ses oynatılmaya çalışılmadan ö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 kısa ses efektleri için idealdir. Bu sesler önceden yüklenir ve tekrar tekrar kullanılabilir. Bu, konumsal ses için ses yüklemenin mükemmel 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 izin verir.MediaPlayer
: Ambisoni ses yüklemenin en basit yolunu sağlar.AudioTrack
: Ses verilerinin nasıl yükleneceği konusunda en fazla kontrolü sağlar. Doğrudan ses tamponları yazmanıza veya kendi ses dosyalarınızı sentezlemenize ya da kod çözmenize olanak tanır.
Uygulamanıza konumsal ses ekleme
Konumsal ses kaynakları, PointSourceAttributes
ve ilişkili bir Entity
ile tanımlanır. Entity
öğesinin konumu ve yönü, PointSourceAttribute
öğ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 (xrSession.getSpatialCapabilities().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 = PointSourceAttributes(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 = xrSession,
soundPool = soundPool,
soundID = pointSoundId,
attributes = 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,
getSpatialCapabilities()
simgesini kullanarak Üç Boyutlu Ses özelliklerinin şu anda kullanılıp kullanılamadığını kontrol etmektir. - contentType değerini
CONTENT_TYPE_SONIFICATION
, usage değerini iseUSAGE_ASSISTANCE_SONIFICATION
olarak ayarlamak, sistemin bu ses dosyasını ses efekti olarak işlemesine olanak tanır. - Önceki örnekte, kodun basit olması için ses dosyası, kullanılmadan hemen önce havuza yüklenir. İdeal olarak, tüm ses efektlerinizi uygulamanızı yüklerken eşzamansız olarak yüklemeniz gerekir. Böylece, ihtiyaç duyduğunuzda 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ılavuzuna göz atın.
Stereo ve surround ses hoparlörlerinin konumlandırılması
Surround ses hoparlörü yerleşiminde, 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.
Merkez kanal hoparlörü varsayılan olarak uygulamanın mainPanelEntity
bölümüne yerleştirilir. Buna, sesleri Android XR tarafından otomatik olarak uzamsallaştırılan mobil uygulamalar dahildir.
Stereo hoparlör yerleşimi, surround sese benzer. Tek fark, sol ve sağ kanalların sırasıyla panelin sol ve sağ tarafına yerleştirilmesidir.
Birden fazla paneliniz varsa ve sesin hangi panelden çıkacağını seçmek istiyorsanız ya da stereo veya surround sesin başka bir Entity
'ye göre oluşturulmasını istiyorsanız merkez kanalın konumunu tanımlamak için PointSourceAttributes
öğesini kullanabilirsiniz. Kalan kanallar daha önce belirtildiği gibi yerleştirilir. Bu durumlarda MediaPlayer
öğesini de kullanmanız gerekir.
Kullanıcı odasında hareket ettikçe stereo ve surround sesli sanal hoparlörler, hoparlörlerin her zaman en uygun konumda olmasını sağlamak için hareket eder ve ayarlanır.
MediaPlayer
veya ExoPlayer
'i arka planda stereo veya surround ses oynatmaya devam edecek şekilde yapılandırdıysanız uygulama arka plana geçtiğinde sanal hoparlör konumlandırması değişir. Sesleri sabitleyecek bir panel veya başka bir nokta olmadığından, uzamsal ses kullanıcıyla birlikte hareket eder (yani "kafa kilitli"dir).
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 (xrSession.getSpatialCapabilities().hasCapability(SpatialCapabilities.SPATIAL_CAPABILITY_SPATIAL_AUDIO)) {
// The session has spatial audio capabilities
val pointSourceAttributes = PointSourceAttributes(xrSession.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.setPointSourceAttributes(
xrSession,
mediaPlayer,
pointSourceAttributes)
mediaPlayer.setAudioAttributes(audioAttributes)
mediaPlayer.prepare()
mediaPlayer.start()
} else {
// The session does not have spatial audio capabilities
}
Kodla ilgili önemli noktalar
- Konumsal ses örneğinde olduğu gibi, ilk adım
getSpatialCapabilities()
kullanarak uzamsal ses özelliklerinin şu anda kullanılıp kullanılamadığını kontrol etmektir. - contentType değerini CONTENT_TYPE_MUSIC, usage değerini ise USAGE_MEDIA olarak ayarlamak, sistemin bu ses dosyasını surround ses olarak işlemesine olanak tanır.
Uygulamanıza ambisonal ses alanları ekleme
Ambisoni ses alanlarını oynatmanın en kolay yolu, dosyayı MediaPlayer
ile yüklemektir. Ambisoni ses, ses ortamının tamamı için geçerli olduğundan konum belirtmek üzere bir Entity
belirtmeniz gerekmez. Bunun yerine, kanal sayısını belirten uygun ambisoni sırasıyla SoundFieldAttributes
örneği oluşturursunuz.
Ambionics örneği
Aşağıdaki örnekte, MediaPlayer
kullanılarak ambisoni bir ses alanı çalınır.
// Check spatial capabilities before using spatial audio
if (xrSession.getSpatialCapabilities().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(
xrSession,
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,
getSpatialCapabilities()
kullanarak Üç Boyutlu Ses özelliklerinin şu anda kullanılıp kullanılamadığını kontrol etmektir. - contentType ve usage yalnızca bilgilendirme amaçlıdır.
AMBISONICS_ORDER_FIRST_ORDER
, ses alanı dosyasının dört kanal tanımladığını SceneCore'a bildirir.