בדף הזה מוסבר איך ליצור סשן של מקליט וידאו דיגיטלי (DVR) משידור חי באמצעות Live Stream API. אפשר לצפות בשידור חי ב-DVR גם במהלך השידור וגם אחרי שהוא מסתיים.
ההבדלים בין סשנים של DVR לבין קליפים בערוץ
סרטונים מ-DVR דומים לקליפים של ערוצים (שנקראים גם קליפים של VOD), אבל יש ביניהם כמה הבדלים חשובים:
- סשנים של DVR:
- ה-API שומר את מניפסט ה-DVR באותו מיקום שבו נשמרים פלחי השידור החי, כך שלא נדרש העתקה נוספת ל-Cloud Storage. מניפסט ה-DVR דומה למניפסט של השידור החי, אבל ארוך יותר. כשחלון השמירה מסתיים, קובץ המניפסט נמחק יחד עם קובצי הקטע.
- אפשר ליצור סשן DVR לתוכן מהעבר, מההווה ומהעתיד. לדוגמה, אפשר להפעיל סשן DVR אחרי שידור חי, או לתזמן סשן DVR שיתחיל ויסתיים במועד עתידי.
- תרחיש שימוש אופייני להפעלת DVR הוא תמיכה ביכולות DVR לאירועים בשידור חי. לדוגמה, צופה יכול להצטרף לשידור החי שעה אחרי שהוא מתחיל ולצפות בתוכן עם השהיה של שעה (או לדלג על חלקים ממנו).
- קטעי וידאו בערוץ:
- Live Stream API מעתיק את מניפסט הקליפ ואת קובצי הפלח המשויכים לספרייה שצוינה על ידי המשתמש, כך שהם לא נמחקים כשחלון השמירה מסתיים. יש לכם שליטה מלאה בקליפ.
- אפשר ליצור קליפים רק מתוכן קודם. אין תמיכה ביצירת קליפים משידורים חיים ובתזמון של קליפים עתידיים.
- תרחיש שימוש אופייני לקליפים הוא העברה לארכיון של שידור חי, כדי שהשידור החי יהיה זמין כקובץ VOD ללא הגבלת זמן.
מידע נוסף על קליפים בערוץ זמין במאמר בנושא יצירת קליפים של תוכן על פי דרישה משידור חי.
הגדרה של Google Cloud הפרויקט והאימות
אם עדיין לא יצרתם פרויקט ופרטי כניסה, כדאי לעיין במאמר לפני שמתחילים.Google Cloudיצירת נקודת קצה לקלט
כדי ליצור נקודת קצה לקלט, משתמשים בשיטה projects.locations.inputs.create.
לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:
-
PROJECT_NUMBER: מספר הפרויקט שלכם. הוא מופיע בשדה מספר הפרויקט בדף הגדרות IAM. Google Cloud -
LOCATION: המיקום שבו רוצים ליצור את נקודת הקצה של הקלט. צריך להשתמש באחד מהאזורים הנתמכיםהצגת מיקומיםus-central1us-east1us-east4us-west1us-west2northamerica-northeast1southamerica-east1asia-east1asia-east2asia-south1asia-northeast1asia-southeast1australia-southeast1europe-north1europe-west1europe-west2europe-west3europe-west4
-
INPUT_ID: מזהה שמוגדר על ידי המשתמש לנקודת הקצה החדשה של הקלט שצריך ליצור (שאליה שולחים את זרם הקלט). הערך הזה צריך לכלול בין 1 ל-63 תווים, להתחיל ולהסתיים ב-[a-z0-9], ויכול לכלול מקפים (-) בין התווים. לדוגמה,my-input.
כדי לשלוח את הבקשה צריך להרחיב אחת מהאפשרויות הבאות:
אתם אמורים לקבל תגובת JSON שדומה לזו:
{
"name": "projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_ID",
"metadata": {
"@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata",
"createTime": CREATE_TIME,
"target": "projects/PROJECT_NUMBER/locations/LOCATION/inputs/INPUT_ID",
"verb": "create",
"requestedCancellation": false,
"apiVersion": "v1"
},
"done": false
}
הפקודה הזו יוצרת פעולה ממושכת (LRO) שאפשר להשתמש בה כדי לעקוב אחרי התקדמות הבקשה. מידע נוסף זמין במאמר בנושא ניהול פעולות ממושכות .
קבלת פרטים של נקודת קצה של קלט
כדי לקבל את הפרטים של נקודת הקצה של הקלט, משתמשים בשיטה projects.locations.inputs.get.
לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:
-
PROJECT_NUMBER: מספר הפרויקט שלכם. הוא מופיע בשדה מספר הפרויקט בדף הגדרות IAM. Google Cloud -
LOCATION: המיקום של נקודת הקצה של הקלט. צריך להשתמש באחד מהאזורים הנתמכים.הצגת מיקומיםus-central1us-east1us-east4us-west1us-west2northamerica-northeast1southamerica-east1asia-east1asia-east2asia-south1asia-northeast1asia-southeast1australia-southeast1europe-north1europe-west1europe-west2europe-west3europe-west4
-
INPUT_ID: המזהה שמוגדר על ידי המשתמש לנקודת הקצה של הקלט
כדי לשלוח את הבקשה צריך להרחיב אחת מהאפשרויות הבאות:
אתם אמורים לקבל תגובת JSON שדומה לזו:
{
"name": "projects/PROJECT_NUMBER/locations/LOCATION/inputs/INPUT_ID",
"createTime": CREATE_TIME,
"updateTime": UPDATE_TIME,
"type": "RTMP_PUSH",
"uri": "INPUT_STREAM_URI", # For example, "rtmp://1.2.3.4/live/b8ebdd94-c8d9-4d88-a16e-b963c43a953b",
"tier": "HD"
}
מחפשים את השדה uri ומעתיקים את הערך שמוחזר INPUT_STREAM_URI כדי להשתמש בו בהמשך בקטע שליחת זרם קלט לבדיקה.
יצירת ערוץ
כדי ליצור ערוץ, משתמשים ב-method projects.locations.channels.create. בדוגמאות הבאות נוצר ערוץ שמפיק שידור חי בפורמט HLS. השידור החי
מורכב מגרסה אחת ברזולוציה גבוהה (1280x720).
כדי לאפשר יצירה של סשנים של הקלטה דיגיטלית, מוסיפים את האובייקט retentionConfig להגדרת הערוץ.
"retentionConfig": {
"retentionWindowDuration": {
"seconds": 86400
}
},
כשההגדרה 'שמירה' מופעלת בערוץ של שידור חי, פלחי השידור החי ומניפסט נשמרים כדי ליצור סשנים של DVR. האובייקט retentionWindowDuration מציין את משך הזמן שבו הפלט של השידור החי נשמר אחרי שהוא מועלה ל-Cloud Storage. חלון השמירה מתחיל בזמן שבו הקטע נוצר ב-Cloud Storage.
חלון השמירה מוגבל ל-30 ימים. אחרי חלון השמירה, קובצי הפלחים, מניפסט השידור החי ומניפסט ה-DVR נמחקים אוטומטית מ-Cloud Storage. אי אפשר ליצור סשנים של DVR באמצעות פלחים שנמחקו. תהליך המחיקה הוא אסינכרוני ועשוי להימשך עד 24 שעות.
מציינים מפתח למניפסט כדי להפעיל יצירה של סשן DVR. משתמשים במפתח הזה כשיוצרים את הסשן בפועל. יש תמיכה רק במניפסטים של HLS.
"manifests": [
{
...
"key": "manifest_hls"
}
לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:
-
PROJECT_NUMBER: מספר הפרויקט שלכם. הוא מופיע בשדה מספר הפרויקט בדף הגדרות IAM. Google Cloud -
LOCATION: המיקום שבו רוצים ליצור את הערוץ. צריך להשתמש באחד האזורים הנתמכיםהצגת מיקומיםus-central1us-east1us-east4us-west1us-west2northamerica-northeast1southamerica-east1asia-east1asia-east2asia-south1asia-northeast1asia-southeast1australia-southeast1europe-north1europe-west1europe-west2europe-west3europe-west4
-
CHANNEL_ID: מזהה מוגדר על ידי המשתמש של הערוץ שרוצים ליצור. הערך הזה צריך להיות באורך של 1-63 תווים, להתחיל ולהסתיים ב-[a-z0-9], ויכול להכיל מקפים (-) בין התווים -
INPUT_ID: המזהה שמוגדר על ידי המשתמש לנקודת הקצה של הקלט -
BUCKET_NAME: השם של קטגוריית Cloud Storage שיצרתם כדי לאחסן את קובץ המניפסט ואת קובצי הפלחים של השידור החי
כדי לשלוח את הבקשה צריך להרחיב אחת מהאפשרויות הבאות:
אתם אמורים לקבל תגובת JSON שדומה לזו:
{
"name": "projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_ID",
"metadata": {
"@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata",
"createTime": CREATE_TIME,
"target": "projects/PROJECT_NUMBER/locations/LOCATION/channels/CHANNEL_ID",
"verb": "create",
"requestedCancellation": false,
"apiVersion": "v1"
},
"done": false
}
הפקודה הזו יוצרת פעולה ממושכת (LRO) שאפשר להשתמש בה כדי לעקוב אחרי התקדמות הבקשה. מידע נוסף זמין במאמר בנושא ניהול פעולות ממושכות .
הפעלת הערוץ
כדי להתחיל ערוץ, משתמשים ב-method projects.locations.channels.start.
לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:
-
PROJECT_NUMBER: מספר הפרויקט שלכם. הוא מופיע בשדה מספר הפרויקט בדף הגדרות IAM. Google Cloud -
LOCATION: המיקום שבו הערוץ נמצא. צריך להשתמש באחד מהאזורים הנתמכים.הצגת מיקומיםus-central1us-east1us-east4us-west1us-west2northamerica-northeast1southamerica-east1asia-east1asia-east2asia-south1asia-northeast1asia-southeast1australia-southeast1europe-north1europe-west1europe-west2europe-west3europe-west4
-
CHANNEL_ID: מזהה מוגדר על ידי המשתמש של הערוץ
כדי לשלוח את הבקשה צריך להרחיב אחת מהאפשרויות הבאות:
אתם אמורים לקבל תגובת JSON שדומה לזו:
{
"name": "projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_ID",
"metadata": {
"@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata",
"createTime": CREATE_TIME,
"target": "projects/PROJECT_NUMBER/locations/LOCATION/channels/CHANNEL_ID",
"verb": "start",
"requestedCancellation": false,
"apiVersion": "v1"
},
"done": false
}
הפקודה הזו יוצרת פעולה ממושכת (LRO) שאפשר להשתמש בה כדי לעקוב אחרי התקדמות הבקשה. מידע נוסף זמין במאמר בנושא ניהול פעולות ממושכות .
שליחת זרם בדיקה של קלט
פותחים חלון טרמינל חדש. מריצים את הפקודה הבאה, באמצעות INPUT_STREAM_URI מהקטע קבלת פרטים על נקודת קצה של קלט:
ffmpeg -re -f lavfi -i "testsrc=size=1280x720 [out0]; sine=frequency=500 [out1]" \
-acodec aac -vcodec h264 -f flv INPUT_STREAM_URI
יצירת סשן DVR
כדי ליצור סשן של DVR, משתמשים בשיטה projects.locations.channels.dvrSessions.create.
משתמשים בשדה manifestKey במערך dvrManifests כדי לציין את המניפסט שממנו רוצים לשמור תוכן. בדוגמה של הגדרת הערוץ בדף הזה, המפתח הזה מוגדר ל-manifest_hls.
אפשר לשלב כמה קטעי זמן מהשידור החי בסשן DVR אחד על ידי הוספת אובייקטים מסוג timeInterval למערך dvrWindows.
"dvrManifests": [
{
"manifestKey": "manifest_hls"
}
],
"dvrWindows": [
{
"timeInterval": {
"startTime": "2022-07-08T23:03:20.000Z",
"endTime": "2022-07-08T23:04:20.000Z"
}
},
{
"timeInterval": {
"startTime": "2022-07-08T23:05:20.000Z",
"endTime": "2022-07-08T23:06:20.000Z"
}
}
]
שימו לב לנקודות הבאות:
- כל סשן של DVR חייב להכיל לפחות
timeIntervalאחד ב-dvrWindows. - השדה
dvrManifests.manifestKeyצריך להתייחס למניפסט HLS מוגדר בערוץ האב של סשן ה-DVR. אם הבקשה ליצירת סשן DVR מצליחה, ה-URI של מניפסט ה-DVR שנוצר מוחזר בשדהdvrManifests.outputUri. מזהה ה-URI הזה נמצא בנתיב שצוין בשדהoutputUriשל הערוץ. - מערך
dvrManifestsתומך רק במניפסט אחד לכל בקשה. אם רוצים ליצור כמה קובצי מניפסט לאותם חלונות DVR, צריך לפצל את קובצי המניפסט לכמה סשנים של DVR. - האובייקטים של
timeIntervalלא יכולים להיות חופפים והם צריכים להיות מסודרים לפי סדר כרונולוגי. התאריךstartTimeחייב להיות מוקדם יותר מהתאריךendTimeבכלtimeInterval. - המספרים
startTimeו-endTimeמתייחסים לציר הזמן של השידור החי. אם הטבעת קוד זמן מופעלת עבור מניפסט, ציר הזמן הזה מבוסס על קוד הזמן המוטבע שסופק בזרם הקלט, ועשוי להיות שונה מהשעה שמוצגת בשעון. - המשך הכולל המקסימלי של חלון ה-DVR הוא 24 שעות.
- אפשר להשאיר את
endTimeשלtimeIntervalהאחרון ב-dvrWindowsריק. במקרה הזה, הערך שלendTimeמחושב באופן אוטומטי כדי למקסם את משך הסשן של ה-DVR (כלומר, משך כולל של 24 שעות). - חלונות ה-DVR יכולים לכסות כל טווח זמן, כולל טווחים בעתיד.
עם זאת, מספר הסשנים ב-DVR עם
dvrWindowsהארכה לזמן עתידי מוגבל לאחד. - אין הגבלה על מספר הסשנים של DVR שבהם כל חלונות ה-DVR הם מהעבר.
לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:
-
PROJECT_NUMBER: מספר הפרויקט שלכם. הוא מופיע בשדה מספר הפרויקט בדף הגדרות IAM. Google Cloud -
LOCATION: המיקום שבו הערוץ נמצא. צריך להשתמש באחד מהאזורים הנתמכים.הצגת מיקומיםus-central1us-east1us-east4us-west1us-west2northamerica-northeast1southamerica-east1asia-east1asia-east2asia-south1asia-northeast1asia-southeast1australia-southeast1europe-north1europe-west1europe-west2europe-west3europe-west4
-
CHANNEL_ID: מזהה מוגדר על ידי המשתמש של הערוץ -
DVR_SESSION_ID: מזהה מוגדר על ידי המשתמש לסשן של DVR -
INTERVAL_START_TIME: חותמת הזמן של נקודת ההתחלה בפורמט Unix epoch במניפסט של השידור החי המקורי. נעשה שימוש בחותמת זמן בפורמט RFC3339 UTC (Zulu) (לדוגמה,2014-10-02T15:01:23Z) -
INTERVAL_END_TIME: חותמת הזמן של ראשית זמן יוניקס (Unix epoch) של ההפסקה במניפסט המקורי של השידור החי. נעשה שימוש בחותמת זמן בפורמט RFC3339 UTC 'Zulu' (לדוגמה,2014-10-02T15:01:23Z)
כדי לשלוח את הבקשה צריך להרחיב אחת מהאפשרויות הבאות:
אתם אמורים לקבל תגובת JSON שדומה לזו:
{
"name": "projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_ID",
"metadata": {
"@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata",
"createTime": CREATE_TIME,
"target": "projects/PROJECT_NUMBER/locations/LOCATION/channels/CHANNEL_ID/dvrSessions/DVR_SESSION_ID",
"verb": "create",
"requestedCancellation": false,
"apiVersion": "v1"
},
"done": false
}
הפקודה הזו יוצרת פעולה ממושכת (LRO) שאפשר להשתמש בה כדי לעקוב אחרי התקדמות הבקשה. מידע נוסף זמין במאמר בנושא ניהול פעולות ממושכות .
קבלת סשן DVR
כדי לקבל סשן DVR, משתמשים ב-method projects.locations.channels.dvrSessions.get.
לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:
-
PROJECT_NUMBER: מספר הפרויקט שלכם. הוא מופיע בשדה מספר הפרויקט בדף הגדרות IAM. Google Cloud -
LOCATION: המיקום שבו הערוץ נמצא. צריך להשתמש באחד מהאזורים הנתמכים.הצגת מיקומיםus-central1us-east1us-east4us-west1us-west2northamerica-northeast1southamerica-east1asia-east1asia-east2asia-south1asia-northeast1asia-southeast1australia-southeast1europe-north1europe-west1europe-west2europe-west3europe-west4
-
CHANNEL_ID: מזהה מוגדר על ידי המשתמש של הערוץ -
DVR_SESSION_ID: מזהה מוגדר על ידי המשתמש לסשן של DVR
כדי לשלוח את הבקשה צריך להרחיב אחת מהאפשרויות הבאות:
אתם אמורים לקבל תגובת JSON שדומה לזו:
{
"name": "projects/PROJECT_NUMBER/locations/LOCATION/channels/CHANNEL_ID/dvrSessions/DVR_SESSION_ID",
"createTime": CREATE_TIME,
"startTime": START_TIME,
"updateTime": UPDATE_TIME,
"state": "SUCCEEDED",
"dvrManifests": [
{
"manifestKey": "manifest_hls",
"outputUri": "gs://BUCKET_NAME/dvr/DVR_SESSION_ID/main.m3u8"
}
],
"dvrWindows": [
{
"timeInterval": {
"startTime": "INTERVAL_START_TIME",
"endTime": "INTERVAL_END_TIME"
}
}
]
}
התשובה צריכה להכיל את השדה state שמציין את מצב הסשן:
{
...
"state": "PENDING" // DVR session is waiting to be processed (for example, it is waiting for the channel to start)
...
}
אפשר לראות את רשימת הסטטוסים והתיאורים שלהם במאמרי העזרה של state.
אימות התוכן של דלי
פותחים את קטגוריית Cloud Storage שצוינה בשדה dvrManifests.outputUri של סשן ה-DVR. מוודאים שהוא מכיל את הקבצים והספריות הבאים:
- מניפסט ברמה העליונה של סשן ה-DVR עם אותו שם כמו
manifests.fileNameשצוין בהגדרות הערוץ (לדוגמה,main.m3u8). אפשר להפעיל את המניפסט הזה באמצעות נגן מדיה אונליין. - ספריית משנה לכל
muxStreams.keyשצוין בערוץ (לדוגמה,mux_video_ts). כל ספריית משנה מכילה רשימת השמעה של סשן ה-DVR (לדוגמה,index-1.m3u8).
הפעלת סשן ה-DVR
כדי להפעיל את קובץ המדיה שנוצר ב-Shaka Player, מבצעים את השלבים הבאים:
- הפיכת הקטגוריה של Cloud Storage שיצרתם לקריאה באופן ציבורי.
- כדי להפעיל שיתוף משאבים בין מקורות (CORS) בקטגוריה של Cloud Storage, מבצעים את הפעולות הבאות:
- יוצרים קובץ JSON שמכיל את הפרטים הבאים:
[ { "origin": ["https://shaka-player-demo.appspot.com/"], "responseHeader": ["Content-Type", "Range"], "method": ["GET", "HEAD"], "maxAgeSeconds": 3600 } ] -
מריצים את הפקודה הבאה אחרי שמחליפים את
JSON_FILE_NAMEבשם של קובץ ה-JSON שיצרתם בשלב הקודם:gcloud storage buckets update gs://BUCKET_NAME --cors-file=JSON_FILE_NAME.json
- יוצרים קובץ JSON שמכיל את הפרטים הבאים:
- בקטגוריה של Cloud Storage, מוצאים את הקובץ שנוצר. לוחצים על העתקת כתובת URL בעמודה גישה ציבורית של הקובץ.
- עוברים אל Shaka Player, נגן שידורים חיים באינטרנט.
- בסרגל הניווט העליון, לוחצים על תוכן בהתאמה אישית.
- לוחצים על הלחצן +.
מדביקים את כתובת ה-URL הציבורית של הקובץ בתיבה Manifest URL (כתובת ה-URL של קובץ המניפסט).

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