תכונות האודיו המרחבי ב-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 מוצג במרחב תלת-ממדי. 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(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 שקובץ השדה sound מגדיר ארבעה ערוצים.