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 passt den Ton automatisch an, um die Position realistisch zu gestalten. So wirkt sich beispielsweise die wahrgenommene Entfernung zwischen dem App-Steuerfeld und dem Nutzer subtil auf die Audiolautstärke aus, um für mehr Realismus zu sorgen.
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-Sound 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 verwenden, 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 einem einzelnen Sprecher zugeordnet. 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 wird beispielsweise der Dialog oft über einen Lautsprecherkanal in der Mitte 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 den räumlichen Klang verwenden, prüfen Sie, ob die Session
räumlichen Klang 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 PointSourceParams
und eine zugehörige Entity
definiert. Die Position und Ausrichtung der Entity
bestimmt, wo die PointSourceParams
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 (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 die Spatial Audio-Funktionen derzeit verfügbar sind. - Wenn du „contentType“ auf
CONTENT_TYPE_SONIFICATION
und „usage“ aufUSAGE_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 befindet sich der Lautsprecher für den Center-Kanal auf der mainPanelEntity
der App. 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 Bedienfelds befinden.
Wenn Sie mehrere Panels haben und auswählen möchten, welches Panel Audio ausgibt, oder wenn das Stereo- oder Surround-Audio relativ zu einem anderen Entity
gerendert werden soll, können Sie mit dem PointSourceAttributes
den Standort 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-Sound-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 (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 räumliches Audio prüfen Sie zuerst mit
spatialCapabilities
, ob die Funktionen für räumliches Audio verfügbar sind. - Wenn du
contentType
auf (/reference/android/media/AudioAttributes#CONTENT_TYPE_MUSIC)18 und „Nutzung“ auf (/reference/android/media/AudioAttributes#USAGE_MEDIA)16 setzt, behandelt das System diese Audiodatei als Surround-Sound.
Ihrer App Ambisonic-Tonfelder hinzufügen
Die einfachste Möglichkeit, Ambisonic-Tonfelder abzuspielen, besteht darin, die Datei mit einem MediaPlayer
zu laden. Da sich der 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 (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 prüfen Sie zuerst mit
hasCapability()
, ob die Funktionen für Spatial Audio verfügbar sind. - Die
contentType
und die Nutzung dienen nur zu Informationszwecken. - Das
AMBISONICS_ORDER_FIRST_ORDER
signalisiert SceneCore, dass die Datei mit dem Audiofeld vier Kanäle definiert.