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“ aufUSAGE_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
- Wie im Beispiel für positionelles Audio besteht der erste Schritt darin, mit
spatialCapabilities
zu prüfen, ob Spatial Audio verfügbar ist. - Wenn Sie
contentType
aufAudioAttributes.CONTENT_TYPE_MUSIC
und die Verwendung aufAudioAttributes.USAGE_MEDIA
festlegen, behandelt das System diese Audiodatei als Surround-Sound.
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.