Media3 1.9.0 כבר כאן! בנוסף לתיקוני הבאגים ושיפורי הביצועים הרגילים, הגרסה האחרונה כוללת גם ארבעה מודולים חדשים או משוכתבים ברובם:
media3-inspector– חילוץ מטא-נתונים ופריימים מחוץ להפעלהmedia3-ui-compose-material3– פיתוח ממשק משתמש בסיסי של מדיה ב-Material3 Compose בכמה שלבים פשוטיםmedia3-cast– טיפול אוטומטי במעברים בין Cast לבין הפעלות מקומיות-
media3-decoder-av1– הפעלה עקבית של AV1 עם מפענח התוספים שנכתב מחדש על סמך ספריית dav1d
הוספנו גם שיפורים לשמירה במטמון ולניהול הזיכרון ב-PreloadManager, ופישטנו כמה דברים ב-ExoPlayer, ב-Transformer וב-MediaSession.
בגרסה הזו אתם גם מקבלים גישה ניסיונית ראשונה ל-CompositionPlayer כדי לראות תצוגה מקדימה של עריכות מדיה.
כדי לקבל סקירה מקיפה על השינויים בגרסה הזו, אתם יכולים לקרוא את הערות הגרסה המלאות.
חילוץ מטא-נתונים ופריימים מחוץ להפעלה
יש הרבה מקרים שבהם רוצים לבדוק מדיה בלי להתחיל הפעלה. לדוגמה, יכול להיות שתרצו לזהות את הפורמטים שהוא מכיל או את משך הזמן שלו, או לאחזר תמונות ממוזערות.
המודול החדש media3-inspector משלב את כל כלי השירות לבדיקת מדיה בלי הפעלה במקום אחד:
MetadataRetrieverכדי לקרוא את משך הזמן, הפורמט והמטא-נתונים הסטטיים מ-MediaItem.FrameExtractorכדי לקבל פריימים או תמונות ממוזערות מפריט.MediaExtractorCompatכתחליף ישיר למחלקה MediaExtractor בפלטפורמת Android, כדי לקבל מידע מפורט על דגימות בקובץ.
MetadataRetriever ו-FrameExtractor פועלים לפי תבנית AutoCloseable פשוטה. לפרטים נוספים, כדאי לעיין בדפי המדריך החדשים.
suspend fun extractThumbnail(mediaItem: MediaItem) {
FrameExtractor.Builder(context, mediaItem).build().use {
val thumbnail = frameExtractor.getThumbnail().await()
}
}איך יוצרים ממשק משתמש בסיסי למדיה ב-Material3 Compose בכמה שלבים פשוטים
בגרסאות קודמות התחלנו לספק קוד מחבר בין רכיבי ממשק המשתמש של Compose לבין המופע של Player. בגרסה 1.9.0 של Media3, הוספנו מודול חדש בשם media3-ui-compose-material3 עם לחצנים ורכיבי תוכן מעוצבים ב-Material3. הם מאפשרים ליצור ממשק משתמש למדיה בכמה שלבים פשוטים, וגם מספקים את כל הגמישות שצריך כדי להתאים אישית את הסגנון. אם אתם מעדיפים ליצור סגנון משלכם לממשק המשתמש, אתם יכולים להשתמש באבני הבניין שמטפלות בכל הלוגיקה של העדכון והחיבור, כך שאתם צריכים להתמקד רק בעיצוב של רכיב ממשק המשתמש. כדאי לעיין בדפי המדריך המורחבים שלנו למודולים של ממשק המשתמש של Compose.
אנחנו גם ממשיכים לעבוד על רכיבי Compose נוספים, כמו סרגל דילוג מובנה, תחליף מלא ומוכן לשימוש ל-PlayerView, וגם שילוב של כתוביות ומודעות.
@Composable
fun SimplePlayerUI(player: Player, modifier: Modifier = Modifier) {
Column(modifier) {
ContentFrame(player) // Video surface and shutter logic
Row (Modifier.align(Alignment.CenterHorizontally)) {
SeekBackButton(player) // Simple controls
PlayPauseButton(player)
SeekForwardButton(player)
}
}
}
ממשק משתמש פשוט של נגן Compose עם רכיבים מוכנים לשימוש
טיפול אוטומטי במעברים בין Cast לבין הפעלות מקומיות
CastPlayer במודול media3-cast נכתב מחדש כדי לטפל באופן אוטומטי במעברים בין הפעלה מקומית (לדוגמה, באמצעות ExoPlayer) לבין הפעלה מרחוק באמצעות Cast.
כשמגדירים את MediaSession, פשוט יוצרים CastPlayer סביב ExoPlayer ומוסיפים MediaRouteButton לממשק המשתמש, וזהו!
// MediaSession setup with CastPlayer
val exoPlayer = ExoPlayer.Builder(context).build()
val castPlayer = CastPlayer.Builder(context).setLocalPlayer(exoPlayer).build()
val session = MediaSession.Builder(context, castPlayer).build()
// MediaRouteButton in UI
@Composable fun UIWithMediaRouteButton() {
MediaRouteButton()
}
שילוב חדש של CastPlayer באפליקציית ההדגמה של סשן Media3
הפעלה עקבית של AV1 עם התוסף המשוכתב שמבוסס על dav1d
גרסה 1.9.0 כוללת מודול של תוסף AV1 שנכתב מחדש לגמרי, שמבוסס על ספריית dav1d הפופולרית.
כמו בכל מודולי המפענחים של התוספים, שימו לב שצריך לבנות מקוד המקור כדי לאגד בצורה נכונה את קוד ה-Native הרלוונטי. כשמצרפים מפענח, מקבלים עקביות ותמיכה בפורמטים בכל המכשירים. עם זאת, מכיוון שהפענוח מתבצע בתהליך שלכם, הוא מתאים בעיקר לתוכן שאפשר לסמוך עליו.
שילוב של שמירה במטמון וניהול זיכרון ב-PreloadManager
שיפרנו גם את PreloadManager. הוא כבר מאפשר לכם לטעון מראש מדיה לזיכרון מחוץ להפעלה, ואז להעביר אותה בצורה חלקה לנגן כשצריך. למרות שהביצועים היו די טובים, עדיין היה צריך להיזהר לא לחרוג ממגבלות הזיכרון על ידי טעינה מראש של יותר מדי נתונים בטעות. לכן, בגרסה 1.9.0 של Media3 הוספנו שתי תכונות שהופכות את התהליך הזה להרבה יותר קל ויציב:
- תמיכה בשמירה במטמון – כשמגדירים את טווח הטעינה מראש, אפשר עכשיו לבחור את
PreloadStatus.specifiedRangeCached(0, 5000)כמצב היעד של הפריטים שנטענים מראש. הפעולה הזו תוסיף את הטווח שצוין למטמון בדיסק במקום לטעון את הנתונים לזיכרון. כך אפשר לספק מגוון גדול יותר של פריטים לטעינה מראש, כי הפריטים שרחוקים יותר מהפריט הנוכחי כבר לא צריכים לתפוס מקום בזיכרון. שימו לב: לשם כך צריך להגדירCacheב-DefaultPreloadManager.Builder. - ניהול זיכרון אוטומטי – עדכנו גם את הממשק של
LoadControlכדי לשפר את הטיפול במקרים של טעינה מראש, כך שעכשיו אפשר להגדיר מגבלת זיכרון עליונה מפורשת לכל הפריטים שנטענים מראש בזיכרון. כברירת מחדל, הגודל הוא 144MB, ואפשר להגדיר את המגבלה ב-DefaultLoadControl.Builder.DefaultPreloadManagerיפסיק אוטומטית את הטעינה מראש כשהוא יגיע למגבלה, וישחרר אוטומטית זיכרון של פריטים בעדיפות נמוכה יותר, אם יהיה צורך.
הסתמכות על התנהגויות ברירת מחדל חדשות ופשוטות יותר ב-ExoPlayer
כמו תמיד, הוספנו גם הרבה שיפורים הדרגתיים ל-ExoPlayer. הנה כמה דוגמאות:
- השתקה וביטול השתקה – כבר הייתה לנו שיטת
setVolume, אבל עכשיו הוספנו את השיטות הנוחותmuteו-unmuteכדי לשחזר בקלות את עוצמת הקול הקודמת בלי לעקוב אחריה בעצמכם. - זיהוי נגן תקוע – במקרים נדירים, הנגן יכול להיתקע במצב של טעינה או הפעלה בלי להתקדם, למשל בגלל בעיות בקודק או הגדרות שגויות. המשתמשים שלכם יתעצבנו, אבל אתם לא תראו את הבעיות האלה בניתוח הנתונים. כדי להבהיר את זה, הנגן מדווח עכשיו על
StuckPlayerExceptionכשהוא מזהה מצב של תקיעה. - חסימת מצב שינה כברירת מחדל – בעבר, המשתמשים היו צריכים להביע הסכמה לניהול של חסימת מצב השינה. כתוצאה מכך, היו מקרים חריגים שקשה למצוא שבהם ההתקדמות של ההפעלה התעכבה מאוד כשהיא פעלה ברקע. עכשיו התכונה הזו מופעלת כברירת מחדל, אז אתם לא צריכים לדאוג לגביה, ואתם יכולים גם להסיר את כל הטיפול הידני בחסימת מצב שינה שקשור להפעלה.
- הגדרה פשוטה יותר ללוגיקה של כפתור הכתוביות – היה קשה באופן מפתיע לשנות את
TrackSelectionParametersכך שיהיה כתוב "הפעלה/השבתה של הכתוביות", אז הוספנו אפשרות בוליאנית פשוטהselectTextByDefaultלתרחיש השימוש הזה.
איך לפשט את ההעדפות של כפתורי המדיה ב-MediaSession
עד עכשיו, כדי להגדיר את ההעדפות שלכם לגבי הכפתורים שיופיעו בחלונית ההתראות של המדיה ב-Android Auto או ב-WearOS, הייתם צריכים להגדיר פקודות וכפתורים בהתאמה אישית, גם אם רק רציתם להפעיל שיטה רגילה של נגן.
בגרסה 1.9.0 של Media3 יש פונקציונליות חדשה שהופכת את התהליך הזה להרבה יותר פשוט – עכשיו אתם יכולים להגדיר את ההעדפות של כפתורי המדיה באמצעות פקודת נגן רגילה, בלי צורך בטיפול בפקודות בהתאמה אישית.
session.setMediaButtonPreferences(listOf(
CommandButton.Builder(CommandButton.ICON_FAST_FORWARD) // choose an icon
.setDisplayName(R.string.skip_forward)
.setPlayerCommand(Player.COMMAND_SEEK_FORWARD) // choose an action
.build()
))
העדפות של כפתורי המדיה עם כפתור להרצה קדימה
CompositionPlayer לתצוגה מקדימה בזמן אמת
בגרסה 1.9.0, הוספנו את CompositionPlayer עם הערה חדשה @ExperimentalApi. ההערה מציינת שהתכונה זמינה לניסוי, אבל היא עדיין בשלבי פיתוח.
CompositionPlayer הוא רכיב חדש בממשקי ה-API לעריכה של Media3, שמיועד לתצוגה מקדימה בזמן אמת של עריכות מדיה. הכלי CompositionPlayer מבוסס על הממשק המוכר של Media3 Player, ומאפשר למשתמשים לראות את השינויים שלהם בפעולה לפני שהם מתחילים בתהליך הייצוא. הוא משתמש באותו אובייקט Composition שהייתם מעבירים אל Transformer לייצוא, ומייעל את תהליך העריכה על ידי איחוד מודל הנתונים לתצוגה מקדימה ולייצוא.
אנחנו ממליצים לכם להתחיל להשתמש ב-CompositionPlayer ולשתף משוב. כדאי גם לעקוב אחרי פוסטים ועדכונים עתידיים במסמכי התיעוד כדי לקבל פרטים נוספים.
InAppMuxer בתור ברירת המחדל של muxer ב-Transformer
עכשיו Transformer משתמש ב-InAppMp4Muxer בתור המולטיפלקסר שמוגדר כברירת מחדל לכתיבת קובצי קונטיינר של מדיה. באופן פנימי, InAppMp4Muxer תלוי במודול Media3 Muxer, שמספק התנהגות עקבית בכל גרסאות ה-API.
שימו לב: למרות ש-Transformer כבר לא משתמש ב-MediaMuxer של פלטפורמת Android כברירת מחדל, עדיין אפשר לספק את FrameworkMuxer.Factory דרך setMuxerFactory אם תרחיש השימוש שלכם דורש זאת.
ממשקי API חדשים לשינוי מהירות
גרסה 1.9.0 מפשטת את ממשקי ה-API של התאמת המהירות לעריכת מדיה. הוספנו שיטות חדשות ישירות ב-EditedMediaItem.Builder כדי לשלוט במהירות, וכך ה-API הפך לאינטואיטיבי יותר. עכשיו אפשר לשנות את המהירות של קליפ על ידי קריאה ל-setSpeed(SpeedProvider provider) ב-EditedMediaItem.Builder:
val speedProvider = object : SpeedProvider {
override fun getSpeed(presentationTimeUs: Long): Float {
return speed
}
override fun getNextSpeedChangeTimeUs(timeUs: Long): Long {
return C.TIME_UNSET
}
}
EditedMediaItem speedEffectItem = EditedMediaItem.Builder(mediaItem)
.setSpeed(speedProvider)
.build()הגישה החדשה הזו מחליפה את השיטה הקודמת של שימוש ב-Effects#createExperimentalSpeedChangingEffects(), שהוצאנו משימוש ונסיר בגרסה עתידית.
חדש: סוגי טראקים ב-EditedMediaItemSequence
בגרסה 1.9.0, ב-EditedMediaItemSequence צריך לציין את סוגי הטראקים הרצויים של הפלט במהלך יצירת הרצף. השינוי הזה מבטיח שהטיפול בטראקים יהיה מפורש ויציב יותר בכל הקומפוזיציה.
כדי לעשות את זה, משתמשים ב-constructor חדש של EditedMediaItemSequence.Builder שמקבל קבוצה של סוגי טראקים (למשל, C.TRACK_TYPE_AUDIO, C.TRACK_TYPE_VIDEO).
כדי לפשט את היצירה, הוספנו שיטות סטטיות חדשות:
- EditedMediaItemSequence.withAudioFrom(List<EditedMediaItem>)
- EditedMediaItemSequence.withVideoFrom(List<EditedMediaItem>)
- EditedMediaItemSequence.withAudioAndVideoFrom(List<EditedMediaItem>)
כדי להגדיר רצפים בצורה ברורה ואמינה יותר, מומלץ לעבור ל-constructor החדש או לשיטות הנוחות.
דוגמה ליצירת רצף של סרטונים בלבד:
EditedMediaItemSequence videoOnlySequence =
EditedMediaItemSequence.Builder(setOf(C.TRACK_TYPE_VIDEO))
.addItem(editedMediaItem)
.build()אם נתקלתם בבאגים, או אם יש לכם שאלות או בקשות להוספת תכונות, אתם יכולים לפנות אלינו דרך מעקב הבעיות של Media3. נשמח לשמוע ממך!
-
חדשות על המוצרככל שהפיתוח של סוכני AI מתקדם, הנדסת Android מגיעה לתחום חדש ומלהיב: מעבר מהשלמת קוד מסייעת לסוכנים שמבצעים משימות מקצה לקצה לפי ההנחיות שלכם. אתם יכולים לבחור את המודלים והסוכנים שאתם רוצים להשתמש בהם, וליהנות מגמישות מלאה.
Jason Buchel • משך הקריאה: 3 דקות -
חדשות על המוצרהיום שיתפנו אתכם בפרק הבא בחזון שלנו, שבו אנחנו הופכים את Google Play ל"יותר מחנות". החל מהכרטיסייה "הדף שלי", שהיא עכשיו בסיס האם האישי של יותר מ-250 מיליון משתמשים פעילים בחודש, ועד לפלטפורמת הגיימינג המאוחדת שלנו שמחברת בין יותר מ-700 מיליון פרופילים ב-Play Games, Google Play נותנת מענה למשתמשים בכל מקום שבו הם נמצאים.
Paul Feng • משך הקריאה: 3 דקות -
חדשות על המוצראנחנו שמחים לעזור למשתמשים לבטא את עצמם ולקבל גישה לכלים האלה ב-Googlebook.
Cyrus Stoller • משך הקריאה: 2 דקות
רוצים לקבל טיפים עדכניים לפיתוח Android ישירות לאימייל כל שבוע?