התכונות של אודיו מרחבי ב-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) 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 מוצג במרחב תלת-ממדי.
דוגמה לאודיו מרחבי
בדוגמה הבאה, קובץ אודיו של אפקט קולי נטען למאגר צלילים ומושמע במיקום של 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(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 }
מידע חשוב על הקוד
- השלב הראשון הוא לבדוק אם היכולות של אודיו מרחבי זמינות כרגע באמצעות
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(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 }
מידע חשוב על הקוד
- כמו בדוגמה לאודיו מרחבי, השלב הראשון הוא לבדוק אם יש אפשרויות לאודיו מרחבי באמצעות
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 שקובץ שדה הקול מגדיר ארבעה ערוצים.