MediaTrack
מייצג טראק של מדיה, שיכול להיות שידור אודיו, שידור וידאו או טקסט
(למשל, כתוביות). האפליקציה יכולה לקבץ, לעצב ולהפעיל
טראקים של מדיה.
הגדרת טראק
אפשר להגדיר מסלול ולהקצות לו מזהה ייחודי. את הקוד הבא יוצרת רצועת טקסט באנגלית, רצועת טקסט בצרפתית ורצועת אודיו בצרפתית, לכל אחד מהם מזהה משלו:
val englishSubtitle = MediaTrack.Builder(1 /* ID */, MediaTrack.TYPE_TEXT) .setName("English Subtitle") .setSubtype(MediaTrack.SUBTYPE_SUBTITLES) .setContentId("https://some-url/caption_en.vtt") /* language is required for subtitle type but optional otherwise */ .setLanguage("en-US") .build() val frenchSubtitle = MediaTrack.Builder(2, MediaTrack.TYPE_TEXT) .setName("French Subtitle") .setSubtype(MediaTrack.SUBTYPE_SUBTITLES) .setContentId("https://some-url/caption_fr.vtt") .setLanguage("fr") .build() val frenchAudio = MediaTrack.Builder(3, MediaTrack.TYPE_AUDIO) .setName("French Audio") .setContentId("trk0001") .setLanguage("fr") .build()
MediaTrack englishSubtitle = new MediaTrack.Builder(1 /* ID */, MediaTrack.TYPE_TEXT) .setName("English Subtitle") .setSubtype(MediaTrack.SUBTYPE_SUBTITLES) .setContentId("https://some-url/caption_en.vtt") /* language is required for subtitle type but optional otherwise */ .setLanguage("en-US") .build(); MediaTrack frenchSubtitle = new MediaTrack.Builder(2, MediaTrack.TYPE_TEXT) .setName("French Subtitle") .setSubtype(MediaTrack.SUBTYPE_SUBTITLES) .setContentId("https://some-url/caption_fr.vtt") .setLanguage("fr") .build(); MediaTrack frenchAudio = new MediaTrack.Builder(3, MediaTrack.TYPE_AUDIO) .setName("French Audio") .setContentId("trk0001") .setLanguage("fr") .build();
מסלולים קבוצתיים
אפשר לקבץ מספר טראקים לפריט מדיה. הוא מיוצג על ידי
MediaInfo
מופע של MediaInfo
לוקח מגוון של טראקים וצובר מידע אחר על פריט המדיה.
על סמך הדוגמה, האפליקציה יכולה להוסיף את שלושת הטראקים האלה למדיה
על ידי העברת רשימה של שלושת הטראקים האלה
MediaInfo.Builder.setMediaTracks(List)
האפליקציה צריכה לשייך מסלולים בMediaInfo
בצורה הזו לפני שהיא נטענת
את המדיה למקלט.
val tracks: MutableList<MediaTrack> = ArrayList<MediaTrack>() tracks.add(englishSubtitle) tracks.add(frenchSubtitle) tracks.add(frenchAudio) val mediaInfo = MediaInfo.Builder(url) .setStreamType(MediaInfo.STREAM_TYPE_BUFFERED) .setContentType(getContentType()) .setMetadata(getMetadata()) .setMediaTracks(tracks) .build()
List tracks = new ArrayList(); tracks.add(englishSubtitle); tracks.add(frenchSubtitle); tracks.add(frenchAudio); MediaInfo mediaInfo = MediaInfo.Builder(url) .setStreamType(MediaInfo.STREAM_TYPE_BUFFERED) .setContentType(getContentType()) .setMetadata(getMetadata()) .setMediaTracks(tracks) .build();
הסרת קהלי יעד מצומצמים
כדי להסיר את כל הטראקים מהמדיה הנוכחית (למשל, כיבוי של שלושת הטראקים
כתוביות בדוגמה), התקשרות
MediaInfo.Builder.setMediaTracks(List)
ולהעביר רשימה ריקה של מזהים.
עדכון טראקים
האפליקציה שלך יכולה להפעיל טראק אחד או יותר ששויכו למדיה
פריט (לאחר טעינת המדיה), על ידי התקשרות
RemoteMediaClient.setActiveMediaTracks(long[])
והעברת המזהים של המסלולים להפעלה. בדוגמה הזו מפעילים את
כתובית בצרפתית ואודיו בצרפתית:
// the ID for the French subtitle is '2' and for the French audio '3' remoteMediaClient.setActiveMediaTracks(longArrayOf(2, 3)) .setResultCallback(ResultCallback { mediaChannelResult: RemoteMediaClient.MediaChannelResult -> if (!mediaChannelResult.status.isSuccess) { Log.e(TAG, "Failed with status code:" + mediaChannelResult.status.statusCode ) } })
// the ID for the French subtitle is '2' and for the French audio '3' remoteMediaClient.setActiveMediaTracks(new long[]{2, 3}) .setResultCallback(mediaChannelResult -> { if (!mediaChannelResult.getStatus().isSuccess()) { Log.e(TAG, "Failed with status code:" + mediaChannelResult.getStatus().getStatusCode()); } });
עיצוב טראקים של טקסט
TextTrackStyle
כולל את פרטי העיצוב של רצועת טקסט. אחרי היצירה או העדכון
ב-TextTrackStyle קיים, ניתן להחיל את הסגנון הזה על
קובץ מדיה באמצעות קריאה
RemoteMediaClient.setTextTrackStyle
כך:
// the ID for the French subtitle is '2' and for the French audio '3' remoteMediaClient.setTextTrackStyle(style) .setResultCallback(ResultCallback { mediaChannelResult: RemoteMediaClient.MediaChannelResult -> if (!mediaChannelResult.status.isSuccess) { Log.e(TAG, "Failed to set the style, status code: " + mediaChannelResult.status.statusCode ) } })
remoteMediaClient.setTextTrackStyle(style) .setResultCallback(mediaChannelResult -> { if (!mediaChannelResult.getStatus().isSuccess()) { Log.e(TAG, "Failed to set the style, status code: " + mediaChannelResult.getStatus().getStatusCode()); } });
האפליקציה צריכה לאפשר למשתמשים לעדכן את הסגנון של טראקים של טקסט, באמצעות בהתאם להגדרות שסופקו על ידי המערכת או האפליקציה עצמה. ב-Android KitKat ואחר כך, אפשר להשתמש בהגדרות של הכתוביות ברמת המערכת framework:
val textTrackStyle = TextTrackStyle.fromSystemSettings(context)
TextTrackStyle textTrackStyle = TextTrackStyle.fromSystemSettings(context);
בגרסאות שקודמות ל-KitKat, הקריאה שלמעלה תחזיר אובייקט השדות אינם מוגדרים, לכן צריך לאכלס את השדות האלה באפליקציה בבחירות המשתמשים ובערכי ברירת מחדל מסוימים. אפשר לעצב את הטקסט הבא רכיבי סגנון טראק:
- צבע ושקיפות החזית (טקסט)
- צבע ושקיפות הרקע
- סוג קצה
- צבע הקצה
- גודל הגופנים
- משפחת גופנים
- סגנון הגופן
לדוגמה, מגדירים את צבע הטקסט לאדום (FF) עם 50% אטימות (80) באופן הבא:
textTrackStyle.foregroundColor = Color.parseColor("#80FF0000")
textTrackStyle.setForegroundColor(Color.parseColor("#80FF0000"));
ב-KiteKat ובגרסאות מאוחרות יותר, עליך לרשום את האפליקציה כדי לקבל הודעה
כאשר מתעדכנות ההגדרות של הכתוביות ברמת המערכת. לשם כך, צריך
להטמיע
CaptioningManager.CaptioningChangeListener
באפליקציה שלך ולרשום את המאזינים האלה באמצעות התקשרות:
CaptioningManager.addCaptioningChangeListener(yourChangeListener)
CaptioningManager.addCaptioningChangeListener(yourChangeListener);
כשהאפליקציה שלך מקבלת קריאה חוזרת שהגדרות הכתוביות השתנו,
ואז תצטרכו לחלץ את ההגדרות החדשות ולעדכן את סגנון הטקסט
כיתוב למדיה שמופעלת כרגע באמצעות התקשרות
RemoteMediaClient.setTextTrackStyle
ומעבירים בסגנון החדש.
קבלת עדכוני סטטוס
כשמספר שולחים מחוברים לאותו משדר, חשוב כל שולח יהיה מודע לשינויים אצל הנמען, גם אם השינויים האלה נשלחו משולחים אחרים.
לשם כך, האפליקציה צריכה לרשום
RemoteMediaClient.Listener
וגם
RemoteMediaClient.ProgressListener
אם
TextTrackStyle
השינויים הנוכחיים במדיה, אז כל השולחים המחוברים יקבלו הודעה
דרך שני המאזינים שרשומים למעלה. במקרה הזה, ה-SDK של המקבל
לא בודקת אם הסגנון החדש שונה מהסגנון הקודם,
מודיעה לכל השולחים המחוברים ללא קשר. אם, לעומת זאת, הסטטוס של
שינויים במסלולים הפעילים, רק RemoteMediaClient.ProgressListener
ב
השולחים המחוברים יקבלו התראה.
לעמוד בדרישות CORS
עבור סטרימינג של מדיה דינמית, כדי להשתמש ב-Google Cast נדרשת נוכחות של כותרות CORS, אבל גם קובצי mp4 פשוטים שידורי מדיה דורשים CORS אם הם כוללים טראקים. אם רוצים להפעיל את 'טראקים' עבור כל מדיה, עליך להפעיל CORS גם עבור הטראקים וגם עבור המדיה בסטרימינג. אז אם אין לך כותרות CORS זמינות למדיה פשוטה בפורמט mp4 בשרת שלכם, ולאחר מכן מוסיפים טראק פשוט של כתוביות, לא תוכלו לצורך סטרימינג של המדיה, אלא אם תעדכנו את השרת כך שיכלול את כותרת CORS. בנוסף, עליכם לאפשר לפחות את הכותרות הבאות: Content-Type, Accept-Encoding ו-range. שימו לב ששתי הכותרות האחרונות כותרות נוספות שייתכן שלא היה בהן צורך קודם.