שימוש בטראקים של מדיה

MediaTrack מייצג טראק של מדיה, שיכול להיות שידור אודיו, שידור וידאו או טקסט (למשל, כתוביות). האפליקציה יכולה לקבץ, לעצב ולהפעיל טראקים של מדיה.

הגדרת טראק

אפשר להגדיר מסלול ולהקצות לו מזהה ייחודי. את הקוד הבא יוצרת רצועת טקסט באנגלית, רצועת טקסט בצרפתית ורצועת אודיו בצרפתית, לכל אחד מהם מזהה משלו:

Kotlin
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()
Java
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 בצורה הזו לפני שהיא נטענת את המדיה למקלט.

Kotlin
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()
Java
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[]) והעברת המזהים של המסלולים להפעלה. בדוגמה הזו מפעילים את כתובית בצרפתית ואודיו בצרפתית:

Kotlin
// 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
                    )
                }
    })
Java
// 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 כך:

Kotlin
// 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
                    )
                }
    })
Java
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:

Kotlin
val textTrackStyle = TextTrackStyle.fromSystemSettings(context)
Java
TextTrackStyle textTrackStyle = TextTrackStyle.fromSystemSettings(context);

בגרסאות שקודמות ל-KitKat, הקריאה שלמעלה תחזיר אובייקט השדות אינם מוגדרים, לכן צריך לאכלס את השדות האלה באפליקציה בבחירות המשתמשים ובערכי ברירת מחדל מסוימים. אפשר לעצב את הטקסט הבא רכיבי סגנון טראק:

  • צבע ושקיפות החזית (טקסט)
  • צבע ושקיפות הרקע
  • סוג קצה
  • צבע הקצה
  • גודל הגופנים
  • משפחת גופנים
  • סגנון הגופן

לדוגמה, מגדירים את צבע הטקסט לאדום (FF) עם 50% אטימות (80) באופן הבא:

Kotlin
textTrackStyle.foregroundColor = Color.parseColor("#80FF0000")
Java
textTrackStyle.setForegroundColor(Color.parseColor("#80FF0000"));

ב-KiteKat ובגרסאות מאוחרות יותר, עליך לרשום את האפליקציה כדי לקבל הודעה כאשר מתעדכנות ההגדרות של הכתוביות ברמת המערכת. לשם כך, צריך להטמיע CaptioningManager.CaptioningChangeListener באפליקציה שלך ולרשום את המאזינים האלה באמצעות התקשרות:

Kotlin
CaptioningManager.addCaptioningChangeListener(yourChangeListener)
Java
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. שימו לב ששתי הכותרות האחרונות כותרות נוספות שייתכן שלא היה בהן צורך קודם.