סטרימינג בשידור חי

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

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

דרישות מוקדמות

היכרות עם העקרונות הבסיסיים של הטמעת תג לפני הבדיקה של הבקשה הזו, נדרש מקלט אינטרנט מותאמת אישית. בנוסף, כדי להריץ את דוגמאות הקוד נדרשת גישה שעומד בדרישות של סוגי מדיה שנתמכים בהעברה (cast). באופן כללי, התכונה 'בשידור חי' תומך בהגדרות אופייניות של שידורים חיים מדיה נתמכת.

המונחים הבאים משמשים לאורך המדריך:

  • חלון שניתן לצפות בו – הטווח של שידור חי שהמשתמשים יכולים לחפש בו.
  • Live Edge – החלק החדש ביותר בשידור החי שזמין לנגן.
  • Play Head – חותמת זמן של ממשק המשתמש עבור מיקום ההפעלה הנוכחי.

הפעלת Cast של שידור חי

יש שתי דרכים להגדיר את Web Acceptr SDK לשימוש ב-Live API לצורך content:

  1. באמצעות יירוט ההודעות LOAD באפליקציה של מקלט האינטרנט. (מומלץ)
  2. באמצעות בקשת טעינה בצד השולח או בצד המקבל.

מיירט LoadRequestData אובייקט שמכיל את כל המטא-נתונים החשובים שקשורים לבקשת טעינה. שפת תרגום לציין שבקשת הטעינה היא לשידור חי, פשוט מגדירים את streamType ב mediaInformation להתנגד StreamType.LIVE. הערך של MediaInformation.duration צריך להיות -1 כי מופעי הנגן אחראי לחשב אותו כשהתוכן הוא LIVE.

/*
* This interceptor is called before your content is loaded by a Cast device
*/
playerManager.setMessageInterceptor(
   cast.framework.messages.MessageType.LOAD,
   request => { /* cast.framework.messages.LoadRequestData */
       request.media.streamType = cast.framework.messages.StreamType.LIVE;
   return request;
});

הוספת נתונים של מדריך התוכניות

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

אפשר להגדיר את נתוני המדריך הראשוני עבור מקור נתונים בהודעת LOAD מכשיר יירוט, באותו אופן שבו ציינו שהשידור היה שידור חי לדוגמה הקודמת. חלק מהתוכניות או הקטעים הנפרדים בשידור החי מיוצג בתור MediaMetadata ולאחר מכן מאוחסנים להבא. יש כיתה שונה ב-MediaMetadata לסוגים שונים של תוכניות – למשל TvShowMediaMetadata, MovieMediaMetadata, MusicTrackMediaMetadata, וכו'

בקטע הקוד הבא, אנחנו משתמשים באובייקט MediaMetadata כדי לציין שעת ההתחלה של כל תוכנית עם UNIX Timestamp עם sectionStartAbsoluteTime לנכס. משך הזמן של תוכנית מיוצג בשניות.

// The metadata for a single TV show
const currentShow = new cast.framework.messages.TvShowMediaMetadata();
currentShow.episode = 15;
currentShow.seriesTitle = 'The Odyssey';
currentShow.title = 'Scylla and Charybdis';
currentShow.sectionStartAbsoluteTime = toUnixTimestamp('9:00 PM');
currentShow.sectionDuration = HOUR_IN_SECONDS;

const previousShow = new ...;
const nextShow = new ...;

const containerMetadata = new cast.framework.messages.ContainerMetadata();
containerMetadata.title = 'My TV Channel';
containerMetadata.sections = [previousShow, currentShow, nextShow];

playerManager.getQueueManager().setContainerMetadata(containerMetadata);

טווח ניתן לחיפוש בזמן אמת

ה-SDK של Cast כולל רכיבים בממשק המשתמש ופקדים שמאפשרים למשתמש להעביר את המיקום הנוכחי בתוך הזרם באמצעות בקר מורחב או מקשי מגע במכשירים שתומכים במגע.

LiveSeekableRange מייצג את טווח הזמן בזרם שבו המשתמש יכול לחפש. ב במקלט האינטרנט תוכלו לגשת למידע על הטווח המבוקש דרך PlayerManager.getLiveSeekableRange() שמחזירה LiveSeekableRange לאובייקט. המאפיינים העיקריים באובייקט שצריך לשים לב אליהם:

  • start – זמן ההתחלה (בשניות) של הטווח ביחס תחילת השידור בשניות.
  • end – משך הזמן המקסימלי האפשרי (בשניות) שהנגן יכול להריץ. על סמך הפלחים הזמינים, ביחס להתחלת השידור.
  • isMovingWindow – ערך בוליאני שמציין אם הטווח המבוקש תנועות (כלומר, קטעים ישנים יותר הוסרו מהמניפסט) עם הסטרימינג, הערך הזה צריך להיות נכון לכל השידורים החיים.
  • isLiveDone – ערך בוליאני שמציין אם לשידור החי הסתיימה, כלומר לא נוצרים פלחים חדשים.

הגודל של הטווח הניתן לחיפוש, מיוצג כזמן בין start לבין end, נקבע על סמך מספר הקטעים הזמינים בשידור, לזוז עם הזרם. לדוגמה, אם, בתחילת הסטרימינג, הקובץ המבוקש הטווח הוא {start:0, end: 600, isMovingWindow: false, isLiveDone: false}, 10 מספר השניות לאחר התחלת השידור יכול להיות {start: 10, end: 610, isMovingWindow: true, isLiveDone: false}. חשוב לציין שההתחלה זמני הסיום בטווח המבוקש מתעדכנים על סמך הזמן שנדרש כדי ליצור פלח חדש. כלומר, אם האורך הטיפוסי של קטע עבור השידור שלך הוא 10 שניות, זמני ההתחלה והסיום יעודכנו כל 10 שניות בערך נו.

השבתת הדילוג

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

// disable seeking in the LOAD messageInterceptor
playerManager.removeSupportedMediaCommands(cast.framework.messages.Command.SEEK, true);

הסרה של פקודת המדיה הנתמכת לאותות SEEK לאפליקציות שולח ובצגי המגע כדי להשבית את הדילוג, אבל לא להשבית פקודות קוליות כמו בתור 'Ok google, מאפיינים של 30 שניות אחורה'. פקודות מדיה נתמכות עם קול מדריך לפרטים על השבתת פקודות מדיה לשימוש בקול.

אירועים בשידור חי של framework

שני אירועים, LIVE_ENDED ו-LIVE_IS_MOVING_WINDOW_CHANGED, כלולים ב ממשק ה-API בזמן אמת. שני האירועים מועברים LiveStatusEvent שמכיל את הטווח הנוכחי לחיפוש בזמן אמת.

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

מצבים בשידור החי

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

  • שעת ההתחלה של השידור
  • שעת הסיום של השידור החי
  • המשתמשים יכולים לבצע דילוג במסגרת החלון של השידור החי

כדי ללמוד איך להגדיר, ראו הוספת נתונים במדריך התוכניות את הערכים האלה.

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

שעת ההתחלה שעת סיום דילוג T1 T2
תרחיש 1 לא לא לא ראש Play לא מוצג
תרחיש 2 לא לא כן Play Head לא מוצג
תרחיש 3 לא כן לא Play Head לא מוצג
תרחיש 4 לא כן כן Play Head לא מוצג
תרחיש 5 כן לא לא הצגת מועד ההתחלה Play Head
תרחיש 6 כן לא כן הצגת מועד ההתחלה Play Head
תרחיש 7 כן כן לא הצגת שעת ההתחלה הצגת שעת הסיום
תרחיש 8 כן כן כן הצגת שעת ההתחלה הצגת שעת הסיום

תרחיש 1

שעת ההתחלה שעת סיום דילוג T1 T2
לא לא לא הפעלת הראש לא מוצג

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

תרחיש 7

טלוויזיה שמציגה את ממשק המשתמש בשידור חי של Chromecast בתרחיש 7 עם זמן שעון טלפון נייד שמוצג בו ממשק המשתמש בשידור חי של תרחיש 7 עם זמן שעון

שעת ההתחלה שעת סיום דילוג T1 T2
כן כן לא ראש Play משך התוכנית

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

תרחיש שמונה

טלוויזיה שמציגה את ממשק המשתמש בשידור חי של Chromecast בתרחיש 8 עם זמן שעון טלפון נייד שמוצג בו ממשק המשתמש בשידור חי של תרחיש 8 עם זמן שעון

שעת ההתחלה שעת סיום דילוג T1 T2
כן כן כן ראש Play משך התוכנית

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

הגדרת תרחיש

הגדרת השידור כתרחיש ספציפי של שידור חי מתבצעת בשלושה חלקים:

  1. הגדרת סוג סטרימינג – סימון השידור כ בשידור חי.
  2. הוספת נתונים של מדריך התוכניות – הגדרת שעת התחלה ומשך הזמן באובייקט MediaMetadata.
  3. הגדרה של פונקציונליות דילוג – הפעלה או להשבית את הדילוג.

התנהגות ההפעלה

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

שידורים שאפשר לחפש

לאחר המשך זרם שרוצים לחפש:

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

דילוג אל LiveSeekableRange.end כדי להמשיך את ההפעלה בקצה הפעיל לאחר ביטול ההשהיה.

let playerManager = cast.framework.CastReceiverContext.getInstance().getPlayerManager();
// Intercept the message to PLAY
playerManager.setMessageInterceptor(cast.framework.messages.MessageType.PLAY, (requestData) => {
  ...
  if (playerManager.getLiveSeekableRange()) {
    // Resume playback at the live edge
    playerManager.seek(playerManager.getLiveSeekableRange().end);
  } else {
    return requestData;
  }
  ...
});

שידורים שלא ניתן לחפש

לאחר המשך של זרם שלא ניתן לחיפוש:

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

שינויים בפלטפורמת ה-API התאמה אישית של ממשק המשתמש בזמן אמת

ב-Cast SDK יש תמיכה מובנית ביצירת ממשקי משתמש מותאמים אישית במקום באמצעות ממשק המשתמש המובנה. עם זאת, חשוב לפעול לפי רשימת משימות לעיצוב חוויית המשתמש (cast) במהלך התאמה אישית של גרפי.

מקלט אינטרנט

במקלט האינטרנט, PlayerData כולל את השדות הבאים כדי לאפשר למפתחים להרחיב ממשקים לשידורים חיים:

  • isLive – דגל שמציין אם השידור הנוכחי הוא שידור חי, בניגוד ל-VOD.
  • liveSeekableRange – הטווח שרוצים להציג בסימון המסך חלון ה-DVR.
  • mediaStartAbsoluteTime – התאריך שבו הקטע התחיל בזמן מוחלט (UNIX Epoch)
  • sectionStartTimeInMedia – שעת ההתחלה של הקטע בשניות ביחס שעת ההתחלה של המדיה.
  • sectionDuration – משך הקטע בשניות.

חשוב גם להביא בחשבון את שני אירועים בשידור חי להתאמה אישית של ממשק המשתמש.

Android SDK

כחלק מהפונקציונליות של השידור החי, השימוש בווידג'ט סרגל הדילוג של Android ההוראה UIMediaController הוצאה משימוש. במקומה צריך להשתמש במדיניות CastSeekBar.