Üç 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 ise "üç boyutlu" surround sese benzer bir çoklu hoparlör efekti oluşturmak için ancak kulaklıkla yapabilirsiniz.
Örneğin, bir filmde arabadan gelen ses kullanıcının arkasından başlayıp ve ilerlemeye devam eder. Görüntülü sohbette sesler konuşmacıları ayırt etmeyi kolaylaştıracak şekilde, ayrılmış ve kullanıcının etrafına yerleştirilmiş haldedir.
İçeriğiniz desteklenen bir ses biçimi kullanıyorsa cihazınıza üç boyutlu ses ekleyebilirsiniz. bir uygulamaya dokunun.
Ö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
öğesini aldıktan sonra geçerli olması gereken dört koşulu kontrol edin
üç boyutlu ses çıkışını almak için doğru:
Ölçütler | Kontrol Et |
---|---|
Cihaz mekansallaştırmayı destekliyor mu? |
getImmersiveAudioLevel() , SPATIALIZER_IMMERSIVE_LEVEL_NONE değil
|
Mekanizasyon kullanılabilir mi? Özelliğin kullanılabilirliği, mevcut ses çıkışı yönlendirmesiyle uyumluluğa bağlıdır. |
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 mikrofonlu kulaklıklarda sesin duyulmasını ayarlayabilir.
kullanıcının baş konumuna göre konumlandırma. Kafa takip cihazının
mevcut ses çıkışı yönlendirmesinde kullanılabilir,
isHeadTrackerAvailable()
.
Uyumlu içerik
Spatializer.canBeSpatialized()
verilen özelliklere sahip sesin
Geçerli çıkış cihazı yönlendirmesi. 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
kullanımını açıklayan bir
ses akışı (ör. oyun sesi)
veya standart medya) kullanıyorsanız
oynatma davranışları ve içerik türü.
canBeSpatialized()
çağrısı yaparken aynı
Player
için AudioAttributes
örneği ayarlandı. Örneğin,
Jetpack Media3 kitaplığını kullanıyorsanız ve
AudioAttributes
, AudioAttributes.DEFAULT
hesabını kullanın.
Üç boyutlu ses devre dışı bırakılıyor
İçeriğinizin zaten üç boyutlu hale getirildiğini belirtmek için şu numarayı arayın:
setIsContentSpatialized(true)
böylece ses iki kez işlenmez. Alternatif olarak
mekanikleştirme davranışı ile uzamsallaştırmayı tamamen devre dışı bırakır ve
setSpatializationBehavior(AudioAttributes.SPATIALIZATION_BEHAVIOR_NEVER)
.
AudioFormat
AudioFormat
nesnesi
Bir ses parçasının biçimi ve kanal yapılandırması hakkında ayrıntılar.
canBeSpatialized()
'e aktarmak için AudioFormat
öğesini örneklendirirken,
kodlamayı ayarlayın
kod çözücüden beklenen çıkış biçimiyle aynı olacaktır. Ayrıca
Kanal maskesi
kanal yapılandırmasıyla eşleşen
bir feed kullanabilirsiniz. Daha fazla bilgi için
Varsayılan mekansallaştırma davranışı bölümüne
değerleri girin.
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, kafa takip aracının kullanılabilirliğindeki değişiklikleri dinlemek için
Spatializer.addOnHeadTrackerAvailableListener()
numaralı telefonu arayın.
Bu, oynatma sırasında parça seçiminizi ayarlamak isterseniz yararlı olabilir
geri arama özelliğini kullanabilirsiniz. Ö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 oyuncunuzun
cihazın yeni özellikleriyle eşleştirmek için seçim mantığını takip edin. Ayrıntılı bilgi için
ExoPlayer'ın parça seçme davranışı için ExoPlayer ve üç boyutlu ses bölümüne bakın
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ığından ExoPlayer modülünü kullanıyorsanız (paket adı
androidx.media3
), sürümler 1.0.0-beta01
ve daha yenileri de 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ı ses parçası. Aksi takdirde, ExoPlayer bunun yerine bir stereo parça seçer.
Spatializer
özellikleri değişirse ExoPlayer
yeni bir parça seçimi tetikler ve müzikle eşleşen bir ses parçası seçer.
için geçerli değildir. 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 ses parçası ve stereo ses parçasına sahip olmakla birlikte cihaz, ExoPlayer çok kanallı parçayı seçer. Bkz. Bu davranışın nasıl özelleştirileceğiyle ilgili ayrıntılar için Ses parçası seçimi.
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 sesi seçer MIME türü bakımından ilk parçayla aynı olan izler (kodlama), kanal sayısı ve örnek hızı.
Kanal seçimi parametrelerini değiştirme
ExoPlayer'ın parça seçimi parametrelerini değiştirmek için şunu kullanın:
Player.setTrackSelectionParameters()
.
Benzer şekilde, ExoPlayer'ın mevcut parametrelerini
Player.getTrackSelectionParameters()
.
Ö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 mekansallaştırma davranışı, aşağıdaki davranışları içerir daha fazla bilgi edinip başvurabilirsiniz:
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
uygulamasına göz atın. OEM'den bağımsız olarak, mekansallaştırmayı kendiniz kapatmak için Üç boyutlu sesi devre dışı bırakma bölümüne bakın.AudioAttributes
: Ses, üç boyutlulaştırma için uygunusage
USAGE_MEDIA
olarak ayarlandığında veyaUSAGE_GAME
.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 örnekteAudioFormat.CHANNEL_OUT_5POINT1
kullanıyoruz. yeni bir 5.1 ses parçası için Stereo ses parçası içinAudioFormat.CHANNEL_OUT_STEREO
öğesini kullanın.Media3 kullanıyorsanız
Util.getAudioTrackChannelConfig(int channelCount)
aracını kullanabilirsiniz kanal sayısını kanal maskesine dönüştürmek için kullanılır.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ıklarda Sistem ayarları > Ses ve titreşim > Üç Boyutlu ses'i tıklayın.
- Kablosuz mikrofonlu kulaklıklarda Sistem ayarları > Bağlı cihazlar > Dişli simgesi > Üç boyutlu ses.
Geçerli yönlendirme için Üç Boyutlu Ses kullanılabilirliğini kontrol etmek için
adb shell dumpsys audio
komutu ekleyebilirsiniz. Aşağıdaki ekranı görmeniz gerekir:
Oynatma etkin durumdayken çıkıştaki parametreler:
Spatial audio:
mHasSpatializerEffect:true (effect present)
isSpatializerEnabled:true (routing dependent)