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

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()
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 באופן הזה כדי לטעון את המדיה למקלט.

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

קוטלין
// 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, באופן הבא:

קוטלין
// 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:

קוטלין
val textTrackStyle = TextTrackStyle.fromSystemSettings(context)
Java
TextTrackStyle textTrackStyle = TextTrackStyle.fromSystemSettings(context);

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

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

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

קוטלין
textTrackStyle.foregroundColor = Color.parseColor("#80FF0000")
Java
textTrackStyle.setForegroundColor(Color.parseColor("#80FF0000"));

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

קוטלין
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. שימו לב ששתי הכותרות האחרונות הן כותרות נוספות שאולי לא הייתם צריכים אותן בעבר.