Üç 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 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 ekleyin.

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 uygun usage USAGE_MEDIA olarak ayarlandığında veya USAGE_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 örnekte AudioFormat.CHANNEL_OUT_5POINT1 kullanıyoruz. yeni bir 5.1 ses parçası için Stereo ses parçası için AudioFormat.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)