Üç boyutlu ses, kullanıcılarınızın benzersiz bir deneyimle Bu sayede, içeriğinizin kulağa daha gerçekçi gelmesini sağlayabilirsiniz. Ses "üç boyutlu" surround sese benzer bir çoklu hoparlör efekti oluşturmak için ancak kulaklıkla yapabilirsiniz.
Örneğin, bir filmde arabanın sesi kullanıcının arkasından başlayıp öne doğru ilerleyebilir ve uzaklaşabilir. Görüntülü sohbette sesler ayrılabilir ve kullanıcının etrafına yerleştirilebilir. Böylece, konuşmacıları daha kolay tanıyabilirsiniz.
İçeriğinizde desteklenen bir ses biçimi kullanılıyorsa Android 13'ten (API düzeyi 33) itibaren uygulamanıza uzamsal ses ekleyebilirsiniz.
Özelliklerle ilgili sorgu
Spatializer
sınıfını kullanarak şu işlemleri yapabilirsiniz:
cihazın mekansallaştırma özelliklerini ve davranışını sorgulamak için kullanılır. Alınarak başlayın
Spatializer
örneği
AudioManager
:
Kotlin
val spatializer = audioManager.spatializer
Java
Spatializer spatializer = AudioManager.getSpatializer();
Spatializer
değerini aldıktan sonra, cihazın uzamsal ses çıkarması için geçerli olması gereken dört koşulu kontrol edin:
Ölçütler | Kontrol Et |
---|---|
Cihaz mekansallaştırmayı destekliyor mu? |
getImmersiveAudioLevel() , SPATIALIZER_IMMERSIVE_LEVEL_NONE değil
|
Üç boyutlu ses kullanılabilir mi? Kullanılabilirlik, mevcut ses çıkışı yönlendirmesiyle uyumluluğu etkiler. |
isAvailable() değeri: true |
Mekansallaştırma etkin mi? | isEnabled() değeri: true |
Verilen parametrelere sahip bir ses parçası üç boyutlu hale getirilebilir mi? | canBeSpatialized() değeri: true |
Örneğin, mekansallaştırma yoksa bu koşullar karşılanmayabilir. veya ses çıkış cihazında tamamen devre dışı bırakılır.
Baş takibi
Platform, desteklenen kulaklıklarda sesin uzamsallığını kullanıcının kafa konumuna göre ayarlayabilir. Kafa takip cihazının
mevcut ses çıkışı yönlendirmesinde kullanılabilir,
isHeadTrackerAvailable()
.
Uyumlu içerik
Spatializer.canBeSpatialized()
, belirli özelliklere sahip sesin mevcut çıkış cihazı yönlendirmesiyle uzamsallaştırılıp uzamsallaştırılamayacağını belirtir. Bu yöntem bir AudioAttributes
ve her ikisi de bir AudioFormat
aşağıda daha ayrıntılı olarak açıklanmıştır.
AudioAttributes
AudioAttributes
nesnesi, bir ses akışının (ör. oyun sesi veya standart medya) kullanımını, oynatma davranışlarını ve içerik türünü tanımlar.
canBeSpatialized()
işlevini çağırırken Player
için ayarlanan AudioAttributes
örneğini kullanın. Örneğin,
Jetpack Media3 kitaplığını kullanıyorsanız ve
AudioAttributes
, AudioAttributes.DEFAULT
hesabını kullanın.
Üç boyutlu sesi devre dışı bırakma
İçeriğinizin zaten uzamsallaştırıldığını belirtmek için setIsContentSpatialized(true)
çağrısı yaparak sesin iki kez işlenmesini önleyin. Alternatif olarak, setSpatializationBehavior(AudioAttributes.SPATIALIZATION_BEHAVIOR_NEVER)
çağrısını yaparak uzamsallaştırma davranışını uzamsallaştırmayı tamamen devre dışı bırakacak şekilde ayarlayın.
AudioFormat
AudioFormat
nesnesi
Bir ses parçasının biçimi ve kanal yapılandırması hakkında ayrıntılar.
canBeSpatialized()
'ye iletilecek AudioFormat
öğesini örneklendirirken kodlamayı, kod çözücüden beklenen çıkış biçimiyle aynı olacak şekilde ayarlayın. Ayrıca
Kanal maskesi
kanal yapılandırmasıyla eşleşen
bir feed kullanabilirsiniz. Kullanılacak belirli değerlerle ilgili bilgi için Varsayılan uzamsallaştırma davranışı bölümüne bakın.
Spatializer
ile ilgili değişiklikleri bekleyin
Spatializer
öğesinin durumundaki değişiklikleri dinlemek için bir işleyici ekleyebilirsiniz
Spatializer.addOnSpatializerStateChangedListener()
ile.
Benzer şekilde, bir kafa hareketi izleyicinin stok durumuyla ilgili değişiklikleri dinlemek için Spatializer.addOnHeadTrackerAvailableListener()
numaralı telefonu arayın.
Bu yöntem, dinleyicinin geri çağırma işlevlerini kullanarak oynatma sırasında parça seçiminizi ayarlamak istiyorsanız yararlı olabilir. Örneğin, bir kullanıcı kendi cihazını bağladığında veya bağlantısını kestiğinde
onSpatializerAvailableChanged
adlı cihazdaki
geri çağırma, yeni
Ses çıkışı yönlendirmesi. Bu noktada, oynatıcının parça seçim mantığını cihazın yeni özellikleriyle eşleşecek şekilde güncelleyebilirsiniz. ExoPlayer'ın parça seçim davranışı hakkında ayrıntılı bilgi için ExoPlayer ve uzamsal ses bölümüne bakın.
ExoPlayer ve üç boyutlu ses
ExoPlayer'ın son sürümleri, üç boyutlu sesi kullanmayı kolaylaştırır. Şunu kullanıyorsanız:
bağımsız ExoPlayer kitaplığı (paket adı com.google.android.exoplayer2
),
2.17 sürümü, platformu üç boyutlu ses ve sürüm çıkışı sağlayacak şekilde yapılandırır
2.18 sürümünde, ses kanalı sayısı kısıtlamaları getirilmiştir.
Media3 kitaplığındaki ExoPlayer modülünü (paket adı androidx.media3
) kullanıyorsanız 1.0.0-beta01
ve sonraki sürümler aynı güncellemeleri içerir.
ExoPlayer bağımlılığınızı en son sürüme güncelledikten sonra, uygulamanız yalnızca mekana uygun hale getirilebilen içerikler bulunması gerekir.
Ses kanalı sayısı kısıtlamaları
Üç boyutlu ses için dört koşulun tamamı karşılandığında ExoPlayer, çok kanallı bir ses parçası seçer. Aksi takdirde, ExoPlayer bunun yerine bir stereo parça seçer.
Spatializer
özellikleri değişirse ExoPlayer, mevcut özelliklerle eşleşen bir ses parçası seçmek için yeni bir parça seçimi tetikler. Bu yeni parça seçiminin kısa videoya neden olabileceğini
süresi belirlenebilir.
Ses kanalı sayısı kısıtlamalarını devre dışı bırakmak için parça seçme parametrelerini ayarlayın oynatıcıda şu şekilde görünür:
Kotlin
exoPlayer.trackSelectionParameters = DefaultTrackSelector.Parameters.Builder(context) .setConstrainAudioChannelCountToDeviceCapabilities(false) .build()
Java
exoPlayer.setTrackSelectionParameters( new DefaultTrackSelector.Parameters.Builder(context) .setConstrainAudioChannelCountToDeviceCapabilities(false) .build() );
Benzer şekilde, mevcut bir kanal seçicinin parametrelerini, ses kanalı sayısı kısıtlamalarını aşağıdaki gibidir:
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() );
Ses kanalı sayısı kısıtlamaları devre dışıyken, içerikte birden fazla ses varsa parçaları kullanmak üzere, ExoPlayer başlangıçta en yüksek kanal sayısına sahip parçayı ve cihazdan oynatılabilir. Örneğin, içerikte çok kanallı bir ses kanalı ve stereo ses kanalı varsa ve cihaz her ikisinin de oynatılmasını destekliyorsa ExoPlayer çok kanallı kanalı seçer. Bu davranışın nasıl özelleştirileceği hakkında ayrıntılı bilgi için Ses parçası seçimi bölümüne bakın.
Ses parçası seçimi
ExoPlayer’ın ses kanalı sayısı kısıtlamaları devre dışı bırakıldığında, ExoPlayer otomatik olarak bir ses parçası seçmez cihazınızın ses konumu belirleyicisinin özellikleriyle eşleşen. Bunun yerine parça seçimini ayarlayarak ExoPlayer'ın parça seçme mantığını özelleştirin parametrelerini değiştirebilirsiniz. ExoPlayer varsayılan olarak MIME türü (kodlama), kanal sayısı ve örnekleme hızı açısından ilk parçayla aynı olan ses parçalarını seçer.
Parça seçim parametrelerini değiştirme
ExoPlayer'ın parça seçim parametrelerini değiştirmek için Player.setTrackSelectionParameters()
değerini kullanın.
Benzer şekilde, Player.getTrackSelectionParameters()
ile ExoPlayer'ın mevcut parametrelerini alabilirsiniz.
Örneğin, oynatma ortasında stereo ses parçası seçmek için:
Kotlin
exoPlayer.trackSelectionParameters = exoPlayer.trackSelectionParameters .buildUpon() .setMaxAudioChannelCount(2) .build()
Java
exoPlayer.setTrackSelectionParameters( exoPlayer.getTrackSelectionParameters() .buildUpon() .setMaxAudioChannelCount(2) .build() );
Oynatma sırasında parça seçme parametrelerini değiştirmek, kesintiye uğrar. Oyuncunun parkurunu ayarlama hakkında daha fazla bilgi seçim parametreleri, parça seçimi bölümünde bulabilirsiniz.
Varsayılan alanlaştırma davranışı
Android'deki varsayılan uzamsallaştırma davranışı, OEM'ler tarafından özelleştirilebilen aşağıdaki davranışları içerir:
Yalnızca çok kanallı içerikler üç boyutlu hale getirilir, stereo içerikler kullanılmaz. ExoPlayer kullanmıyorsanız, çok kanalınızın biçimine bağlı olarak maksimum kanal sayısını yapılandırmanız gerekebilir. kod çözücü tarafından çok sayıda çıktı alınabilir. Böylece proje daha Ses kod çözücü, platformun mekansalleştirilmesi için çok kanallı PCM çıkışı yapar.
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);
Kullanım örneği için ExoPlayer'ın
MediaCodecAudioRenderer.java
sayfasına bakın. OEM özelleştirmesinden bağımsız olarak Üç Boyutlu Ses özelliğini kendiniz kapatmak için Üç boyutlu sesi devre dışı bırakma başlıklı makaleyi inceleyin.AudioAttributes
:usage
USAGE_MEDIA
veyaUSAGE_GAME
olarak ayarlanmışsa ses üç boyutlu hale getirilebilir.AudioFormat
: Etiketlerden en az şu özelliklere sahip bir kanal maskesi kullanın:AudioFormat.CHANNEL_OUT_QUAD
kanallarda (ön sol, sağ ön, sol arka ve sağ arka) mekansallaştırmaya uygun olabilir. Aşağıdaki örnekte, 5.1 ses parçası içinAudioFormat.CHANNEL_OUT_5POINT1
kullanılmıştır. Stereo ses parçası içinAudioFormat.CHANNEL_OUT_STEREO
öğesini kullanın.Media3 kullanıyorsanız kanal sayısını kanal maskesine dönüştürmek için
Util.getAudioTrackChannelConfig(int channelCount)
kullanabilirsiniz.Ayrıca, kodlamayı
AudioFormat.ENCODING_PCM_16BIT
olarak ayarlayın. Kod çözücüyü çok kanallı PCM çıkışı yapacak şekilde yapılandırdıysanız.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();
Üç boyutlu sesi test etme
Test cihazınızda üç boyutlu sesin etkinleştirildiğinden emin olun:
- Kablolu kulaklıklar için Sistem ayarları > Ses ve titreşim > Üç boyutlu ses'e gidin.
- Kablosuz mikrofonlu kulaklıklarda Sistem ayarları > Bağlı cihazlar > Dişli simgesi > Üç boyutlu ses.
Mevcut yönlendirme için Üç Boyutlu Ses'in kullanılabilir olup olmadığını kontrol etmek üzere cihazınızda adb shell dumpsys audio
komutunu çalıştırın. Oynatma etkinken çıkışta aşağıdaki parametreleri görürsünüz:
Spatial audio:
mHasSpatializerEffect:true (effect present)
isSpatializerEnabled:true (routing dependent)