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“ 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 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
- Wie im Beispiel für räumliches Audio prüfen Sie zuerst mit
getSpatialCapabilities()
, ob die Funktionen für räumliches Audio derzeit verfügbar sind. - Wenn du „contentType“ auf CONTENT_TYPE_MUSIC und „usage“ auf USAGE_MEDIA festlegst, 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 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.