אודיו מרחבי הוא חוויית אודיו סוחפת שמעמידה את המשתמשים במרכז הפעולה, כך שהתוכן נשמע מציאותי יותר. הצליל הוא "מרחבי" כדי ליצור אפקט של מספר רמקולים, בדומה להגדרת צליל סראונד, אבל דרך אוזניות.
לדוגמה, בסרט, הצליל של מכונית יכול להתחיל מאחורי המשתמש, להתקדם קדימה ולהיעלם במרחק. בווידאו צ'אט, אפשר להפריד בין הקולות ולמקם אותם מסביב למשתמש, כדי שיהיה קל יותר לזהות את הדוברים.
אם התוכן שלכם משתמש בפורמט אודיו נתמך, אתם יכולים להוסיף אודיו מרחבי לאפליקציה החל מ-Android 13 (רמת API 33).
שאילתה לגבי יכולות
משתמשים במחלקה Spatializer כדי לשלוח שאילתות לגבי היכולות וההתנהגות של המכשיר בתחום האודיו המרחבי. קודם צריך לאחזר מופע של Spatializer מ-AudioManager:
Kotlin
val spatializer = audioManager.spatializer
Java
Spatializer spatializer = AudioManager.getSpatializer();
אחרי שמקבלים את Spatializer, בודקים את ארבעת התנאים שצריכים להתקיים כדי שהמכשיר יוציא אודיו מרחבי:
| קריטריונים | המחאה |
|---|---|
| האם המכשיר תומך בהתאמה למרחב? |
getImmersiveAudioLevel() הוא לא SPATIALIZER_IMMERSIVE_LEVEL_NONE
|
| האם אפשר להשתמש באודיו מרחבי? הזמינות תלויה בתאימות לניתוב הנוכחי של פלט האודיו. |
isAvailable() הוא true |
| האם המרחביות מופעלת? | isEnabled() הוא true |
| האם אפשר להפוך טראק של אודיו עם הפרמטרים הנתונים לאודיו מרחבי? | canBeSpatialized() הוא true |
יכול להיות שהתנאים האלה לא יתקיימו, למשל אם האודיו המרחבי לא זמין בטראק האודיו הנוכחי או מושבת לגמרי במכשיר להצגת מידע.
מעקב ראש
באוזניות נתמכות, הפלטפורמה יכולה להתאים את המרחביות של האודיו בהתאם למיקום הראש של המשתמש. כדי לבדוק אם יש מעקב ראש זמין לניתוב הנוכחי של פלט האודיו, צריך להפעיל את isHeadTrackerAvailable().
תוכן תואם
Spatializer.canBeSpatialized()
מציין אם אפשר להשמיע אודיו עם המאפיינים הנתונים כאודיו מרחבי באמצעות הניתוב הנוכחי של המכשיר להצגת מידע. השיטה הזו מקבלת AudioAttributes ו-AudioFormat, שניהם מתוארים בפירוט בהמשך.
AudioAttributes
אובייקט AudioAttributes מתאר את השימוש בשידור אודיו (לדוגמה, אודיו של משחק או מדיה רגילה), יחד עם התנהגויות ההפעלה וסוג התוכן שלו.
כשמפעילים את canBeSpatialized(), צריך להשתמש באותו מופע של AudioAttributes שהוגדר ל-Player. לדוגמה, אם אתם משתמשים בספריית Jetpack Media3 ולא התאמתם אישית את AudioAttributes, השתמשו ב-AudioAttributes.DEFAULT.
השבתת האודיו המרחבי
כדי לציין שהתוכן כבר עבר עיבוד לאודיו מרחבי, צריך להפעיל את
setIsContentSpatialized(true)
כדי שהאודיו לא יעבור עיבוד כפול. לחלופין, אפשר לשנות את התנהגות האודיו המרחבי כדי להשבית את האודיו המרחבי לגמרי באמצעות קריאה ל-setSpatializationBehavior(AudioAttributes.SPATIALIZATION_BEHAVIOR_NEVER).
AudioFormat
אובייקט AudioFormat מתאר פרטים על הפורמט והגדרת הערוץ של טראק אודיו.
כשיוצרים מופע של AudioFormat כדי להעביר אותו אל canBeSpatialized(),
צריך להגדיר את encoding
כמו פורמט הפלט שצפוי מהמפענח. צריך גם להגדיר מסכת ערוצים שתואמת להגדרת הערוצים של התוכן. בקטע התנהגות ברירת המחדל של המרחביות מוסבר באילו ערכים ספציפיים צריך להשתמש.
האזנה לשינויים ב-Spatializer
כדי להאזין לשינויים במצב של Spatializer, אפשר להוסיף מאזין באמצעות Spatializer.addOnSpatializerStateChangedListener().
באופן דומה, כדי להאזין לשינויים בזמינות של מעקב הראש, צריך להפעיל את Spatializer.addOnHeadTrackerAvailableListener().
זה יכול להיות שימושי אם אתם רוצים לשנות את בחירת הטראק במהלך ההפעלה באמצעות פונקציות ה-callback של המאזין. לדוגמה, כשמשתמש מחבר אוזניות למכשיר או מנתק אותן ממנו, פונקציית ה-callback onSpatializerAvailableChanged מציינת אם אפקט ה-spatializer זמין לניתוב החדש של פלט האודיו. בשלב הזה, כדאי לעדכן את הלוגיקה של בחירת הטראקים בנגן כדי להתאים אותה ליכולות החדשות של המכשיר. לפרטים על ההתנהגות של בחירת הטראקים ב-ExoPlayer, עיינו בקטע ExoPlayer ואודיו מרחבי.
ExoPlayer ואודיו מרחבי
בגרסאות האחרונות של ExoPlayer קל יותר להשתמש באודיו מרחבי. אם אתם משתמשים בספריית ExoPlayer העצמאית (שם החבילה com.google.android.exoplayer2), גרסה 2.17 מגדירה את הפלטפורמה להפקת אודיו מרחבי, ובגרסה 2.18 יש אילוצים על מספר ערוצי האודיו.
אם אתם משתמשים במודול ExoPlayer מספריית Media3 (שם החבילה androidx.media3), גרסאות 1.0.0-beta01 וגרסאות חדשות יותר כוללות את אותם עדכונים.
אחרי שמעדכנים את יחסי התלות של ExoPlayer לגרסה האחרונה, האפליקציה צריכה לכלול רק תוכן שאפשר להפוך לאודיו מרחבי.
מגבלות על מספר ערוצי האודיו
כשכל ארבעת התנאים לאודיו מרחבי מתקיימים, ExoPlayer בוחר טראק אודיו עם כמה ערוצים. אם לא, ExoPlayer בוחר טראק סטריאו במקום זאת.
אם המאפיינים של Spatializer משתנים, ExoPlayer יפעיל בחירת טראק חדשה כדי לבחור טראק אודיו שתואם למאפיינים הנוכחיים. שימו לב: בחירת הטראק החדש עלולה לגרום לתקופה קצרה של טעינה מראש.
כדי להשבית את המגבלות על מספר ערוצי האודיו, מגדירים את הפרמטרים לבחירת טראקים בנגן, כמו שמוצג בהמשך:
Kotlin
exoPlayer.trackSelectionParameters = DefaultTrackSelector.Parameters.Builder(context) .setConstrainAudioChannelCountToDeviceCapabilities(false) .build()
Java
exoPlayer.setTrackSelectionParameters( new DefaultTrackSelector.Parameters.Builder(context) .setConstrainAudioChannelCountToDeviceCapabilities(false) .build() );
באופן דומה, אפשר לעדכן את הפרמטרים של בורר טראקים קיים כדי להשבית את המגבלות על מספר ערוצי האודיו, באופן הבא:
Kotlin
val trackSelector = DefaultTrackSelector(context) ... trackSelector.parameters = trackSelector.buildUponParameters() .setConstrainAudioChannelCountToDeviceCapabilities(false) .build()
Java
DefaultTrackSelector trackSelector = new DefaultTrackSelector(context); ... trackSelector.setParameters( trackSelector .buildUponParameters() .setConstrainAudioChannelCountToDeviceCapabilities(false) .build() );
כשהמגבלות על מספר ערוצי האודיו מושבתות, אם בתוכן יש כמה טראקים של אודיו, ExoPlayer בוחר בהתחלה את הטראק עם מספר הערוצים הגבוה ביותר שאפשר להפעיל במכשיר. לדוגמה, אם התוכן מכיל טראק אודיו מרובה ערוצים וטראק אודיו בסטריאו, והמכשיר תומך בהפעלה של שניהם, ExoPlayer יבחר בטראק מרובה הערוצים. בקטע בחירת טראק אודיו מוסבר איך להתאים אישית את ההתנהגות הזו.
בחירת טראק אודיו
כשההתנהגות של אילוצי ספירת ערוצי האודיו של ExoPlayer מושבתת, ExoPlayer לא בוחר באופן אוטומטי טראק אודיו שתואם למאפיינים של ה-spatializer של המכשיר. במקום זאת, אתם יכולים להתאים אישית את הלוגיקה של בחירת הטראקים ב-ExoPlayer על ידי הגדרת פרמטרים לבחירת טראקים לפני או במהלך ההפעלה. כברירת מחדל, ExoPlayer בוחר טראקים של אודיו שזהים לטראק הראשוני מבחינת סוג ה-MIME (קידוד), מספר הערוצים ותדירות הדגימה.
שינוי הפרמטרים לבחירת טראקים
כדי לשנות את הפרמטרים לבחירת טראקים של ExoPlayer, משתמשים ב-Player.setTrackSelectionParameters().
באופן דומה, אפשר לקבל את הפרמטרים הנוכחיים של ExoPlayer באמצעות Player.getTrackSelectionParameters().
לדוגמה, כדי לבחור טראק אודיו בסטריאו באמצע ההפעלה:
Kotlin
exoPlayer.trackSelectionParameters = exoPlayer.trackSelectionParameters .buildUpon() .setMaxAudioChannelCount(2) .build()
Java
exoPlayer.setTrackSelectionParameters( exoPlayer.getTrackSelectionParameters() .buildUpon() .setMaxAudioChannelCount(2) .build() );
חשוב לדעת ששינוי הפרמטרים לבחירת טראקים באמצע ההפעלה עלול לגרום להפרעה בהפעלה. מידע נוסף על כוונון הפרמטרים לבחירת טראקים בנגן זמין בקטע בחירת טראקים במסמכי התיעוד של ExoPlayer.
התנהגות ברירת המחדל של האודיו המרחבי
התנהגות ברירת המחדל של המרחביות ב-Android כוללת את ההתנהגויות הבאות, שאותן יצרני הציוד המקורי (OEM) יכולים להתאים אישית:
רק תוכן עם כמה ערוצים עובר עיבוד לאודיו מרחבי, ולא תוכן סטריאו. אם אתם לא משתמשים ב-ExoPlayer, בהתאם לפורמט של תוכן האודיו מרובה הערוצים, יכול להיות שתצטרכו להגדיר את המספר המקסימלי של ערוצים שמפענח אודיו יכול להפיק למספר גדול. כך מפענח האודיו יפיק PCM רב-ערוצי, והפלטפורמה תוכל להפוך אותו לאודיו מרחבי.
Kotlin
val mediaFormat = MediaFormat() mediaFormat.setInteger(MediaFormat.KEY_MAX_OUTPUT_CHANNEL_COUNT, 99)
Java
MediaFormat mediaFormat = new MediaFormat(); mediaFormat.setInteger(MediaFormat.KEY_MAX_OUTPUT_CHANNEL_COUNT, 99);
דוגמה לפעולה כזו אפשר לראות ב-
MediaCodecAudioRenderer.javaשל ExoPlayer. כדי להשבית את האודיו המרחבי בעצמכם, בלי קשר להתאמה האישית של ה-OEM, עיינו בקטע השבתת אודיו מרחבי.
AudioAttributes: האודיו מתאים לאודיו מרחבי אם הערך שלusageמוגדר כ-USAGE_MEDIAאו כ-USAGE_GAME.
AudioFormat: כדי שהאודיו יעמוד בדרישות לשימוש באודיו מרחבי, צריך להשתמש במסכת ערוצים שמכילה לפחות את הערוציםAudioFormat.CHANNEL_OUT_QUAD(קדמי-שמאלי, קדמי-ימני, אחורי-שמאלי ואחורי-ימני). בדוגמה הבאה אנחנו משתמשים ב-AudioFormat.CHANNEL_OUT_5POINT1לטראק אודיו 5.1. לטראק אודיו בסטריאו, משתמשים ב-AudioFormat.CHANNEL_OUT_STEREO.אם אתם משתמשים ב-Media3, אתם יכולים להשתמש ב-
Util.getAudioTrackChannelConfig(int channelCount)כדי להמיר מספר ערוצים למסכת ערוצים.בנוסף, אם הגדרתם את המפענח לפלט PCM מרובה ערוצים, צריך להגדיר את הקידוד ל-
AudioFormat.ENCODING_PCM_16BIT.Kotlin
val audioFormat = AudioFormat.Builder() .setEncoding(AudioFormat.ENCODING_PCM_16BIT) .setChannelMask(AudioFormat.CHANNEL_OUT_5POINT1) .build()
Java
AudioFormat audioFormat = new AudioFormat.Builder() .setEncoding(AudioFormat.ENCODING_PCM_16BIT) .setChannelMask(AudioFormat.CHANNEL_OUT_5POINT1) .build();
בדיקת האודיו המרחבי
מוודאים שהאודיו המרחבי מופעל במכשיר הבדיקה:
- באוזניות חוטיות, עוברים אל הגדרות המערכת > צלילים ורטט > אודיו מרחבי.
- באוזניות אלחוטיות, עוברים אל הגדרות המערכת > מכשירים מחוברים > סמל גלגל השיניים של המכשיר האלחוטי > אודיו מרחבי.
כדי לבדוק אם האודיו המרחבי זמין לניתוב הנוכחי, מריצים את הפקודה adb shell dumpsys audio במכשיר. בזמן שההפעלה פעילה, הפרמטרים הבאים אמורים להופיע בפלט:
Spatial audio:
mHasSpatializerEffect:true (effect present)
isSpatializerEnabled:true (routing dependent)