Spatial Audio zu Ihrer XR-App hinzufügen

Mit den Funktionen für räumlichen Audio in Jetpack SceneCore können Sie in Ihren Android XR-Anwendungen ein immersives Audioerlebnis schaffen.

Mit dem räumlichen Audio wird simuliert, wie Nutzer den Ton in einer 3D-Umgebung wahrnehmen. Es entsteht der Eindruck, dass der Ton aus allen Richtungen kommt, auch über und unter dem Nutzer. Dazu simuliert das System einen oder mehrere „virtuelle Lautsprecher“ an bestimmten Stellen im 3D-Raum.

Bei vorhandenen Apps, die nicht für Android XR entwickelt oder angepasst wurden, wird der Audioinhalt in Android XR automatisch räumlich lokalisiert. Wenn sich der Nutzer in seinem Zuhause bewegt, wird der gesamte App-Audioinhalt über das Steuerfeld wiedergegeben, auf dem die Benutzeroberfläche der App gerendert wird. Wenn beispielsweise ein Timer einer Uhren-App klingelt, klingt der Ton, als würde er von der Position des App-Steuerfelds kommen. Android XR ändert den Ton automatisch, um die Position realistisch zu gestalten. So wirkt sich beispielsweise die wahrgenommene Entfernung zwischen dem App-Steuerfeld und dem Nutzer subtil auf die Lautstärke des Audiosignals aus, um einen realistischeren Eindruck zu vermitteln.

Weitere Informationen dazu, wie vorhandene Apps räumlichen Audioinhalt rendern, finden Sie auf dieser Seite unter Ihrer App Stereo- und Surround-Sound hinzufügen.

Wenn Sie Ihre App für XR optimieren, bietet Jetpack SceneCore Tools für die erweiterte Anpassung von räumlichem Audio. Sie können Geräusche präzise in der 3D-Umgebung positionieren, Ambisonic-Audio für realistische Klangfelder verwenden und die integrierte Surround-Sound-Integration nutzen.

Arten von Spatial Audio in Android XR

Android XR unterstützt Positions-, Stereo-, Surround- und Ambisonic-Audio.

Positionales Audio

Positionales Audio kann so positioniert werden, dass es von einem bestimmten Punkt im 3D-Raum wiedergegeben wird. Sie können beispielsweise ein 3D‑Modell eines Hundes haben, der in der Ecke Ihrer virtuellen Umgebung bellt. Es können mehrere Entitäten vorhanden sein, die von ihren jeweiligen Positionen aus Geräusche ausgeben. Für das Rendern von Positionsaudio müssen die Dateien Mono- oder Stereoformat haben.

Raumklang und Surround-Sound

Alle Android-Medienformate werden für räumlichen, Stereo- und Surround-Sound unterstützt.

Stereoaudio bezieht sich auf Audioformate mit zwei Kanälen und Surround-Sound auf Audioformate mit mehr als zwei Kanälen, z. B. 5.1-Surround-Sound oder 7.1-Surround-Sound. Die Audiodaten jedes Kanals sind mit einem Lautsprecher verknüpft. Wenn Sie beispielsweise Musik in Stereo abspielen, kann der linke Lautsprecherkanal andere Instrumententracks als der rechte ausgeben.

Surround-Sound wird häufig in Filmen und Fernsehsendungen verwendet, um durch mehrere Lautsprecherkanäle den Realismus und die Immersion zu verbessern. So werden Dialoge beispielsweise oft über einen Mittellautsprecherkanal wiedergegeben, während für den Flug eines Hubschraubers verschiedene Kanäle nacheinander verwendet werden können, um den Eindruck zu erwecken, dass der Hubschrauber durch den 3D-Raum fliegt.

Ambisonic Audio

Ambisonic-Audio (oder Ambisonics) ist wie eine Skybox für Audio und bietet Nutzern ein immersives Klangbild. Verwenden Sie Ambisonics für Hintergrundgeräusche oder andere Szenarien, in denen Sie ein vollkugelförmiges Klangfeld nachbilden möchten, das den Hörer umgibt. Android XR unterstützt das Ambisonic-Audioformat AmbiX in First-, Second- und Third-Order-Ambisonics. Wir empfehlen die Dateitypen Opus (.ogg) und PCM/Wave (.wav).

Spatial Audio mit Jetpack SceneCore verwenden

Wenn Sie Spatial Audio mit Jetpack SceneCore implementieren, müssen Sie nach Spatial Audio-Funktionen suchen und eine API zum Laden von Spatial Audio auswählen.

Geografische Funktionen prüfen

Bevor Sie die Funktionen für Spatial Audio verwenden, prüfen Sie, ob die Session Spatial Audio unterstützt. In allen Code-Snippets in den folgenden Abschnitten werden die Funktionen geprüft, bevor versucht wird, den Raumklang abzuspielen.

Spatial Audio laden

Sie können eine der folgenden APIs verwenden, um räumlichen Audioinhalt für die Verwendung in Jetpack SceneCore zu laden.

  • SoundPool: Ideal für kurze Soundeffekte mit einer Größe von weniger als 1 MB. Sie werden vorab geladen und können wiederholt verwendet werden. Das ist eine gute Möglichkeit, Audioinhalte für Positionsaudio zu laden.
  • ExoPlayer: Ideal zum Laden von Stereo- und Surround-Sound-Inhalten wie Musik und Video. Ermöglicht auch die Hintergrundwiedergabe von Medien.
  • MediaPlayer: Bietet die einfachste Möglichkeit, Ambisonic-Audio zu laden.
  • AudioTrack: Bietet die größte Kontrolle darüber, wie Audiodaten geladen werden. Ermöglicht das direkte Schreiben von Audio-Buffers oder das Synthetisieren oder Dekodieren eigener Audiodateien.

Ihrer App Positionsaudio hinzufügen

Positionelle Audioquellen werden durch PointSourceAttributes und eine zugehörige Entity definiert. Die Position und Ausrichtung der Entity bestimmt, wo die PointSourceAttribute im 3D-Raum gerendert wird.

Beispiel für Positionsaudio

Im folgenden Beispiel wird eine Audiodatei mit einem Soundeffekt in einen Soundpool geladen und an der Position der Entity wiedergegeben.

// Check spatial capabilities before using spatial audio
if (xrSession.getSpatialCapabilities().hasCapability(SpatialCapabilities.SPATIAL_CAPABILITY_SPATIAL_AUDIO)) {
    // The session has spatial audio capabilities

    val maxVolume = 1F
    val lowPriority = 0
    val infiniteLoop = -1
    val normalSpeed = 1F

    val soundPool = SoundPool.Builder()
        .setAudioAttributes(
            AudioAttributes.Builder()
                .setContentType(CONTENT_TYPE_SONIFICATION)
                .setUsage(USAGE_ASSISTANCE_SONIFICATION)
                .build()
        )
        .build()

    val pointSource = PointSourceAttributes(entity)

    val soundEffect = appContext.assets.openFd("sounds/tiger_16db.mp3")
    val pointSoundId = soundPool.load(soundEffect, lowPriority)

    soundPool.setOnLoadCompleteListener{ soundPool, sampleId, status ->
        //wait for the sound file to be loaded into the soundPool
        if (status == 0){

            SpatialSoundPool.play(
                session = xrSession,
                soundPool = soundPool,
                soundID = pointSoundId,
                attributes = pointSource,
                volume = maxVolume,
                priority = lowPriority,
                loop = infiniteLoop,
                rate = normalSpeed
            )
        }
    }
} else {
    // The session does not have spatial audio capabilities
}

Wichtige Informationen zum Code

  • Prüfen Sie zuerst mit getSpatialCapabilities(), ob die Spatial Audio-Funktionen derzeit verfügbar sind.
  • Wenn du „contentType“ auf CONTENT_TYPE_SONIFICATION und „usage“ auf USAGE_ASSISTANCE_SONIFICATION festlegst, behandelt das System diese Audiodatei als Soundeffekt.
  • Im vorherigen Beispiel wird die Audiodatei direkt vor der Verwendung in den Pool geladen, um den Code übersichtlicher zu gestalten. Idealerweise sollten Sie alle Soundeffekte asynchron laden, während Sie Ihre App laden, damit alle Audiodateien bei Bedarf im Pool verfügbar sind.

Stereo- und Surround-Sound zu Ihrer App hinzufügen

Wir empfehlen, für Stereo- und Surround-Sound die Funktion Exoplayer zu verwenden. Weitere Informationen zur Verwendung von Spatial Audio mit Exoplayer findest du im Leitfaden zu Spatial Audio.

Positionierung von Stereo- und Surround-Sound-Lautsprechern

Bei der Positionierung von Surround-Sound-Lautsprechern werden die virtuellen Surround-Sound-Lautsprecher in einer standardmäßigen ITU-Konfiguration um den Nutzer herum platziert und relativ zu einem Mittellautsprecher ausgerichtet.

Standardmäßig wird der Lautsprecher für den Center-Kanal im mainPanelEntity der App platziert. Dazu gehören auch mobile Apps, bei denen der Audioinhalt automatisch von Android XR lokalisiert wird.

Bei Stereo ist die Lautsprecherplatzierung ähnlich wie bei Surround-Sound, mit der Ausnahme, dass sich nur die linken und rechten Kanäle jeweils links und rechts des Steuerfelds befinden.

Wenn Sie mehrere Panels haben und auswählen möchten, welches Panel Audio ausgibt, oder wenn das Stereo- oder Surround-Audio relativ zu einer anderen Entity gerendert werden soll, können Sie mit PointSourceAttributes die Position des Mittelkanals definieren. Die übrigen Kanäle werden wie bereits erwähnt platziert. In diesen Fällen müssen Sie auch MediaPlayer verwenden.

Wenn sich der Nutzer im Raum bewegt, bewegen und passen sich die virtuellen Stereo- und Surround-Lautsprecher an, damit sie immer in einer optimalen Position sind.

Wenn Sie MediaPlayer oder ExoPlayer so konfiguriert haben, dass Stereo- oder Surround-Sound im Hintergrund weiter abgespielt wird, wird die Positionierung der virtuellen Lautsprecher geändert, wenn die App im Hintergrund ausgeführt wird. Da es kein Panel oder einen anderen Punkt im Raum gibt, an dem der Ton verankert werden kann, bewegt sich der räumliche Audiotrack mit dem Nutzer. Mit anderen Worten: Er ist „auf den Kopf ausgerichtet“.

Beispiel für Surround-Sound

Im folgenden Beispiel wird eine 5.1-Audiodatei mit MediaPlayer geladen und der Mittelkanal der Datei als Entity festgelegt.

// Check spatial capabilities before using spatial audio
if (xrSession.getSpatialCapabilities().hasCapability(SpatialCapabilities.SPATIAL_CAPABILITY_SPATIAL_AUDIO)) {
    // The session has spatial audio capabilities

    val pointSourceAttributes = PointSourceAttributes(xrSession.mainPanelEntity)

    val mediaPlayer = MediaPlayer()

    val fivePointOneAudio = appContext.assets.openFd("sounds/aac_51.ogg")
    mediaPlayer.reset()
    mediaPlayer.setDataSource(fivePointOneAudio)

    val audioAttributes =
        AudioAttributes.Builder()
            .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
            .setUsage(AudioAttributes.USAGE_MEDIA)
            .build()

    SpatialMediaPlayer.setPointSourceAttributes(
        xrSession,
        mediaPlayer,
        pointSourceAttributes)

    mediaPlayer.setAudioAttributes(audioAttributes)
    mediaPlayer.prepare()
    mediaPlayer.start()

} else {
    // The session does not have spatial audio capabilities
}

Wichtige Informationen zum Code

Ihrer App Ambisonic-Tonfelder hinzufügen

Die einfachste Möglichkeit, Ambisonic-Tonfelder abzuspielen, besteht darin, die Datei mit einem MediaPlayer zu laden. Da sich Ambisonic-Sound auf das gesamte Klangbild bezieht, musst du keine Entity angeben, um eine Position anzugeben. Stattdessen erstellst du eine Instanz von SoundFieldAttributes mit der entsprechenden Ambisonic-Reihenfolge, in der die Anzahl der Kanäle angegeben ist.

Beispiel für Ambionics

Im folgenden Beispiel wird ein ambisonisches Klangfeld mit MediaPlayer wiedergegeben.

// Check spatial capabilities before using spatial audio
if (xrSession.getSpatialCapabilities().hasCapability(SpatialCapabilities.SPATIAL_CAPABILITY_SPATIAL_AUDIO)) {
    // The session has spatial audio capabilities

    val soundFieldAttributes =
        SoundFieldAttributes(SpatializerConstants.AMBISONICS_ORDER_FIRST_ORDER)

    val mediaPlayer = MediaPlayer()

    val soundFieldAudio = appContext.assets.openFd("sounds/foa_basketball_16bit.wav")

    mediaPlayer.reset()
    mediaPlayer.setDataSource(soundFieldAudio)

    val audioAttributes =
        AudioAttributes.Builder()
            .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
            .setUsage(AudioAttributes.USAGE_MEDIA)
            .build()

    SpatialMediaPlayer.setSoundFieldAttributes(
        xrSession,
        mediaPlayer,
        soundFieldAttributes)

    mediaPlayer.setAudioAttributes(audioAttributes)
    mediaPlayer.prepare()
    mediaPlayer.start()

} else {
    // The session does not have spatial audio capabilities
}

Wichtige Informationen zum Code

  • Wie bei den vorherigen Snippets prüfen Sie zuerst mit getSpatialCapabilities(), ob die Spatial Audio-Funktionen derzeit verfügbar sind.
  • Die Angaben zu „contentType“ und „usage“ dienen nur zu Informationszwecken.
  • Das AMBISONICS_ORDER_FIRST_ORDER signalisiert SceneCore, dass die Datei für das Klangfeld vier Kanäle definiert.