מדריכים

‫Media3 1.11 – מה חדש?

משך הקריאה: 3 דקות
צפייה בפרופיל של Toni Heidenreich
Toni Heidenreich מהנדס/ת תוכנה, Android

גרסה Media3 1.11 יצאה לאור. הגרסה הזו, שמפעילה את רוב האפליקציות המובילות של מדיה ב-Android, כוללת תכונות חדשות, תיקוני באגים ושיפורים ברכיבי ההפעלה, העריכה וממשק המשתמש. אנחנו מרחיבים את מודולי ממשק המשתמש של Jetpack Compose עם Playerמשבצות שניתנות להתאמה אישית, הגדרות ברירת מחדל קלות לשימוש, מחוות אינטראקטיביות, כלי מעקב אחר מצב וטעינה מראש של סרטונים בפורמט קצר באמצעות PlayerPool. בנוסף, ביצענו מודרניזציה בשילוב של Media3 Cast עם תמיכה ב-SystemUI Output Switcher, הוספנו תוסף רשת חדש של לקוח Ktor HTTP, והוספנו כלי עזר חדשים למיקס של קובצי Ogg ו-WAV.

בהמשך מפורטים השינויים העיקריים, ובנתוני הגרסה מופיעה רשימה מלאה של השינויים.

ממשק המשתמש של ההפעלה והכתיבה

מערכת Android הופכת ל-Compose-first, ואנחנו ממשיכים להרחיב את המודולים media3-ui-compose ו- media3-ui-compose-material3. העדכון הזה כולל שליטה מפורטת יותר בפריסת הנגן, דפוסי אינטראקציה עשירים יותר ושילוב עמוק יותר עם Material3.

פריסת נגן שניתנת להתאמה אישית

רכיב ה-Material 3 Player Composable תומך עכשיו במשבצות תוכן ייעודיות ל-topControlscenterControlsbottomControls ו-errorOverlay. אתם יכולים להוסיף רכיבים קומפוזביליים משלכם או להשתמש ברכיבים שמוגדרים כברירת מחדל ופורסמו ב-PlayerDefaults:

Player(
  player = player,
  topControls = { PlayerDefaults.TopControls(player) },
  centerControls = { PlayerDefaults.CenterControls(player) },
  bottomControls = { PlayerDefaults.BottomControls(player) },
)

ה-Composable‏ Player משלב גם תמיכה ב-FocusRequester, ומאפשר ניווט חלק באמצעות מקשי החיצים (D-pad) והמקלדת ב-Android TV, במכשירים מתקפלים ובסביבות מחשב. 

player_video.png
דוגמה לנגן שאפשר להרכיב עם פקדים בהתאמה אישית

תנועות ושליטה במהירות ההפעלה

PlaybackSpeedState כולל עכשיו API להילוך מהיר/איטי. אפשר לראות את זה ב-demo-compose app, שבו לחיצה ארוכה מאפשרת להריץ קדימה את ההפעלה ולחיצה כפולה מאפשרת להגיע לנקודה מסוימת בסרטון. בנוסף ל-ProgressSlider שהוצג בגרסה 1.10, ממשק המשתמש של נגן Compose מציע עכשיו אינטראקציות עשירות של מגע ומחוות, ללא צורך בהגדרה.

טעינה מראש של סרטונים קצרים באמצעות PlayerPool

באפליקציות עם פידים של מדיה בחלון הזזה (לדוגמה, סרטונים קצרים בפורמט אנכי), ניהול יעיל של כמה מופעים של ExoPlayer הוא אתגר נפוץ. ב-Media3 1.11 נוספו PlayerPool (ב-common-ktx) ו-rememberPooledPlayer (ב-ui-compose) כדי לטפל אוטומטית בשימוש חוזר בנגן ובטעינה מראש.

הדוגמה החדשה ShortFormPlayerScreen ב-demo-compose ממחישה את הפעולה הזו. זהו פיד עם דפדוף אנכי שבו השחקנים מאוגדים, נטענים מראש וממוחזרים בצורה חלקה בזמן שהמשתמש גולל.

MiniController

רכיב MiniController Composable חדש ב-media3-ui-compose-material3 מספק סרגל הפעלה קומפקטי שמציג את שם הפריט הנוכחי, האומן, הגרפיקה וההתקדמות לצד אמצעי הבקרה של ההפעלה וההשהיה. כמו כל רכיבי ה-Composable שמוגדרים כברירת מחדל ב-media3-ui-compose-material3, רכיב ה-MiniController תומך בשילוב של צבעים דינמיים של Material3, כך שהוא יכול להתאים את עצמו באופן אוטומטי לטפט של המשתמש.זה אידיאלי לממשקי משתמש קבועים של גיליון תחתון או מיני-נגן, למשל בזמן שהמשתמש מעיין בתוכן או במהלך סשנים פעילים של Cast.

mini_player.png
המיני-בקר של Media3 שמציג את עטיפת האלבום, מטא-נתונים של המדיה ואמצעי בקרה בסיסיים

מאגרי מצב מורחבים למטא-נתונים ולשגיאות

הוספנו כמה מחזיקי מצב ריאקטיביים חדשים ל-media3-ui-compose:

  • rememberCurrentMediaItemState – צפייה במטא-נתונים של הפריט שמופעל כרגע
  • rememberPlaylistState – צפייה בפלייליסט המלא ובאינדקסים הפעילים
  • rememberErrorState – מעקב אחרי שגיאות בהפעלת רצועות, עם ErrorText Composable תואם ו-default ErrorOverlay ב-Material3

אנחנו נמשיך לעבוד על תוספות חדשות ועל עוד אפשרויות להתאמה אישית בגרסאות הבאות. נשמח לשמוע את דעתך על כלי המעקב אחר בעיות בפרויקט.

שילוב מודרני של Cast

בגרסה 1.11 של Media3, הרחבנו את התוסף Cast עם אפשרויות הגדרה פרוגרמטיות ותמיכה בניתוב ברמת מערכת ההפעלה.

‫CastParams ומתג מעבר למכשיר אחר בממשק המשתמש של המערכת

עכשיו אפשר להגדיר את תוסף Cast באמצעות CastParams:

val castParams = CastParams.Builder()
  .setShowSystemOutputSwitcherOnCastButtonClick(true)
  .build()


Cast.getSingletonInstance(context).initialize(castParams)

ההגדרה setShowSystemOutputSwitcherOnCastIconClick(true) קובעת שבגרסאות נתמכות של הפלטפורמה, MediaRouteButton ייפתח הכלי המובנה של Android לבחירת פלט, וכך מספקת חוויה אחידה של בחירת פלט.

מצב תגובתי של MediaRouteButton ב-Compose

באפליקציות שמשתמשות ב-Jetpack Compose, אפשר עכשיו להוסיף בקלות את לחצן ניתוב המדיה (שנקרא גם הכפתור להפעלת Cast), שמתעדכן אוטומטית בהתאם למצב תיבת הדו-שיח. אין צורך בלוגיקה נוספת כשמשתמשים בה יחד עם CastPlayer של Media3.

@Composable
fun TopAppBarWithCast() {
  Row {
    Text(text = "App Title")
    MediaRouteButton()
  }
}
cast_button_2.png
לחצן של נתיב מדיה Media3 באפליקציה שמפעיל את תיבת הדו-שיח של מתג מעבר למכשיר אחר שמוגדר כברירת מחדל

שיפורים בהפעלה ובסשן

Eclipsa Video - HAGC dynamic HDR metadata (API 37+)

Eclipsa Video מבטיחה חוויית HDR עקבית יותר במכשירים שונים, עם נקודת בסיס עקבית של לבן ב-HDR, מרווח דינמי משתנה בהתאם למסך ולסביבה, כדי להבטיח שהכוונה הקריאטיבית תישמר בכל המכשירים.

מעכשיו, ExoPlayer תומך בהפעלה של מטא-נתונים עם חותמת זמן של HAGC (ST 2094-50) שנדרשים למדיה פרוגרסיבית (MP4,‏ Matroska). הנגן ממזג באופן אוטומטי את טראקים של מטא-נתונים של HAGC עם טראק הווידאו המשויך, ומעביר את המטא-נתונים מחוץ לפס אל המפענח במכשירים עם API בגרסה 37 ומעלה. במכשירים ישנים יותר, ExoPlayer חוזר באופן אוטומטי לחוויית הפעלה רגילה של HDR ללא ההתאמות.  

eclipsa.png
איור שמציג את היתרונות של Eclipsa Video HDR, כמו ניגודיות צבעים עקבית יותר

תוסף חדש של לקוח HTTP ב-Ktor

מודול חדש של תוסף media3-datasource-ktor מספק KtorDataSource, שמגובה על ידי Ktor מחסנית HTTP. הספרייה הזו מציעה חלופה שמתאימה ל-Kotlin ולקורוטינות, במקום מודולי מקורות הנתונים הקיימים של Cronet ו-OkHttp.

חיבורים אסינכרוניים של MediaSession

MediaSession.Callback כולל עכשיו onConnectAsync(), שמאפשר לכם לעבד ניסיונות חיבור של בקרים באופן אסינכרוני – למשל, כדי לאמת הרשאה לפני אישור חיבור. אפשר להחזיר Future מיידי עם Futures.immediateFuture(ConnectionResult) כדי לקבל את אותה התנהגות כמו onConnect הקיים. 

override fun onConnectAsync(
  session: MediaSession,
  controller: MediaSession.ControllerInfo
): ListenableFuture<MediaSession.ConnectionResult> {
  return authenticateControllerAsync(controller)
}

ברירות מחדל בטוחות יותר של MediaSession

באפליקציות שלא מבטלות את onConnect או את onConnectAsync ב-MediaSession.Callback, הספרייה מוגדרת עכשיו כברירת מחדל להגדרה מאובטחת יותר. באופן ספציפי, נתוני סשן לא משותפים יותר כברירת מחדל עם בקרי גישה לא מהימנים. כלומר, לאפליקציות של צד שלישי או לאפליקציות שאינן מערכתיות שאין להן גישה להודעות, אין אפשרות לגשת לנתוני סשן, אלא אם מטמיעים באופן מפורש את שיטות הקריאה החוזרת האלה כדי לאשר את החיבור.

הטמעות חדשות של Muxer וניתוח של קונטיינרים

‫OggMuxer ו-WavMuxer

הוספנו שני מְרַבְּבִים ייעודיים חדשים: OggMuxer לריבוב OPUS וזרמי VORBIS לקובצי ‎ .ogg רגילים, ו- WavMuxer ליצירת קובצי אודיו .wav PCM לא דחוסים עם נקודה צפה.

ניתוח מאגר תגים ומעקב אחר הפניות

  • הפניות לרצועות MP4 (tref): Mp4Muxer.addTrackReference מאפשרות לקשר מטא-נתונים תלויים או רצועות עזר לסטרימינג של סרטונים ראשיים.
  • חילוץ פרקים: פרקים של QuickTime ו-Nero מקובצי MP4 ‏ (.m4a.m4b) ופרקים של Matroska, נחלצים עכשיו כרשומות מטא-נתונים של Chapter לניווט בספרי אודיו ובפודקאסטים.

כדי לדווח על באגים, לשאול שאלות או לשלוח בקשות להוספת תכונות, אפשר להשתמש בכלי למעקב אחרי בעיות. נשמח לשמוע ממך!

נכתב על ידי:
המשך קריאה