תכונות האודיו המרחבי ב-Jetpack SceneCore מאפשרות לכם ליצור חוויות אודיו סוחפות באפליקציות Android XR.
באודיו מרחבי, המערכת מדמה את האופן שבו משתמשים תופסים צליל בסביבה תלת-ממדית. הטכנולוגיה הזו יוצרת תחושה של צליל שמגיע מכל הכיוונים, כולל מלמעלה ומלמטה. המערכת עושה את זה על ידי סימולציה של רמקול וירטואלי אחד או יותר במיקומים ספציפיים במרחב תלת-ממדי.
באפליקציות קיימות שלא תוכננו ל-Android XR או שלא בוצעו בהן שינויים כדי להתאים אותן ל-Android XR, האודיו עובר אוטומטית התאמה מרחבית ב-Android XR. כשהמשתמש נע במרחב, כל האודיו של האפליקציה יופק מהחלונית שבה ממשק המשתמש של האפליקציה מוצג. לדוגמה, אם הטיימר מצלצל באפליקציית שעון, האודיו יישמע כאילו הוא מגיע מהמיקום של חלונית האפליקציה. Android XR ישנה את הסאונד באופן אוטומטי כדי ליצור תחושה מציאותית של מיקום. לדוגמה, המרחק הנתפס בין חלונית האפליקציה לבין המשתמש ישפיע באופן עדין על עוצמת הקול של האודיו, כדי ליצור תחושה מציאותית יותר.
מידע נוסף על אופן ההצגה של אודיו מרחבי באפליקציות קיימות זמין במאמר הוספת סטריאו וצליל סראונד לאפליקציה בדף הזה.
אם אתם מבצעים אופטימיזציה של האפליקציה ל-XR, Jetpack SceneCore מספק כלים להתאמה אישית מתקדמת של אודיו מרחבי. אתם יכולים למקם צלילים בצורה מדויקת בסביבה תלת-ממדית, להשתמש באודיו אמביסוני כדי ליצור שדות צליל מציאותיים וליהנות משילוב מובנה של צליל סראונד.
סוגים של אודיו מרחבי שזמינים ב-Android XR
Android XR תומך באודיו מיקומי, סטריאו, צליל סראונד ואמביסוניק.
אודיו מיקומי
אפשר למקם אודיו מרחבי כך שיפעל מנקודה ספציפית במרחב תלת-ממדי. לדוגמה, אתם יכולים להציג מודל תלת-ממדי של כלב נובח בפינה של הסביבה הווירטואלית. יכולות להיות כמה ישויות שמשמיעות צליל מכל אחד מהמיקומים שלהן. כדי לעבד אודיו מרחבי, הקבצים צריכים להיות מונו או סטריאו.
סטריאו מרחבי וצליל סראונד
כל פורמטי המדיה של Android נתמכים באודיו מרחבי, סטריאו וצליל סראונד. בנוסף לפורמטים האלה, מכשירי Android XR עשויים לתמוך בפורמטים של אודיו Dolby Atmos, Dolby Digital ו-Dolby Digital+.
אודיו סטריאו מתייחס לפורמטים של אודיו עם שני ערוצים, וצליל סראונד מתייחס לפורמטים של אודיו עם יותר משני ערוצים, כמו צליל סראונד 5.1 או צליל סראונד 7.1. נתוני הסאונד של כל ערוץ משויכים לרמקול אחד. לדוגמה, כשמנגנים מוזיקה בסטריאו, יכול להיות שערוץ הרמקול השמאלי ישמיע טראקים שונים של כלי נגינה מערוץ הרמקול הימני.
בדרך כלל משתמשים בצליל סראונד בסרטים ובתוכניות טלוויזיה כדי לשפר את הריאליזם ואת חוויית הצפייה באמצעות שימוש בערוצי רמקולים מרובים. לדוגמה, דיאלוגים מושמעים בדרך כלל מערוץ הרמקול המרכזי, בעוד שצליל של מסוק שטס יכול להשתמש בערוצים שונים ברצף כדי ליצור את התחושה שהמסוק טס במרחב התלת-ממדי שלכם.
אודיו אמביסוני
אודיו אמביסוניק (או אמביסוניקס) הוא כמו תא צפייה לאודיו,
שמספק למשתמשים סביבת צליל סוחפת. אפשר להשתמש באמביסוניקס לצלילי סביבה ברקע או בתרחישים אחרים שבהם רוצים לשכפל שדה צליל כדורי מלא שמקיף את המאזין. Android XR תומך בפורמט האודיו האמביסוני AmbiX באמביסוניקס מסדר ראשון, שני ושלישי. אנחנו ממליצים על סוגי הקבצים Opus (.ogg) ו-PCM/Wave (.wav).
שימוש באודיו מרחבי עם Jetpack SceneCore
כדי להטמיע אודיו מרחבי באמצעות Jetpack SceneCore, צריך לבדוק את היכולות המרחביות ולבחור API לטעינת אודיו מרחבי.
בדיקה של יכולות מרחביות
לפני שמשתמשים בתכונות של אודיו מרחבי, צריך לוודא שהמכשיר Session תומך באודיו מרחבי. בכל קטעי הקוד בקטעים הבאים, מתבצעת בדיקה של היכולות לפני שמנסים להפעיל אודיו מרחבי.
טעינת אודיו מרחבי
אפשר להשתמש בכל אחד מממשקי ה-API הבאים כדי לטעון אודיו מרחבי לשימוש ב-Jetpack SceneCore.
-
SoundPool: מתאים לאפקטים קצרים של צלילים שגודלם קטן מ-1MB. הם נטענים מראש ואפשר להשתמש בצלילים שוב ושוב. זו דרך מצוינת לטעון אודיו לאודיו מרחבי. -
ExoPlayer: מתאים לטעינת תוכן סטריאו וסראונד כמו מוזיקה וסרטונים. היא מאפשרת גם הפעלת מדיה ברקע. -
MediaPlayer: הדרך הכי פשוטה לטעון אודיו אמביסוני. -
AudioTrack: מאפשר שליטה רבה יותר באופן טעינת נתוני האודיו. מאפשרת לכתוב ישירות מאגרי אודיו, או אם ביצעתם סינתזה או פענוח של קובצי אודיו משלכם.
בדיקה של תמיכה בפורמט מדיה
פלטפורמת Android תומכת בחלק מפורמטי המדיה. עם זאת, יכול להיות שמכשיר Android XR מסוים יתמוך בפורמטים נוספים, כמו Dolby Atmos. כדי לשלוח שאילתה לגבי תמיכה בפורמט מדיה, משתמשים ב-AudioCapabilities של ExoPlayer:
val audioCapabilities = AudioCapabilities.getCapabilities( context, androidx.media3.common.AudioAttributes.DEFAULT, null, emptyList() ) if (audioCapabilities.supportsEncoding(C.ENCODING_AC3)) { // Device supports playback of the Dolby Digital media format. } if (audioCapabilities.supportsEncoding(C.ENCODING_E_AC3)) { // Device supports playback of the Dolby Digital Plus media format. } if (audioCapabilities.supportsEncoding(C.ENCODING_E_AC3_JOC)) { // Device supports playback of the Dolby Digital Plus with Dolby Atmos media format. }
בדיקה של היכולות האלה עשויה לכלול חסימה של שיחות, ולכן אסור להפעיל אותה ב-thread הראשי.
הוספת אודיו מרחבי לאפליקציה
מקורות של צליל מיקומי מוגדרים על ידי PointSourceParams וEntity משויך. המיקום והכיוון של Entity קובעים איפה PointSourceParams מוצג במרחב תלת-ממדי. Call
setPointSourceParams on the
SpatialMediaPlayer to set the PointSourceParams and
its associated entity on a MediaPlayer instance.
דוגמה לאודיו מרחבי
בדוגמה הבאה, קובץ אודיו של אפקט קולי נטען למאגר צלילים ומושמע במיקום של Entity.
// Check spatial capabilities before using spatial audio if (session.scene.spatialCapabilities.contains(SpatialCapability.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() 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, entity = entity, soundPool = soundPool, soundID = pointSoundId, params = pointSource, volume = maxVolume, priority = lowPriority, loop = infiniteLoop, rate = normalSpeed ) } } } else { // The session does not have spatial audio capabilities }
מידע חשוב על הקוד
- השלב הראשון הוא לבדוק אם יש אפשרות להשתמש באודיו מרחבי באמצעות
spatialCapabilities. - הגדרת contentType ל-
CONTENT_TYPE_SONIFICATIONו-usage ל-USAGE_ASSISTANCE_SONIFICATIONמאפשרת למערכת להתייחס לקובץ האודיו הזה כאפקט קולי. - בדוגמה הקודמת, קובץ האודיו נטען למאגר מיד לפני השימוש בו, כדי שהקוד יהיה פשוט. מומלץ לטעון את כל האפקטים הקוליים באופן אסינכרוני בזמן טעינת האפליקציה, כדי שכל קובצי האודיו יהיו זמינים במאגר כשצריך אותם.
הוספת סטריאו וצליל סראונד לאפליקציה
הדרך המומלצת להוסיף סטריאו וצליל סראונד לאפליקציה היא באמצעות
Exoplayer. מידע נוסף על שימוש באודיו מרחבי עם Exoplayer זמין במדריך לאודיו מרחבי.
מיקום הרמקולים של סטריאו וצליל סראונד
במיקום רמקולים של צליל סראונד, הרמקולים הווירטואליים של צליל הסראונד ממוקמים ומכוונים ביחס לרמקול מרכזי, מסביב למשתמש בהגדרה סטנדרטית של ITU.
כברירת מחדל, הרמקול של הערוץ המרכזי מוצב בmainPanelEntity של האפליקציה. זה כולל אפליקציות לנייד שהשמע שלהן עובר אוטומטית מרחביות ב-Android XR.
בסטריאו, מיקום הרמקולים דומה למיקום בסראונד, אבל רק הערוצים השמאלי והימני ממוקמים בצד שמאל ובצד ימין של הפאנל, בהתאמה.
אם יש לכם כמה חלוניות ואתם רוצים לבחור איזו חלונית תשמיע אודיו, או אם אתם רוצים שהאודיו בסטריאו או בסראונד יעובד ביחס למיקום אחר Entity, אתם יכולים להשתמש ב-PointSourceAttributes כדי להגדיר את המיקום של הערוץ המרכזי. שאר הערוצים ימוקמו כמו שצוין קודם. במקרים כאלה, צריך להשתמש גם בMediaPlayer.
כשהמשתמשים יזוזו במרחב, הרמקולים הווירטואליים של הסטריאו וצליל הסראונד יזוזו ויתאימו את עצמם כדי להבטיח שהרמקולים תמיד יהיו במיקום אופטימלי.
אם הגדרתם את MediaPlayer או את ExoPlayer להמשך הפעלה של סטריאו או צליל סראונד ברקע, מיקום הרמקולים הווירטואליים ישתנה כשהאפליקציה תפעל ברקע. מכיוון שאין חלונית או נקודה אחרת במרחב שאליה אפשר לעגן את הצליל, האודיו המרחבי נע עם המשתמש (כלומר, הוא 'נעול לראש').
דוגמה לצליל סראונד
בדוגמה הבאה נטען קובץ אודיו 5.1 באמצעות MediaPlayer, וערוץ האמצע של הקובץ מוגדר כ-Entity.
// Check spatial capabilities before using spatial audio if (session.scene.spatialCapabilities.contains(SpatialCapability.SPATIAL_AUDIO)) { // The session has spatial audio capabilities val pointSourceAttributes = PointSourceParams() 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, entity = session.scene.mainPanelEntity, ) mediaPlayer.setAudioAttributes(audioAttributes) mediaPlayer.prepare() mediaPlayer.start() } else { // The session does not have spatial audio capabilities }
מידע חשוב על הקוד
- כמו בדוגמה לאודיו מרחבי, השלב הראשון הוא לבדוק אם יש אפשרות להשתמש באודיו מרחבי באמצעות
spatialCapabilities. - הגדרת
contentTypeלערךAudioAttributes.CONTENT_TYPE_MUSICוהשימוש לערךAudioAttributes.USAGE_MEDIAמאפשרת למערכת להתייחס לקובץ האודיו הזה כאל צליל סראונד.
הוספת שדות קול אמביסוניים לאפליקציה
הדרך הפשוטה ביותר להפעיל שדות קול אמביסוניים היא לטעון את הקובץ באמצעות MediaPlayer. הסאונד האמביסוני מיושם על כל מרחב הסאונד, ולכן לא צריך לציין Entity כדי לספק מיקום. במקום זאת, יוצרים מופע של SoundFieldAttributes עם סדר אמביסוני מתאים שמציין את מספר הערוצים.
דוגמה ל-Ambionics
בדוגמה הבאה מושמע שדה קול אמביסוני באמצעות MediaPlayer.
// Check spatial capabilities before using spatial audio if (session.scene.spatialCapabilities.contains(SpatialCapability.SPATIAL_AUDIO)) { // The session has spatial audio capabilities val soundFieldAttributes = SoundFieldAttributes(SpatializerConstants.AmbisonicsOrder.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 }
מידע חשוב על הקוד
- כמו בדוגמאות הקודמות, השלב הראשון הוא לבדוק אם יש אפשרות להשתמש באודיו מרחבי באמצעות
hasCapability(). - הנתונים של
contentTypeוהשימוש הם למטרות מידע בלבד. - התג
AMBISONICS_ORDER_FIRST_ORDERמאותת ל-SceneCore שקובץ השדה של הסאונד מגדיר ארבעה ערוצים.