הפסקות למודעות
ה-SDK של Web Sender תומך בהפסקות למודעות ובמודעות נלוות זרם מדיה נתון.
לצפייה סקירה כללית של הפסקות למודעות אצל מקלטי אינטרנט מידע על אופן הפעולה של הפסקות למודעות.
אפשר לציין הפסקות גם אצל השולח וגם אצל המקבל, אבל מומלץ שהן יופיעו שצוינו ב-Web Acceptr המקלט של Android TV לשמירה על עקביות התנהגות המשתמשים בפלטפורמות שונות.
באינטרנט, מציינים הפסקות למודעות בפקודת טעינה באמצעות
BreakClip
וגם Break
:
let breakClip1 = new BreakClip('bc0');
breakClip1.title = 'Clip title'
breakClip1.posterUrl = 'https://www.some.url';
breakClip1.duration = 60;
breakClip.whenSKippable = 5;
let breakClip2 = ...
let breakClip3 = ...
let break1 = new Break('b0', ['bc0', 'bc1', 'bc2'], 10);
let mediaInfo = new chrome.cast.media.MediaInfo(<contentId>, '<contentType');
...
mediaInfo.breakClips = [breakClip1, breakClip2, breakClip3];
mediaInfo.breaks = [break1];
let request = new chrome.cast.media.LoadRequest(mediaInfo);
cast.framework.CastContext.getInstance().getCurrentSession().loadMedia(request)
שימוש בממשקי ה-API למעקב
טראק יכול להיות אובייקט טקסט (כתוביות) או שידור אודיו או וידאו. לאובייקט. ממשקי ה-API של מסלולים מאפשרים לעבוד עם האובייקטים האלו באפליקציה.
אובייקט Track
מייצג מסלול ב-SDK. אפשר להגדיר מסלול ולהקצות מזהה ייחודי
כך:
var englishSubtitle = new chrome.cast.media.Track(1, // track ID
chrome.cast.media.TrackType.TEXT);
englishSubtitle.trackContentId = 'https://some-url/caption_en.vtt';
englishSubtitle.trackContentType = 'text/vtt';
englishSubtitle.subtype = chrome.cast.media.TextTrackType.SUBTITLES;
englishSubtitle.name = 'English Subtitles';
englishSubtitle.language = 'en-US';
englishSubtitle.customData = null;
var frenchSubtitle = new chrome.cast.media.Track(2, // track ID
chrome.cast.media.TrackType.TEXT);
frenchSubtitle.trackContentId = 'https://some-url/caption_fr.vtt';
frenchSubtitle.trackContentType = 'text/vtt';
frenchSubtitle.subtype = chrome.cast.media.TextTrackType.SUBTITLES;
frenchSubtitle.name = 'French Subtitles';
frenchSubtitle.language = 'fr';
frenchSubtitle.customData = null;
var frenchAudio = new chrome.cast.media.Track(3, // track ID
chrome.cast.media.TrackType.AUDIO);
frenchAudio.trackContentId = 'trk0001';
frenchAudio.trackContentType = 'audio/mp3';
frenchAudio.subtype = null;
frenchAudio.name = 'French Audio';
frenchAudio.language = 'fr';
frenchAudio.customData = null;
לפריט מדיה יכולים להיות מספר טראקים. לדוגמה, יכולים להיות בו כמה כתוביות (כל אחת בשפה אחרת) או מספר שידורי אודיו חלופיים (בשפות שונות).
MediaInfo
הוא המחלקה שמשמשת לבניית פריט מדיה. כדי לשייך אוסף של
Track
עם פריט מדיה, מעדכנים אותו
tracks
לנכס. צריך לבצע את השיוך הזה לפני שהמדיה
נטען למקלט:
var tracks = [englishSubtitle, frenchSubtitle, frenchAudio];
var mediaInfo = new chrome.cast.media.MediaInfo(mediaURL);
mediaInfo.contentType = 'video/mp4';
mediaInfo.metadata = new chrome.cast.media.GenericMediaMetadata();
mediaInfo.customData = null;
mediaInfo.streamType = chrome.cast.media.StreamType.BUFFERED;
mediaInfo.textTrackStyle = new chrome.cast.media.TextTrackStyle();
mediaInfo.duration = null;
mediaInfo.tracks = tracks;
אפשר להגדיר את המסלולים הפעילים במדיה
activeTrackIds
בקשה.
אפשר גם להפעיל טראק אחד או יותר ששויכו למדיה
פריט, לאחר טעינת המדיה, על ידי התקשרות
EditTracksInfoRequest(opt_activeTrackIds, opt_textTrackStyle)
והעברת המזהים של המסלולים להפעלה ב-opt_activeTrackIds
. הערה:
שני הפרמטרים הם אופציונליים, ואפשר לבחור איזה מהם (טראקים פעילים או סגנונות)
שתקבעו לפי שיקול דעתכם. לדוגמה, כך
הפעלת הכתובית בצרפתית (2
) ואודיו בצרפתית (3
):
var activeTrackIds = [2, 3];
var tracksInfoRequest = new chrome.cast.media.EditTracksInfoRequest(activeTrackIds);
media.editTracksInfo(tracksInfoRequest, successCallback, errorCallback);
כדי להסיר את כל הטראקים של אודיו או וידאו מהמדיה הנוכחית, פשוט מגדירים
mediaInfo.tracks=null
(מערך ריק) ולטעון מחדש את המדיה.
כדי להסיר את כל רצועות הטקסט מהמדיה הנוכחית (לדוגמה, כיבוי כתוביות), מבצעים אחת מהפעולות הבאות:
- יש לעדכן את
var activeTrackIds = [2, 3];
(הוצג בעבר) כדי שיהיה אפשר כולל [3] בלבד, את טראק האודיו. - הגדרה של
mediaInfo.tracks=null
. שימו לב שאין צורך כדי להשבית את הכתוביות המיידיות, צריך לטעון מחדש את המדיה (track.hidden
). שליחת מערךactiveTracksId
שלא מכילtrackId
שהופעל בעבר משבית את רצועת הטקסט.
עיצוב טראקים של טקסט
TextTrackStyle
הוא האובייקט שמקיף את פרטי העיצוב של טראק הטקסט. אחרי
יצירה או עדכון של אובייקט TextTrackStyle
קיים, אפשר להחיל אותו על
לפריט המדיה שפועל כרגע באמצעות קריאה
editTrackInfo
למשל:
var textTrackStyle = new chrome.cast.media.TextTrackStyle();
var tracksInfoRequest = new chrome.cast.media.EditTracksInfoRequest(textTrackStyle);
media.editTracksInfo(tracksInfoRequest, successCallback, errorCallback);
אתם יכולים לעקוב אחרי סטטוס הבקשה בעזרת התוצאות של הקריאה החוזרת (callback), הצלחה או שגיאה, ולעדכן את השולח המקורי בהתאם.
האפליקציות צריכות לאפשר למשתמשים לעדכן את הסגנון של רצועות הטקסט, באמצעות ההגדרות שסופקו על ידי המערכת או האפליקציה עצמה.
ניתן לעצב את רכיבי הסגנון הבאים של רצועת טקסט:
- צבע ושקיפות החזית (טקסט)
- צבע ושקיפות הרקע
- סוג קצה
- צבע הקצה
- גודל הגופנים
- משפחת גופנים
- סגנון הגופן
לדוגמה, אפשר להגדיר את צבע הטקסט לאדום עם שקיפות של 75% באופן הבא:
var textTrackStyle = new chrome.cast.media.TextTrackStyle();
textTrackStyle.foregroundColor = '#80FF0000';
בקרת עוצמת הקול
אפשר להשתמש
RemotePlayer
ו-
RemotePlayerController
כדי להגדיר את עוצמת הקול של המקלט.
function changeVolume(newVolume) {
player.volumeLevel = newVolume;
playerController.setVolumeLevel();
// Update sender UI to reflect change
}
אפליקציית השולח צריכה לפעול בהתאם להנחיות הבאות לשליטה בנפח השליחה:
- האפליקציה של השולח חייבת להסתנכרן עם המקבל כדי
בממשק המשתמש של השולח תמיד מדווח על הנפח לפי הנמען. משתמשים ב
RemotePlayerEventType.VOLUME_LEVEL_CHANGED
והקבוצה קריאה חוזרת שלRemotePlayerEventType.IS_MUTED_CHANGED
כדי לשמור עוצמת הקול אצל השולח. עדכוני סטטוס אפשר לקבל מידע נוסף. - אפליקציות שולח לא יכולות להגדיר את עוצמת הקול ברמה ספציפית ומוגדרת מראש או להגדיר את עוצמת הקול לעוצמת הצלצול/מדיה של המכשיר של השולח כאשר שהאפליקציה נטענת במקלט.
צפייה אמצעי בקרה של עוצמת הקול לשולחים ברשימת המשימות לעיצוב.
שליחת הודעות מדיה למקבל
ניתן לשלוח Media Messages
מהשולח אל
הנמען. לדוגמה, כדי לשלוח הודעת SKIP_AD
למקבל התשלום:
// Get a handle to the skip button element
const skipButton = document.getElementById('skip');
skipButton.addEventListener("click", function() {
if (castSession) {
const media = castSession.getMediaSession();
castSession.sendMessage('urn:x-cast:com.google.cast.media', {
type: 'SKIP_AD',
requestId: 1,
mediaSessionId: media.mediaSessionId
});
}
});
עדכוני סטטוס
כשמספר שולחים מחוברים לאותו משדר, חשוב כל שולח יהיה מודע לשינויים אצל הנמען, גם אם השינויים האלה נשלחו משולחים אחרים.
לשם כך, על האפליקציה לרשום את כל המאזינים הנחוצים
RemotePlayerController
אם
TextTrackStyle
השינויים הנוכחיים במדיה, אז כל השולחים המחוברים יקבלו הודעה
והמאפיינים התואמים של סשן המדיה הנוכחי, כמו
activeTrackIds
ו-textTrackStyle
MediaInfo
יישלח לשולחים בשיחות חוזרות. במקרה הזה, ה-SDK של המקבל
לא בודקת אם הסגנון החדש שונה מהסגנון הקודם,
מודיעה לכל השולחים המחוברים ללא קשר.
מחוון התקדמות
הצגת מיקום ההפעלה עם אינדיקטור התקדמות על השולח היא דרישה לרוב האפליקציות. ממשקי ה-API של Cast משתמשים בפרוטוקול המדיה של Cast, מבצע אופטימיזציה של צריכת רוחב הפס במקרה הזה ובתרחישים אחרים, כך שלא תצטרכו להטמיע סנכרון סטטוס משלכם. להטמעה נכונה של אינדיקטור התקדמות להפעלת מדיה באמצעות ממשקי ה-API, אפליקציה לדוגמה של Castvideos-chrome.
דרישות CORS
עבור סטרימינג של מדיה אדפטיבי, ל-Google Cast נדרשת נוכחות של כותרות CORS, אבל גם שידורי מדיה פשוטים בפורמט mp4 דורשים CORS אם הם כוללים טראקים. אם אם רוצים להפעיל טראקים לכל סוג מדיה, צריך להפעיל CORS בשני הטראקים הסטרימינג והזרמי מדיה. אז אם אין לכם כותרות CORS זמינות למדיה פשוטה בפורמט mp4 בשרת שלך, ולאחר מכן מוסיפים כותרת משנה פשוטה אין אפשרות לשדר את המדיה, אלא אם מעדכנים את השרת כדי לכלול את כותרות ה-CORS המתאימות.
הכותרות האלה נדרשות: Content-Type
, Accept-Encoding
ו-Range
.
לתשומת ליבך, שתי הכותרות האחרונות, Accept-Encoding
ו-Range
, הן נוספות
כותרות שייתכן שלא היה בהן צורך קודם.
תווים כלליים לחיפוש "*" לא ניתן להשתמש בו עבור הכותרת Access-Control-Allow-Origin
. אם המיקום
הדף מכיל תוכן מדיה מוגן, עליו להשתמש בדומיין במקום
תו כללי לחיפוש.
המשך סשן בלי לטעון מחדש את דף האינטרנט
כדי להמשיך להשתמש ב-CastSession
קיים, צריך להשתמש ב-
requestSessionById(sessionId)
sessionId
של הפעילות שאליה ניסית להצטרף.
אפשר למצוא את sessionId
ב-CastSession
הפעיל באמצעות
getSessionId()
אחרי השיחה
loadMedia()
.
הגישה המומלצת היא:
- שיחת טלפון
loadMedia()
כדי להתחיל את הסשן - אחסון של
sessionId
באופן מקומי - אפשר להצטרף מחדש לסשן באמצעות
requestSessionById(sessionId)
בעת הצורך
let sessionId;
function rejoinCastSession() {
chrome.cast.requestSessionById(sessionId);
// Add any business logic to load new content or only resume the session
}
document.getElementById('play-button').addEventListener(("click"), function() {
if (sessionId == null) {
let castSession = cast.framework.CastContext.getInstance().getCurrentSession();
if (castSession) {
let mediaInfo = createMediaInfo();
let request = new chrome.cast.media.LoadRequest(mediaInfo);
castSession.loadMedia(request)
sessionId = CastSession.getSessionId();
} else {
console.log("Error: Attempting to play media without a Cast Session");
}
} else {
rejoinCastSession();
}
});
השלבים הבאים
הגענו למסקנה שאפשר להוסיף לאפליקציית Web Sender. עכשיו אפשר לפתח אפליקציית שולח לפלטפורמה אחרת (Android או iOS), או לפתח אפליקציית מקלט.