גרסה Media3 1.9.0 יצאה לאור! בנוסף לתיקוני הבאגים הרגילים ולשיפורי הביצועים, הגרסה האחרונה כוללת גם ארבעה מודולים חדשים או מודולים שנכתבו מחדש במידה רבה:
-
media3-inspector– חילוץ מטא-נתונים ופריימים מחוץ להפעלה -
media3-ui-compose-material3– יצירת ממשק משתמש בסיסי של מדיה ב-Compose Material3 בכמה שלבים פשוטים -
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 Media בכמה שלבים פשוטים
בגרסאות קודמות התחלנו לספק קוד מחבר בין רכיבי ממשק המשתמש של Compose לבין מופע Player. בגרסה Media3 1.9.0, הוספנו מודול חדש 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.
כמו בכל מודולי הפענוח של התוספים, חשוב לזכור שנדרש בנייה ממקור כדי לאגד את קוד המקור הרלוונטי בצורה נכונה. הוספת חבילה של מפענח מספקת עקביות ותמיכה בפורמטים בכל המכשירים, אבל מכיוון שהפענוח מתבצע בתהליך שלכם, היא מתאימה בעיקר לתוכן שאתם יכולים לסמוך עליו.
שילוב של ניהול מטמון וזיכרון ב-PreloadManager
שיפרנו גם את PreloadManager. הוא כבר מאפשר לטעון מראש מדיה לזיכרון מחוץ להפעלה, ואז להעביר אותה בצורה חלקה לנגן כשצריך. למרות שהיא די יעילה, עדיין צריך להיזהר לא לחרוג ממגבלות הזיכרון בטעינה מראש של יותר מדי נתונים בטעות. לכן, בגרסה Media3 1.9.0 הוספנו שני פיצ'רים שהופכים את התהליך הזה להרבה יותר קל ויציב:
- תמיכה בשמירת נתונים במטמון – כשמגדירים את המרחק לטעינה מראש, אפשר עכשיו לבחור
PreloadStatus.specifiedRangeCached(0, 5000)כמצב יעד לפריטים שנטענו מראש. הפעולה הזו תוסיף את הטווח שצוין למטמון בדיסק במקום לטעון את הנתונים לזיכרון. כך אפשר לספק טווח גדול יותר של פריטים לטעינה מראש, כי הפריטים שרחוקים יותר מהפריט הנוכחי לא צריכים יותר לתפוס זיכרון. שימו לב: כדי לעשות את זה, צריך להגדירCacheב-DefaultPreloadManager.Builder. - ניהול זיכרון אוטומטי – עדכנו גם את ממשק
LoadControlכדי לטפל טוב יותר במקרה של טעינה מראש. עכשיו אפשר להגדיר מגבלת זיכרון עליונה לכל הפריטים שנטענו מראש בזיכרון. הגודל שמוגדר כברירת מחדל הוא 144 MB, ואפשר להגדיר את המגבלה ב-DefaultLoadControl.Builder. הדפדפןDefaultPreloadManagerיפסיק אוטומטית את הטעינה מראש כשהמגבלה תושג, וישחרר אוטומטית זיכרון של פריטים בעדיפות נמוכה יותר אם יהיה צורך בכך.
להסתמך על התנהגויות ברירת מחדל חדשות ופשוטות ב-ExoPlayer
כמו תמיד, הוספנו גם הרבה שיפורים מצטברים ל-ExoPlayer. הנה כמה דוגמאות:
- השתקה וביטול ההשתקה – כבר הייתה לנו שיטה
setVolume, אבל עכשיו הוספנו את השיטות הנוחותmuteו-unmuteכדי לשחזר בקלות את עוצמת הקול הקודמת בלי שתצטרכו לעקוב אחריה בעצמכם. - זיהוי נגן תקוע – במקרים נדירים, הנגן עלול להיתקע במצב של אחסון בזיכרון או הפעלה בלי להתקדם, למשל בגלל בעיות בקודק או הגדרות שגויות. המשתמשים שלכם יתעצבנו, אבל אתם אף פעם לא רואים את הבעיות האלה בניתוח הנתונים! כדי להבהיר את זה, הנגן מציג עכשיו
StuckPlayerExceptionכשהוא מזהה מצב תקוע. - חסימת מצב שינה כברירת מחדל – בעבר, ניהול חסימת מצב השינה היה אופציונלי, ולכן היה קשה למצוא מקרים קיצוניים שבהם התקדמות ההפעלה יכולה להתעכב מאוד כשהאפליקציה פועלת ברקע. התכונה הזו היא עכשיו אופציונלית, כך שלא צריך לדאוג לגביה ואפשר גם להסיר את כל הטיפול הידני בחסימת מצב שינה בזמן ההפעלה.
- הגדרה פשוטה יותר ללוגיקה של לחצן הכתוביות – שינוי
TrackSelectionParametersכך שיוצג הכיתוב 'הפעלה או השבתה של הכתוביות' היה קשה באופן מפתיע, לכן הוספנו אפשרות בוליאנית פשוטהselectTextByDefaultלתרחיש השימוש הזה.
שינוי ההעדפות של כפתורי המדיה ב-MediaSession
עד עכשיו, כדי להגדיר אילו כפתורים יוצגו במגירת ההתראות על מדיה ב-Android Auto או ב-WearOS, היה צריך להגדיר פקודות וכפתורים בהתאמה אישית, גם אם רציתם רק להפעיל שיטה רגילה של נגן.
ב-Media3 1.9.0 יש פונקציונליות חדשה שהופכת את התהליך הזה להרבה יותר פשוט – עכשיו אפשר להגדיר את ההעדפות של כפתורי המדיה באמצעות פקודה רגילה של נגן, בלי צורך בטיפול בפקודות בהתאמה אישית.
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 הוא רכיב חדש ב-Media3 editing APIs שנועד לתצוגה מקדימה בזמן אמת של עריכות מדיה. הכלי מבוסס על הממשק המוכר של Media3 Player, CompositionPlayer ומאפשר למשתמשים לראות את השינויים בפעולה לפני שהם מתחייבים לתהליך הייצוא. הוא משתמש באותו אובייקט Composition שמעבירים אל Transformer לייצוא, וכך מייעל את תהליך העריכה על ידי איחוד מודל הנתונים לתצוגה מקדימה ולייצוא.
מומלץ להתחיל להשתמש ב-CompositionPlayer ולשתף איתנו משוב. פרטים נוספים יפורסמו בקרוב בפוסטים ובעדכונים של המסמכים.
InAppMuxer כברירת מחדל של Muxer ב-Transformer
הכלי Transformer משתמש עכשיו ב-InAppMp4Muxer בתור ברירת המחדל של כלי ה-muxer לכתיבת קובצי קונטיינר של מדיה. באופן פנימי, InAppMp4Muxer תלוי במודול Muxer של Media3, ומספק התנהגות עקבית בכל גרסאות ה-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 מחייב לציין את סוגי הטראקים הרצויים של הפלט במהלך יצירת הרצף. השינוי הזה מבטיח שהטיפול בטראקים יהיה מפורש וחזק יותר בכל הקומפוזיציה.
הפעולה הזו מתבצעת באמצעות בנאי חדש EditedMediaItemSequence.Builder שמקבל קבוצה של סוגי טראקים (לדוגמה, C.TRACK_TYPE_AUDIO, C.TRACK_TYPE_VIDEO).
כדי לפשט את תהליך היצירה, הוספנו שיטות סטטיות חדשות ונוחות:
- EditedMediaItemSequence.withAudioFrom(List<EditedMediaItem>)
- EditedMediaItemSequence.withVideoFrom(List<EditedMediaItem>)
- EditedMediaItemSequence.withAudioAndVideoFrom(List<EditedMediaItem>)
מומלץ לעבור לקונסטרוקטור החדש או לשיטות הנוחות כדי להגדיר רצפים בצורה ברורה ואמינה יותר.
דוגמה ליצירת רצף של מודעות וידאו בלבד:
EditedMediaItemSequence videoOnlySequence =
EditedMediaItemSequence.Builder(setOf(C.TRACK_TYPE_VIDEO))
.addItem(editedMediaItem)
.build()אם נתקלתם בבאגים, או אם יש לכם שאלות או בקשות להוספת תכונות, אתם יכולים לפנות אלינו דרך כלי המעקב אחרי בעיות ב-Media3. נשמח לשמוע ממך!
-
חדשות על מוצריםלמפתחי Android יש הרבה אפשרויות בכל הנוגע לסוכנים, למודלים גדולים של שפה (LLM), לכלים ולממשקי שורת פקודה (CLI) שבהם הם משתמשים לפיתוח אפליקציות. המטרה שלנו היא לעזור לכם לפתח אפליקציות יפות ואיכותיות ל-Android, לא משנה איך תבחרו לפתח אותן.
Simona Milanovic • משך הקריאה: 4 דקות -
חדשות על מוצריםב-Google Play, אנחנו מרחיבים כל הזמן את פלטפורמת המינויים שלנו כדי לעזור לכם להגדיל את הצמיחה, להתאים את עצמכם למודלים עסקיים חדשים ולהגיע למשתמשים שלכם בדיוק במקום שבו הם נמצאים.
Sheenam Mittal • משך הקריאה: 4 דקות -
חדשות על מוצריםבשנה שעברה, פתחנו את Android Studio לכל מודל AI. היום אנחנו עושים את הצעד הבא ומשיקים תמיכה בסוכני קידוד לפי בחירתכם.
Matthew Warner • משך הקריאה: 3 דקות
רוצים לקבל טיפים עדכניים לפיתוח Android ישירות לאימייל כל שבוע?