התכונות של אודיו מרחבי ב-Jetpack SceneCore מאפשרות לכם ליצור חוויות אודיו סוחפות באפליקציות ל-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 מוצג במרחב התלת-ממדי. מפעילים את setPointSourceParams ב-SpatialMediaPlayer כדי להגדיר את PointSourceParams ואת ה-entity שמשויך אליו במכונה של MediaPlayer.
דוגמה לאודיו מרחבי
בדוגמה הבאה, קובץ אודיו של אפקט קולי נטען למאגר צלילים ומופעל במיקום של 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 }
מידע חשוב על הקוד
- כמו בקטעי הקוד הקודמים, השלב הראשון הוא לבדוק אם היכולות של אודיו מרחבי זמינות באמצעות
spatialCapabilities. - ה
contentTypeוהשימוש בהם הם למטרות מידע בלבד. - הערך
SpatializerConstants.AmbisonicsOrder.FIRST_ORDERמאותת ל-SceneCore שקובץ שדה הצליל מגדיר ארבעה ערוצים.