Üç Boyutlu Ses

Üç 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 veya USAGE_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çin AudioFormat.CHANNEL_OUT_5POINT1 kullanılmıştır. Stereo ses parçası için AudioFormat.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)