Spatial Audio zu Ihrer XR-App hinzufügen

Mit den Spatial-Audio-Funktionen in Jetpack SceneCore können Sie immersive Audioerlebnisse in Ihren Android XR-Anwendungen schaffen.

Mit Spatial Audio wird simuliert, wie Nutzer Klang in einer 3D-Umgebung wahrnehmen. So entsteht der Eindruck, dass der Sound aus allen Richtungen kommt, auch von oben und unten. Das System simuliert dazu einen oder mehrere „virtuelle Lautsprecher“ an bestimmten Orten im 3D-Raum.

Bei vorhandenen Apps, die nicht für Android XR entwickelt oder für Android XR geändert wurden, wird der Ton in Android XR automatisch räumlich wiedergegeben. Wenn sich der Nutzer im Raum bewegt, wird der gesamte App-Audioinhalt über das Panel ausgegeben, auf dem die Benutzeroberfläche der App gerendert wird. Wenn beispielsweise ein Timer in einer Uhr-App abläuft, klingt es so, als käme der Ton von der Position des App-Felds. Android XR ändert den Sound automatisch, um ihn an die Position anzupassen. So wird beispielsweise die wahrgenommene Entfernung zwischen dem App-Panel und dem Nutzer die Lautstärke des Audiosignals subtil beeinflussen, um ein realistischeres Gefühl zu vermitteln.

Weitere Informationen dazu, wie vorhandene Apps räumliches Audio rendern, finden Sie auf dieser Seite unter Stereo- und Surround-Sound in Ihre App einfügen.

Wenn Sie Ihre App für XR optimieren, bietet Jetpack SceneCore Tools für die erweiterte Anpassung von Spatial Audio. Sie können Sounds 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 positionelles Audio, Stereo-, Surround-Sound und Ambisonic-Audio.

Positionelles Audio

Ein positionelles Audio kann so positioniert werden, dass es von einem bestimmten Punkt im 3D-Raum abgespielt wird. Sie können beispielsweise ein 3D-Modell eines Hundes erstellen, der in einer Ecke Ihrer virtuellen Umgebung bellt. Es können mehrere Entitäten gleichzeitig an ihren jeweiligen Positionen Geräusche ausgeben. Für die Wiedergabe von positionellem Audio müssen Dateien Mono- oder Stereodateien sein.

Räumliches Stereo und Surround-Sound

Alle Android-Media-Formate werden für positionellen, Stereo- und Surround-Sound unterstützt.

Stereo-Audio bezieht sich auf Audioformate mit zwei Kanälen. Surround-Sound bezieht sich auf Audioformate mit mehr als zwei Kanälen, z. B. 5.1-Surround-Sound oder 7.1-Surround-Sound. Die Tondaten jedes Kanals sind einem Sprecher zugeordnet. Wenn du beispielsweise Musik in Stereo abspielst, kann der linke Lautsprecherkanal andere Instrumententracks ausgeben als der rechte.

Surround-Sound wird häufig in Filmen und Fernsehsendungen verwendet, um durch die Verwendung mehrerer Lautsprecherkanäle Realismus und Immersion zu verbessern. So wird beispielsweise der Dialog oft über einen Center-Lautsprecher wiedergegeben, während das Geräusch eines fliegenden Hubschraubers nacheinander über verschiedene Kanäle wiedergegeben wird, um den Eindruck zu erwecken, dass der Hubschrauber um den 3D-Raum fliegt.

Ambisonic-Audio

Ambisonic-Audio (oder Ambisonics) ist wie eine Skybox für Audio und bietet Nutzern eine immersive Klanglandschaft. Verwenden Sie Ambisonics für Hintergrundgeräusche oder andere Szenarien, in denen Sie ein kugelförmiges Schallfeld nachbilden möchten, das den Zuhörer umgibt. Android XR unterstützt das Ambisonic-Audioformat AmbiX in Ambisonics erster, zweiter und dritter Ordnung. Wir empfehlen die Dateitypen Opus (.ogg) und PCM/Wave (.wav).

Spatial Audio mit Jetpack SceneCore verwenden

Bei der Implementierung von Spatial Audio mit Jetpack SceneCore müssen Sie prüfen, ob Spatial Audio unterstützt wird, und eine API zum Laden von Spatial Audio auswählen.

Räumliche Funktionen prüfen

Prüfe vor der Verwendung von Spatial Audio-Funktionen, ob das Session Spatial Audio unterstützt. In allen Code-Snippets in den folgenden Abschnitten werden die Funktionen geprüft, bevor versucht wird, räumliches Audio wiederzugeben.

Spatial Audio laden

Sie können eine der folgenden APIs verwenden, um räumliches Audio 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 im Voraus geladen und können wiederholt verwendet werden. So können Sie Audio für positionelles Audio laden.
  • ExoPlayer: Ideal zum Laden von Stereo- und Surround-Sound-Inhalten wie Musik und Videos. Ermöglicht auch die Medienwiedergabe im Hintergrund.
  • 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-Puffern, wenn Sie eigene Audiodateien synthetisiert oder decodiert haben.

Positionelles Audio in Ihre App einfügen

Positionelle Schallquellen werden durch PointSourceParams und eine zugehörige Entity definiert. Die Position und Ausrichtung von Entity bestimmen, wo PointSourceParams im 3D-Raum gerendert wird.

Beispiel für positionelles Audio

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

// Check spatial capabilities before using spatial audio
if (session.scene.spatialCapabilities
    .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 = PointSourceParams(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 = session,
                soundPool = soundPool,
                soundID = pointSoundId,
                params = pointSource,
                volume = maxVolume,
                priority = lowPriority,
                loop = infiniteLoop,
                rate = normalSpeed
            )
        }
    }
} else {
    // The session does not have spatial audio capabilities
}

Wichtige Informationen zum Code

  • Prüfe zuerst mit spatialCapabilities, ob Spatial Audio-Funktionen derzeit verfügbar sind.
  • Wenn Sie „contentType“ auf CONTENT_TYPE_SONIFICATION und „usage“ auf USAGE_ASSISTANCE_SONIFICATION festlegen, behandelt das System diese Audiodatei als Soundeffekt.
  • Im vorherigen Beispiel wird die Audiodatei unmittelbar vor der Verwendung in den Pool geladen, um den Code aus Gründen der Einfachheit zusammenzuhalten. Idealerweise sollten Sie alle Soundeffekte asynchron laden, während Sie Ihre App laden, damit alle Audiodateien im Pool verfügbar sind, wenn Sie sie benötigen.

Stereo- und Surround-Sound in Ihre App einfügen

Die empfohlene Methode zum Hinzufügen von Stereo- und Surround-Sound zu Ihrer App ist die Verwendung von Exoplayer. 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 relativ zu einem Center-Lautsprecher um den Nutzer herum in einer Standardkonfiguration der ITU positioniert und ausgerichtet.

Standardmäßig befindet sich der Center-Kanal-Lautsprecher auf der mainPanelEntity der App. Dazu gehören auch mobile Apps, deren Audioinhalte automatisch von Android XR räumlich wiedergegeben werden.

Bei Stereo ist die Lautsprecheranordnung ähnlich wie bei Surround-Sound, nur dass sich die linken und rechten Kanäle jeweils auf der linken und rechten Seite des Panels befinden.

Wenn Sie mehrere Panels haben und auswählen möchten, über welches Panel Audio ausgegeben wird, oder wenn Sie möchten, dass Stereo- oder Surround-Audio relativ zu einem anderen Entity gerendert wird, können Sie mit dem PointSourceAttributes die Position des Center-Kanals definieren. Die verbleibenden Channels werden wie zuvor beschrieben platziert. In diesen Fällen müssen Sie auch MediaPlayer verwenden.

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

Wenn du MediaPlayer oder ExoPlayer so konfiguriert hast, dass die Wiedergabe von Stereo- oder Surround-Sound im Hintergrund fortgesetzt wird, ändert sich die Positionierung der virtuellen Lautsprecher, wenn die App in den Hintergrund verschoben wird. Da es kein Panel oder einen anderen Punkt im Raum gibt, an dem der Sound verankert werden kann, bewegt sich das räumliche Audio mit dem Nutzer (es ist also „kopfbezogen“).

Beispiel für Surround-Sound

Im folgenden Beispiel wird eine 5.1-Audiodatei mit MediaPlayer geladen und der mittlere Kanal der Datei wird auf Entity festgelegt.

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

    val pointSourceAttributes = PointSourceParams(session.scene.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.setPointSourceParams(
        session,
        mediaPlayer,
        pointSourceAttributes
    )

    mediaPlayer.setAudioAttributes(audioAttributes)
    mediaPlayer.prepare()
    mediaPlayer.start()
} else {
    // The session does not have spatial audio capabilities
}

Wichtige Informationen zum Code

Ambisonic-Schallfelder in Ihre App einfügen

Am einfachsten lassen sich ambisonische Schallfelder wiedergeben, indem Sie die Datei mit einem MediaPlayer laden. Da sich Ambisonic-Sound auf die gesamte Klanglandschaft bezieht, müssen Sie keine Entity angeben, um eine Position anzugeben. Stattdessen erstellen Sie eine Instanz von SoundFieldAttributes mit der entsprechenden Ambisonic-Ordnung, die die Anzahl der Kanäle angibt.

Beispiel für Ambionics

Im folgenden Beispiel wird ein ambisonisches Schallfeld mit MediaPlayer wiedergegeben.

// Check spatial capabilities before using spatial audio
if (session.scene.spatialCapabilities.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(
        session,
        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 besteht der erste Schritt darin, mit hasCapability() zu prüfen, ob Spatial Audio-Funktionen verfügbar sind.
  • Die contentType und die Nutzung dienen nur zu Informationszwecken.
  • AMBISONICS_ORDER_FIRST_ORDER signalisiert SceneCore, dass in der Soundfield-Datei vier Kanäle definiert sind.