Audio Spasial

Audio Spasial adalah pengalaman audio imersif yang menempatkan pengguna di game, membuat konten Anda terdengar lebih realistis. Suaranya "dispasialisasi" untuk membuat efek multi-speaker, mirip dengan suara surround pengaturan, tetapi melalui headphone.

Misalnya, di film, suara dari mobil mungkin dimulai dari belakang pengguna, bergerak maju, dan pergi ke kejauhan. Di obrolan video, suara dapat dipisahkan dan ditempatkan di sekitar pengguna, sehingga memudahkan mengidentifikasi pembicara.

Jika konten Anda menggunakan format audio yang didukung, Anda dapat menambahkan audio spasial ke aplikasi dimulai dengan Android 13 (API level 33).

Mengkueri kemampuan

Gunakan class Spatializer untuk mengkueri kemampuan dan perilaku spasial perangkat. Mulai dengan mengambil instance Spatializer dari AudioManager:

Kotlin

val spatializer = audioManager.spatializer

Java

Spatializer spatializer = AudioManager.getSpatializer();

Setelah Anda mendapatkan Spatializer, periksa empat kondisi yang harus dipertahankan benar (true) agar perangkat menghasilkan audio spasial:

Kriteria Cek
Apakah perangkat mendukung spasialisasi? getImmersiveAudioLevel() bukan SPATIALIZER_IMMERSIVE_LEVEL_NONE
Apakah spasial tersedia?
Ketersediaan bergantung pada kompatibilitas dengan pemilihan rute output audio saat ini.
isAvailable() adalah true
Apakah spasial diaktifkan? isEnabled() adalah true
Dapatkah trek audio dengan parameter yang diberikan dispasialisasi? canBeSpatialized() adalah true

Kondisi ini mungkin tidak terpenuhi, misalnya, jika spasial tidak tersedia untuk trek audio saat ini atau dinonaktifkan pada perangkat output audio sepenuhnya.

Pelacakan gerak kepala

Dengan headset yang didukung, platform dapat menyesuaikan spasial berdasarkan posisi kepala pengguna. Untuk memeriksa apakah pelacak kepala yang tersedia untuk perutean output audio saat ini, panggil isHeadTrackerAvailable()

Konten yang kompatibel

Spatializer.canBeSpatialized() menunjukkan apakah audio dengan properti yang diberikan dapat dispasialisasi dengan {i>routing<i} perangkat {i>output<i} saat ini. Metode ini memerlukan AudioAttributes dan AudioFormat, yang keduanya yang dijelaskan secara lebih detail di bawah ini.

AudioAttributes

Objek AudioAttributes mendeskripsikan penggunaan streaming audio (misalnya, audio game atau media standar), beserta perilaku pemutaran dan jenis kontennya.

Saat memanggil canBeSpatialized(), gunakan metode Instance AudioAttributes sebagaimana ditetapkan untuk Player. Misalnya, jika Anda menggunakan library Jetpack Media3 dan belum menyesuaikan AudioAttributes, gunakan AudioAttributes.DEFAULT.

Menonaktifkan audio spasial

Untuk menunjukkan bahwa konten Anda telah dispasialisasi, panggil setIsContentSpatialized(true) sehingga audio tidak diproses dua kali. Atau, sesuaikan perilaku spasial untuk menonaktifkan sepenuhnya spasial dengan memanggil setSpatializationBehavior(AudioAttributes.SPATIALIZATION_BEHAVIOR_NEVER)

AudioFormat

Objek AudioFormat menjelaskan detail tentang format dan konfigurasi saluran trek audio.

Saat membuat instance AudioFormat untuk diteruskan ke canBeSpatialized(), setel encoding sama dengan format output yang diharapkan dari decoder. Anda juga harus mengatur masker channel yang cocok dengan konfigurasi channel konten Anda. Lihat Bagian Perilaku spasial default untuk panduan tentang menggunakan nilai-nilai spesifik.

Memproses perubahan pada Spatializer

Untuk memproses perubahan status Spatializer, Anda dapat menambahkan pemroses dengan Spatializer.addOnSpatializerStateChangedListener(). Demikian pula, untuk mendengarkan perubahan ketersediaan {i>head tracker<i}, panggil Spatializer.addOnHeadTrackerAvailableListener().

Opsi ini berguna jika Anda ingin menyesuaikan pilihan trek selama pemutaran menggunakan callback pemroses. Misalnya, saat pengguna menghubungkan atau memutuskan koneksi headset dari perangkat, onSpatializerAvailableChanged menunjukkan apakah efek spatializer tersedia untuk pemilihan rute output audio. Pada tahap ini, Anda dapat mempertimbangkan untuk memperbarui melacak logika pemilihan agar sesuai dengan kemampuan baru perangkat. Untuk mengetahui detail tentang Perilaku pemilihan trek ExoPlayer, merujuk pada ExoPlayer dan audio spasial bagian.

ExoPlayer dan audio spasial

Rilis terbaru ExoPlayer memudahkan pengadopsian audio spasial. Jika Anda menggunakan library ExoPlayer mandiri (nama paket com.google.android.exoplayer2), versi 2.17 mengonfigurasi platform untuk menghasilkan audio spasial, dan versi 2.18 memperkenalkan batasan jumlah saluran audio. Jika Anda menggunakan modul ExoPlayer dari library Media3, (nama paket androidx.media3), versi 1.0.0-beta01 dan yang lebih baru menyertakan pembaruan yang sama.

Setelah memperbarui dependensi ExoPlayer ke rilis terbaru, aplikasi Anda cukup perlu menyertakan konten yang dapat dispasialisasi.

Batasan jumlah channel audio

Saat keempat kondisi untuk audio spasial terpenuhi, ExoPlayer akan memilih trek audio multi-saluran. Jika tidak, ExoPlayer memilih trek stereo. Jika properti Spatializer berubah, ExoPlayer akan memicu pemilihan trek baru untuk memilih trek audio yang cocok dengan properti saat ini. Perhatikan bahwa pemilihan trek baru ini dapat menyebabkan periode buffer ulang.

Untuk menonaktifkan batasan jumlah channel audio, tetapkan parameter pemilihan trek pada pemutar seperti yang ditunjukkan di bawah ini:

Kotlin

exoPlayer.trackSelectionParameters = DefaultTrackSelector.Parameters.Builder(context)
  .setConstrainAudioChannelCountToDeviceCapabilities(false)
  .build()

Java

exoPlayer.setTrackSelectionParameters(
  new DefaultTrackSelector.Parameters.Builder(context)
    .setConstrainAudioChannelCountToDeviceCapabilities(false)
    .build()
);

Demikian pula, Anda dapat memperbarui parameter pemilih trek yang ada untuk menonaktifkan batasan jumlah channel audio sebagai berikut:

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()
);

Dengan batasan jumlah channel audio dinonaktifkan, jika konten memiliki beberapa audio ExoPlayer, ExoPlayer awalnya memilih jalur yang memiliki jumlah saluran tertinggi dan dapat diputar dari perangkat. Misalnya, jika konten berisi trek audio multisaluran dan trek audio stereo, serta perangkat mendukung pemutaran keduanya, ExoPlayer memilih jalur multi-saluran. Lihat Pemilihan trek audio untuk mengetahui detail tentang cara menyesuaikan perilaku ini.

Pilihan trek audio

Saat batasan jumlah saluran audio ExoPlayer dinonaktifkan, ExoPlayer tidak secara otomatis memilih trek audio yang sesuai dengan properti spasial perangkat. Sebagai gantinya, Anda dapat menyesuaikan logika pemilihan trek ExoPlayer dengan mengatur pemilihan trek sebelum atau selama pemutaran. Secara default, ExoPlayer memilih audio trek yang sama dengan trek awal yang terkait dengan jenis MIME (encoding), jumlah channel, dan frekuensi sampel.

Mengubah parameter pemilihan trek

Untuk mengubah parameter pemilihan trek ExoPlayer, gunakan Player.setTrackSelectionParameters() Demikian juga, Anda bisa mendapatkan parameter ExoPlayer saat ini dengan Player.getTrackSelectionParameters() Misalnya, untuk memilih trek audio stereo di tengah pemutaran:

Kotlin

exoPlayer.trackSelectionParameters = exoPlayer.trackSelectionParameters
  .buildUpon()
  .setMaxAudioChannelCount(2)
  .build()

Java

exoPlayer.setTrackSelectionParameters(
  exoPlayer.getTrackSelectionParameters()
    .buildUpon()
    .setMaxAudioChannelCount(2)
    .build()
);

Perhatikan bahwa mengubah parameter pemilihan trek di tengah pemutaran dapat menyebabkan gangguan pada pemutaran. Informasi selengkapnya tentang cara menyesuaikan trek pemain parameter pilihan tersedia di pemilihan trek dari dokumen ExoPlayer.

Perilaku spasial default

Perilaku spasial default di Android menyertakan perilaku berikut yang dapat disesuaikan oleh OEM:

  • Hanya konten multisaluran yang dispasialisasi, bukan konten stereo. Jika Anda tidak menggunakan ExoPlayer, bergantung pada format multi-saluran Anda konten audio, Anda mungkin perlu mengonfigurasi jumlah maksimum channel yang dapat dihasilkan oleh decoder audio ke jumlah besar. Hal ini memastikan bahwa decoder audio menghasilkan PCM multi-saluran untuk spasial platform.

    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);
    

    Untuk contoh penerapan, lihat MediaCodecAudioRenderer.java ExoPlayer. Untuk menonaktifkan spasialisasi sendiri, terlepas dari OEM penyesuaian, lihat Menonaktifkan audio spasial.

  • AudioAttributes: Audio memenuhi syarat untuk spasial jika usage ditetapkan ke USAGE_MEDIA atau USAGE_GAME.

  • AudioFormat: Gunakan mask channel yang berisi setidaknya AudioFormat.CHANNEL_OUT_QUAD saluran (kiri depan, kanan depan, kiri belakang, dan kanan belakang) untuk audio memenuhi syarat untuk spasialisasi. Dalam contoh di bawah, kami menggunakan AudioFormat.CHANNEL_OUT_5POINT1 untuk trek audio 5.1. Untuk trek audio stereo, gunakan AudioFormat.CHANNEL_OUT_STEREO.

    Jika menggunakan Media3, Anda dapat menggunakan Util.getAudioTrackChannelConfig(int channelCount) untuk mengonversi jumlah saluran menjadi {i>channel mask<i}.

    Selain itu, setel encoding ke AudioFormat.ENCODING_PCM_16BIT jika Anda telah mengonfigurasi decoder untuk menghasilkan output PCM multi-saluran.

    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();
    

Uji audio spasial

Pastikan audio spasial diaktifkan di perangkat pengujian Anda:

  • Untuk headset berkabel, buka Setelan sistem > Suara & getaran > Spasial audio.
  • Untuk headset nirkabel, buka Setelan sistem > Perangkat terhubung > Ikon roda gigi untuk perangkat nirkabel Anda > Audio spasial.

Untuk memeriksa ketersediaan Audio Spasial untuk perutean saat ini, jalankan Perintah adb shell dumpsys audio di perangkat. Anda akan melihat tampilan berikut parameter dalam output saat pemutaran aktif:

Spatial audio:
mHasSpatializerEffect:true (effect present)
isSpatializerEnabled:true (routing dependent)