יצירת סשן DVR

בדף הזה מוסבר איך ליצור סשן של מקליט וידאו דיגיטלי (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-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-south1
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-north1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-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-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-south1
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-north1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-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-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-south1
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-north1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-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-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-south1
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-north1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-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-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-south1
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-north1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-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-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-south1
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-north1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-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, מבצעים את השלבים הבאים:

  1. הפיכת הקטגוריה של Cloud Storage שיצרתם לקריאה באופן ציבורי.
  2. כדי להפעיל שיתוף משאבים בין מקורות (CORS) בקטגוריה של Cloud Storage, מבצעים את הפעולות הבאות:
    1. יוצרים קובץ JSON שמכיל את הפרטים הבאים:
      [
        {
          "origin": ["https://shaka-player-demo.appspot.com/"],
          "responseHeader": ["Content-Type", "Range"],
          "method": ["GET", "HEAD"],
          "maxAgeSeconds": 3600
        }
      ]
    2. מריצים את הפקודה הבאה אחרי שמחליפים את JSON_FILE_NAME בשם של קובץ ה-JSON שיצרתם בשלב הקודם:
      gcloud storage buckets update gs://BUCKET_NAME --cors-file=JSON_FILE_NAME.json
  3. בקטגוריה של Cloud Storage, מוצאים את הקובץ שנוצר. לוחצים על העתקת כתובת URL בעמודה גישה ציבורית של הקובץ.
  4. עוברים אל Shaka Player, נגן שידורים חיים באינטרנט.
  5. בסרגל הניווט העליון, לוחצים על תוכן בהתאמה אישית.
  6. לוחצים על הלחצן +.
  7. מדביקים את כתובת ה-URL הציבורית של הקובץ בתיבה Manifest URL (כתובת ה-URL של קובץ המניפסט).

  8. מקלידים שם בתיבה שם.

  9. לוחצים על Save.

  10. לוחצים על הפעלה.

תבנית בדיקה תופעל כשידור חי.

סרטון עם דפוס בדיקה

אירועים של הפסקות למודעות

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