סטרימינג בשידור חי ב-Google Cloud עם Media CDN ו-Live Streaming API

1. מבוא

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

מה תלמדו

במעבדה הזו נלמד איך לפרוס סביבת עבודה לסטרימינג בשידור חי באמצעות Media CDN (CDN) + Cloud Media Live Streaming API (המרת קידוד וידאו בשידור חי) + Cloud Storage (אחסון הסרטונים) + Video Player (VLC,‏ Google Shaka Player וכו' – נגן וידאו מוכן ל-HLS + MPEG-DASH).

אנחנו נגדיר את רכיבי ה-API של השידור החי – Input (קלט) ו-Channel (ערוץ) – ונתחיל פיד פעיל אל ה-Input/Channel באמצעות FFmpeg (אפשר ליצור אות בדיקה בשידור חי באמצעות FFmpeg). ‫Live Streaming API יבצע המרה של הפיד הפעיל. מניפסט הסרטון והקטעים שלו אחרי הקידוד יאוחסנו בקטגוריה של Cloud Storage. לאחר מכן נגדיר את Media CDN עם קטגוריית Cloud Storage של וידאו בשידור חי כמקור. לבסוף, נשתמש ב-VLC Player כדי להפעיל תוכן בשידור חי שנשמר במטמון באמצעות Media CDN. בנוסף, נגדיר לוח בקרה של Cloud Monitoring כדי להציג את הפעילות של Media CDN.

מה תפַתחו

בשיעור ה-Lab הזה נגדיר את הסביבה על סמך הארכיטקטורה הבאה:

de33cb3e75d52549.png

במסגרת שיעור ה-Lab הזה נגדיר את הרכיבים הבאים ונבצע את המשימות הבאות:

  • יצירת קטגוריה של Google Cloud Storage (GCS) לאחסון סרטוני הווידאו שמתומללים בזמן אמת
  • הגדרת Live Streaming API לקידוד מחדש של הסרטון למספר פורמטים: HLS + MPEG DASH, ‏ SD ו-HD
  • הגדרת רכיבי השידור החי: קלט/ערוץ
  • הפעלת הערוץ של השידור החי
  • הגדרה של Media CDN באמצעות קטגוריית GCS כמקור
  • הגדרת FFmpeg להזנת הערוץ בשידור חי
  • הפעלת הסטרימינג של הפיד הפעיל שהומר קידודו באמצעות נגן וידאו
  • הגדרה של מרכז בקרה ב-Cloud Monitoring למעקב אחרי הפעילות ב-Media CDN (זמן אחזור, מציאה במטמון (cache hit), אי מציאה במטמון וכו')

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

כל פעולות ההגדרה יתבצעו דרך שורת הפקודה ב-Cloud Shell. תמיד אפשר לבדוק במסוף את הרכיבים שהוגדרו באמצעות שורת הפקודה. במהלך שיעור ה-Lab, נראה רמזים שיפנו אותנו אל מסוף Google Cloud.

‫2. לפני שמתחילים

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

3. הגדרה ודרישות

מפעילים את Cloud Shell

אפשר להפעיל את Google Cloud מרחוק מהמחשב הנייד, אבל ב-codelab הזה תשתמשו ב-Google Cloud Shell, סביבת שורת פקודה שפועלת בענן.

ב-מסוף Google Cloud, לוחצים על סמל Cloud Shell בסרגל הכלים שבפינה הימנית העליונה:

55efc1aaa7a4d3ad.png

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

7ffe5cbb04455448.png

המכונה הווירטואלית הזו כוללת את כל הכלים שדרושים למפתחים. יש בה ספריית בית בנפח מתמיד של 5GB והיא פועלת ב-Google Cloud, מה שמשפר מאוד את הביצועים והאימות ברשת. אפשר לבצע את כל העבודה ב-codelab הזה בדפדפן. לא צריך להתקין שום דבר.

4. גרסת Google Cloud SDK

בזמן כתיבת המאמר הזה, 408.0.0 היא הגרסה האחרונה של Google Cloud SDK. כל הפקודות בשיעור ה-Lab הזה נבדקו באמצעות הגרסה העדכנית של Google Cloud SDK. לפני שממשיכים, צריך לוודא שב-Cloud Shell מותקנת הגרסה העדכנית של ה-SDK.

בדיקת גרסת ה-SDK

נשתמש בפקודה gcloud version כדי לבדוק את גרסת ה-SDK.

Command

gcloud version | grep "Google Cloud SDK"

פלט לדוגמה

Google Cloud SDK 408.0.0

השלבים הבאים

  1. אם גרסת ה-SDK היא 408.0.0 ואילך, אפשר לדלג לסעיף הבא.
  2. אם גרסת ה-SDK נמוכה מ-408.0.0, מריצים את הפקודה שמופיעה בהמשך כדי לעדכן את ה-SDK.
sudo apt-get update && sudo apt-get install google-cloud-sdk

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

לפני שמתחילים להגדיר את משאבי GCP, צריך לבצע את הפעולות הבאות:

  1. הגדרה של משתני סביבה
  2. הפעלת ממשקי Service API נדרשים

1. הגדרת משתני סביבה

במהלך שיעור ה-Lab הזה, נריץ פקודות gcloud ו-curl עם כמה משתנים. צריך להגדיר את משתני הסביבה הבאים.

  • מזהה פרויקט
  • מספר הפרויקט
  • שם משתמש
  • אזור
  • מזהה קלט
  • מזהה הערוץ

מזהה הפרויקט ושם המשתמש

משתני הסביבה האלה מוגדרים מראש בדרך כלל ב-Cloudshell. נשתמש בפקודה env כדי לאמת.

Command

env | grep -E 'DEVSHELL_PROJECT_ID=|LOGNAME'

פלט לדוגמה

DEVSHELL_PROJECT_ID=<YOUR_PROJECT_ID>
LOGNAME=<YOUR_USERNAME>

יצירת קובץ env_variables

משתמשים בפקודה cat כדי ליצור את הקובץ env_variables.txt. הפקודה הבאה תיצור את הקובץ env_variables.txt בספריית הבית של המשתמש.

פקודות

cat > ~/env_variables.txt << EOF
export PROJECT_NUMBER=$(gcloud projects describe $GOOGLE_CLOUD_PROJECT --format="value(projectNumber)")
export LOCATION=us-west2
export INPUT_ID=lab-live-input
export CHANNEL_ID=lab-live-channel
EOF

הגדרת משתני הסביבה

נשתמש בפקודה source כדי להגדיר את משתני הסביבה

Command

source ~/env_variables.txt

אימות שהמשתנים מוגדרים

צריך לוודא שכל משתני הסביבה הנדרשים מוגדרים. בפלט אמורים להופיע 6 משתני סביבה.

Command

env | grep -E 'DEVSHELL_PROJECT_ID=|LOGNAME|PROJECT_NUMBER|LOCATION|INPUT_ID|CHANNEL_ID'

פלט לדוגמה

LOCATION=us-west2
DEVSHELL_PROJECT_ID=<YOUR_PROJECT_ID>
LOGNAME=<YOUR_USERNAME>
PROJECT_NUMBER=<YOUR_PROJECT_NUMBER>
INPUT_ID=lab-live-input
CHANNEL_ID=lab-live-channel

2. הפעלת ממשקי API של שירותים נדרשים

אנחנו צריכים לוודא שממשקי ה-API הבאים מופעלים בפרויקט שלנו.

  • Network Services API
  • Certificate Manager API
  • Livestream API
  • Media CDN Edge Cache API

הפעלת Network Services API

כדי להפעיל את Network Services API, מריצים את הפקודה הבאה:

Command

gcloud services enable networkservices.googleapis.com

הפעלת Certificate Manager API

כדי להפעיל את Certificate Manager API, מריצים את הפקודה הבאה:

Command

gcloud services enable certificatemanager.googleapis.com

הפעלת Live Stream API

כדי להפעיל את Live Stream API, מריצים את הפקודה הבאה:

Command

gcloud services enable livestream.googleapis.com

הפעלת Media CDN Edge Cache API

כדי להפעיל את Media CDN Edge Cache API, מריצים את הפקודה הבאה:

Command

gcloud services enable edgecache.googleapis.com

מוודאים שממשקי ה-API מופעלים

מריצים את הפקודה gcloud services list כדי להציג רשימה של כל ממשקי ה-API המופעלים. אמורים להופיע 4 ממשקי API בפלט.

Command

gcloud services list | grep -E 'networkservices|certificatemanager|livestream|edgecache'

פלט לדוגמה

NAME: certificatemanager.googleapis.com
NAME: livestream.googleapis.com
NAME: networkservices.googleapis.com
NAME: edgecache.googleapis.com

6. יצירת קטגוריה של Cloud Storage

בקטע הזה נבצע את הפעולות הבאות:

  1. יצירת קטגוריה של Cloud Storage
  2. הגדרת הקטגוריה כנגישה באופן ציבורי

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

1. יצירת הקטגוריה

נשתמש בפקודה gsutil mb כדי ליצור את הקטגוריה:

Command

gsutil mb gs://live-streaming-storage-$LOGNAME

2. הגדרת הקטגוריה כנגישה באופן ציבורי

נשתמש בפקודה gsutil iam כדי להפוך את הקבצים לזמינים לכולם:

Command

gsutil iam ch allUsers:objectViewer gs://live-streaming-storage-$LOGNAME

7. הגדרת הסביבה של Live Streaming API

הרכיבים בשרשרת של Live Streaming API בנויים באופן הבא:

96b5d26aedeb89a6.png

בקטע הקודם יצרנו את הקטגוריה של Cloud Storage‏ live-streaming-storage-$LOGNAME. בשני הקטעים הבאים ניצור את המשאבים הבאים:

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

בהמשך שיעור ה-Lab הזה ניצור את המשאבים הבאים:

  • מקודד: מקודד הוא תוכנה שמשמשת לשליחת זרמי קלט. בשיעור ה-Lab הזה נשתמש ב-FFmpeg.

8. יצירה והגדרה של נקודת הקצה של הקלט

יצירת הקובץ input.json

ניצור קובץ input.json כדי לציין את סוג האות של השידור החי. בשיעור ה-Lab הזה נשתמש באות שידור חי מסוג RTMP.

Command

cat > input.json << EOF
{
  "type": "RTMP_PUSH"
}
EOF

יצירת נקודת קצה של קלט

בזמן כתיבת המעבדה הזו, אין תמיכה ב-gcloud עבור Live Stream API. נשתמש בפקודה curl כדי לבצע את הקריאות ל-API.

Command

curl -X POST \
-H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
-H "Content-Type: application/json; charset=utf-8" \
-d @input.json \
"https://livestream.googleapis.com/v1/projects/$PROJECT_NUMBER/locations/$LOCATION/inputs?inputId=$INPUT_ID"

פלט לדוגמה

{
  "name": "projects/PROJECT_NUMBER/locations/us-west2/operations/operation-1661405972853-5e70a38d6f27f-79100d00-310671b4",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata",
    "createTime": "2022-08-25T05:39:32.884030164Z",
    "target": "projects/PROJECT_NUMBER/locations/us-west2/inputs/lab-live-input",
    "verb": "create",
    "requestedCancellation": false,
    "apiVersion": "v1"
  },
  "done": false
}

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

  • מזהה פעולה: מעתיקים את מזהה הפעולה מהפלט ורושמים אותו. בהמשך מופיע מזהה הפעולה מתוך פלט לדוגמה. אפשר למצוא אותו בשורת הפלט שמתחילה ב-"name". "operation-1661405972853-5e70a38d6f27f-79100d00-310671b4"
  • סטטוס: צריך לחכות שהסטטוס ישתנה מ"done": false ל"done": true

בדיקת הסטטוס

לפני שנמשיך, אנחנו צריכים לוודא שנקודת הקצה של הקלט נוצרה בהצלחה ושהיא מוכנה.

בפקודה שלמטה, מחליפים את <OPERATION> במזהה של הפעולה שקיבלנו למעלה. בדוגמה הזו, זה "operation-1661405972853-5e70a38d6f27f-79100d00-310671b4".

Command

export OPERATION_ID_1=<OPERATION>

Command

curl -X GET \
-H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
"https://livestream.googleapis.com/v1/projects/$PROJECT_NUMBER/locations/$LOCATION/operations/$OPERATION_ID_1"

פלט לדוגמה

{
  "name": "projects/PROJECT_NUMBER/locations/us-west2/operations/operation-1661408816982-5e70ae25cea49-617844f0-8fdcb4a1",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata",
    "createTime": "2022-08-25T06:26:57.001530499Z",
    "endTime": "2022-08-25T06:26:57.043623522Z",
    "target": "projects/PROJECT_NUMBER/locations/us-west2/inputs/lab-live-input",
    "verb": "create",
    "requestedCancellation": false,
    "apiVersion": "v1"
  },
  "done": true,
  "response": {
    "@type": "type.googleapis.com/google.cloud.video.livestream.v1.Input",
    "name": "projects/PROJECT_ID/locations/us-west2/inputs/lab-live-input",
    "createTime": "2022-08-25T06:26:56.997623672Z",
    "updateTime": "2022-08-25T06:26:56.997623672Z",
    "type": "RTMP_PUSH",
    "uri": "rtmp://34.94.97.220/live/4b7846a1-4a67-44ed-bfd0-d98281b6464a",
    "tier": "HD"
  }
}

מריצים מחדש את הפקודה עד שמופיע "done:true", שמציין שנקודת הקצה של הקלט נוצרה ומוכנה.

שמירת ה-URI

נשתמש ב-URI מהפלט הקודם בהמשך ה-Lab. בשלב הזה, מגדירים משתנה סביבה ל-URI.

Command

export URI=<uri>

מחליפים את <uri> במזהה המשאבים האחיד (URI) שרשמתם למעלה. אפשר גם להשתמש בשיטת אחזור נתונים כדי לאחזר את ה-URI

Command

curl -s -X GET -H "Authorization: Bearer "$(gcloud auth application-default print-access-token) "https://livestream.googleapis.com/v1/projects/$PROJECT_NUMBER/locations/$LOCATION/inputs/$INPUT_ID" | jq .uri

9. יצירה והגדרה של ערוץ שידור חי

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

יצירת הקובץ channel.json

בטרמינל של Cloud Shell, מקלידים את הפקודה הבאה כדי ליצור קובץ "channel.json":

Command

cat > channel.json << EOF
{
  "inputAttachments": [
    {
      "key": "my-input",
      "input": "projects/$PROJECT_NUMBER/locations/$LOCATION/inputs/$INPUT_ID"
    }
  ],
  "output": {
    "uri": "gs://live-streaming-storage-$LOGNAME"
  },
  "elementaryStreams": [
    {
      "key": "es_video",
      "videoStream": {
        "h264": {
          "profile": "high",
          "widthPixels": 1280,
          "heightPixels": 720,
          "bitrateBps": 3000000,
          "frameRate": 30
        }
      }
    },
    {
      "key": "es_audio",
      "audioStream": {
        "codec": "aac",
        "channelCount": 2,
        "bitrateBps": 160000
      }
    }
  ],
  "muxStreams": [
    {
      "key": "mux_video_ts",
      "container": "ts",
      "elementaryStreams": ["es_video", "es_audio"],
      "segmentSettings": { "segmentDuration": "2s" }
    }
  ],
  "manifests": [
    {
      "fileName": "main.m3u8",
      "type": "HLS",
      "muxStreams": [
        "mux_video_ts"
      ],
      "maxSegmentCount": 5
    }
  ]
}
EOF

יצירת הערוץ

מריצים את הפקודה הבאה curl כדי ליצור את הערוץ:

Command

curl -X POST \
-H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
-H "Content-Type: application/json; charset=utf-8" \
-d @channel.json \
"https://livestream.googleapis.com/v1/projects/$PROJECT_NUMBER/locations/$LOCATION/channels?channelId=$CHANNEL_ID"

פלט לדוגמה

{
  "name": "projects/PROJECT_NUMBER/locations/us-west2/operations/operation-1661405972853-5e70a38d6f27f-79100d00-310671b4",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata",
    "createTime": "2022-08-25T05:39:32.884030164Z",
    "target": "projects/PROJECT_NUMBER/locations/us-west2/channels/lab-live-channel",
    "verb": "create",
    "requestedCancellation": false,
    "apiVersion": "v1"
  },
  "done": false
}

רושמים לעצמכם את מזהה הפעולה ומעתיקים אותו. תצטרכו אותו באחד מהשלבים הבאים. אפשר למצוא אותו בשורת הפלט שמתחילה ב-"name".

בדיקת הסטטוס

לפני שנמשיך, אנחנו צריכים לוודא שהערוץ נוצר בהצלחה ושהוא מוכן.

בפקודה שלמטה, מחליפים את <OPERATION> במזהה של הפעולה שקיבלנו למעלה. בדוגמה הזו, זה operation-1661405972853-5e70a38d6f27f-79100d00-310671b4

Command

export OPERATION_ID_2=<OPERATION>

Command

curl -s -X GET \
-H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
"https://livestream.googleapis.com/v1/projects/$PROJECT_NUMBER/locations/$LOCATION/operations/$OPERATION_ID_2"

פלט לדוגמה

  "name": "projects/PROJECT_NUMBER/locations/us-west2/operations/operation-1668666801461-5eda4c3f31852-a4d2229f-0efeef9e",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata",
    "createTime": "2022-11-17T06:33:21.500841488Z",
    "endTime": "2022-11-17T06:33:21.529311112Z",
    "target": "projects/PROJECT_NUMBER/locations/us-west2/channels/lab-live-channel",
    "verb": "create",
    "requestedCancellation": false,
    "apiVersion": "v1"
  },
  "done": true,
  "response": {
    "@type": "type.googleapis.com/google.cloud.video.livestream.v1.Channel",
    "name": "projects/PROJECT_NAME/locations/us-west2/channels/lab-live-channel",
    "createTime": "2022-11-17T06:33:21.497818033Z",
    "updateTime": "2022-11-17T06:33:21.497818033Z",
    "activeInput": "my-input",
    "output": {
      "uri": "gs://live-streaming-storage-LOGNAME"
    },
    "elementaryStreams": [
      {
        "videoStream": {
          "h264": {
            "widthPixels": 1280,
            "heightPixels": 720,
            "frameRate": 30,
            "bitrateBps": 3000000,
            "gopDuration": "2s",
            "vbvSizeBits": 3000000,
            "vbvFullnessBits": 2700000,
            "entropyCoder": "cabac",
            "profile": "high"
          }
        },
        "key": "es_video"
      },
      {
        "audioStream": {
          "codec": "aac",
          "bitrateBps": 160000,
          "channelCount": 2,
          "sampleRateHertz": 48000
        },
        "key": "es_audio"
      }
    ],
    "muxStreams": [
      {
        "key": "mux_video_ts",
        "container": "ts",
        "elementaryStreams": [
          "es_video",
          "es_audio"
        ],
        "segmentSettings": {
          "segmentDuration": "2s"
        }
      }
    ],
    "manifests": [
      {
        "fileName": "main.m3u8",
        "type": "HLS",
        "muxStreams": [
          "mux_video_ts"
        ],
        "maxSegmentCount": 5,
        "segmentKeepDuration": "60s"
      }
    ],
    "streamingState": "STOPPED",
    "inputAttachments": [
      {
        "key": "my-input",
        "input": "projects/PROJECT_NUMBER/locations/us-west2/inputs/lab-live-input"
      }
    ],
    "logConfig": {
      "logSeverity": "OFF"
    }
  }
}

מריצים מחדש את הפקודה עד שמופיע "done:true", שמציין שנקודת הקצה של הקלט נוצרה ומוכנה.

שימו לב שבשלב הזה, "streamingState" הוא "STOPPED" ; נתחיל את הערוץ בקטע הבא.

10. הפעלת הערוץ לשידור חי

אחרי שיצרנו את הערוץ לשידור חי, נפעיל אותו. בקטע הזה:

  1. הפעלת הערוץ של השידור החי
  2. בודקים את הסטטוס של הערוץ ומוודאים שהסטטוס streamingState הוא "AWAITING INPUT"

1. הפעלת הערוץ

ב-Cloud Shell, מריצים את curlהפקודה הבאה כדי להפעיל את הערוץ:

Command

curl -X POST \
-H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
-H "Content-Type: application/json; charset=utf-8" \
-d "" \
"https://livestream.googleapis.com/v1/projects/$PROJECT_NUMBER/locations/$LOCATION/channels/$CHANNEL_ID:start"

פלט לדוגמה

{
  "name": "projects/PROJECT_NUMBER/locations/LOCATION/operations/operation-1661405972853-5e70a38d6f27f-79100d00-310671b4",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata",
    "createTime": "2022-08-25T05:39:32.884030164Z",
    "target": "projects/PROJECT_NUMBER/locations/us-west2/channels/lab-live-channel",
    "verb": "start",
    "requestedCancellation": false,
    "apiVersion": "v1"
  },
  "done": false
}

2. בדיקת הסטטוס של הערוץ

מריצים את הפקודה הבאה curl כדי לקבל את הסטטוס של הערוץ:

Command

curl -s -X GET -H "Authorization: Bearer "$(gcloud auth application-default print-access-token) "https://livestream.googleapis.com/v1/projects/$PROJECT_NUMBER/locations/$LOCATION/channels/$CHANNEL_ID" | grep "streamingState"

פלט לדוגמה

"streamingState": "AWAITING_INPUT",

מריצים מחדש את הפקודה עד שרואים את ההודעה AWAITING_INPUT, שמציינת שהערוץ פועל ומוכן לקבל אות.

11. הגדרת Media CDN

בקטע הזה נפרס את Media CDN – תשתית ה-CDN. ניצור את המשאבים הבאים:

  1. המקור למטמון הקצה
  2. Edge Cache Service

1. יצירת המקור למטמון הקצה

המקור למטמון הקצה מייצג מיקום של תוכן, כמו קטגוריה של Cloud Storage, מיקום אחסון של צד שלישי או מאזן עומסים. במונחים של CDN, המקור (או שרת המקור) הוא המיקום שבו נמצא המקור של התוכן שאנחנו רוצים להפיץ – למשל, כל קובצי ה-CSS,‏ JavaScript,‏ HTML, תמונות וכו'. בסדנה הזו ניצור מקור שממופה לקטגוריה של Cloud Storage שיצרנו בתחילת הסדנה. נתקשר אל המקור למטמון הקצה cme-origin. מקור ה-CDN הוא המקום שבו כל תוכן המקור מאוחסן לפני שהוא מופץ לשרתי מטמון הקצה.

נשתמש בפקודה gcloud edge-cache origins create כדי ליצור את המקור. השלמת הפקודה תימשך כמה דקות.

Command

gcloud edge-cache origins create cme-origin \
--origin-address="gs://live-streaming-storage-$LOGNAME"

פלט לדוגמה

Create request issued for: cme-origin
Waiting for operation [projects/my-project/locations/global/operations/operation-1612121774168-5ba3759af1919-
3fdcd7b1-99f59223] to complete...done
Created origin cme-origin

2. יצירת שירות Edge Cache

אחרי שמגדירים את המקור למטמון הקצה, אפשר ליצור את שירות Edge Cache עצמו.

יצירת קובץ cme-demo.yaml

הגדרת שירות Edge Cache מתבצעת באמצעות קובץ YAML. ב-Cloud Shell, יוצרים קובץ מקומי בשם cme-demo.yaml. משתמשים ב-vi, ב-nano או בכל עורך אחר ומדביקים את השורות הבאות בקובץ ה-YAML:

name: cme-demo
routing:
  hostRules:
    - hosts:
        - demo.cme.com
      pathMatcher: routes
  pathMatchers:
    - name: routes
      routeRules:
        - headerAction:
            responseHeadersToAdd:
              - headerName: x-cache-status
                headerValue: "{cdn_cache_status}"
          matchRules:
            - prefixMatch: /
          origin: cme-origin
          priority: 100
          routeAction:
            cdnPolicy:
              cacheKeyPolicy: {}
              cacheMode: FORCE_CACHE_ALL
              defaultTtl: 3600s
              signedRequestMode: DISABLED
        - headerAction:
            responseHeadersToAdd:
              - headerName: x-cache-status
                headerValue: "{cdn_cache_status}"
          matchRules:
            - pathTemplateMatch: /**.m3u8
          origin: cme-origin
          priority: 25
          routeAction:
            cdnPolicy:
              cacheKeyPolicy: {}
              cacheMode: FORCE_CACHE_ALL
              defaultTtl: 1s
              signedRequestMode: DISABLED
        - headerAction: {}
          matchRules:
            - pathTemplateMatch: /**.ts
          origin: cme-origin
          priority: 50
          routeAction:
            cdnPolicy:
              cacheKeyPolicy: {}
              cacheMode: FORCE_CACHE_ALL
              defaultTtl: 2s
              signedRequestMode: DISABLED

נשאיר את כל הגדרות ברירת המחדל של Edge Cache Service. בקובץ שלמעלה יש 3 ערכים בשדות שמשתמשים עשויים לרצות לעדכן:

  • name: השם של מופע Media CDN – כאן: cme-demo
  • hosts: רשימת שמות הדומיין שיפוענחו על ידי שירות Media CDN הזה – כאן: demo.cme.com. נשתמש בזה במהלך ההדגמה. נשתמש בכתובת ה-IP של מופע Media CDN.
  • Origin: זהו המקור למטמון הקצה שיצרנו בשלב הקודם. מגדירים את הערך cme-origin – שם נקודת המוצא של Media CDN.

מידע נוסף על המשתנים השונים שאפשר להשתמש בהם בקובץ ה-YAML זמין במדריך להגדרת Edge Cache Service.

יצירת שירות Edge Cache

ניצור שירות Edge Cache בשם cme-demo, במקור למטמון הקצה cme-origin, עם מארח demo.cme.com. כדי ליצור את השירות, מריצים את הפקודה הבאה ב-Cloud Shell:

Command

gcloud edge-cache services import cme-demo \
    --source=cme-demo.yaml

יכול להיות שיחלפו כמה דקות עד ליצירת שירות Edge Cache.

פלט לדוגמה

Request issued for: [cme-demo]
Waiting for operation [projects/PROJECT_ID/locations/global/operations/operation-1670476252264-5ef4a0f9f36ce-dd380af5-321be9a0] to complete...done.     
createTime: '2022-12-07T18:08:54.403446942Z'
ipv4Addresses:
- 34.104.35.152
ipv6Addresses:
- '2600:1900:4110:d18::'
name: projects/PROJECT_ID/locations/global/edgeCacheServices/cme-demo
routing:
  hostRules:
  - hosts:
    - demo.cme.com
    - 34.104.35.152
    pathMatcher: routes
  pathMatchers:
  - name: routes
    routeRules:
    - headerAction:
        responseHeadersToAdd:
        - headerName: x-cache-status
          headerValue: '{cdn_cache_status}'
      matchRules:
      - prefixMatch: /
      origin: projects/123456789/locations/global/edgeCacheOrigins/cme-origin
      priority: '100'
      routeAction:
        cdnPolicy:
          cacheKeyPolicy: {}
          cacheMode: FORCE_CACHE_ALL
          defaultTtl: 3600s
          signedRequestMode: DISABLED
    - headerAction:
        responseHeadersToAdd:
        - headerName: x-cache-status
          headerValue: '{cdn_cache_status}'
      matchRules:
      - pathTemplateMatch: /**.m3u8
      origin: projects/123456789/locations/global/edgeCacheOrigins/cme-origin
      priority: '25'
      routeAction:
        cdnPolicy:
          cacheKeyPolicy: {}
          cacheMode: FORCE_CACHE_ALL
          defaultTtl: 1s
          signedRequestMode: DISABLED
    - headerAction: {}
      matchRules:
      - pathTemplateMatch: /**.ts
      origin: projects/123456789/locations/global/edgeCacheOrigins/cme-origin
      priority: '50'
      routeAction:
        cdnPolicy:
          cacheKeyPolicy: {}
          cacheMode: FORCE_CACHE_ALL
          defaultTtl: 2s
          signedRequestMode: DISABLED
updateTime: '2022-12-08T05:11:31.598744308Z'

רושמים לעצמכם את ipv4Addresses של מופע Edge Cache Service – כאן 34.104.36.157. נשתמש בו כדי לעדכן את הקובץ cme-demo.yaml, ומאוחר יותר כדי להזרים את הסרטון שעבר המרה.

עדכון שירות Edge Cache

בשלב הזה מומלץ לעדכן את ההגדרה של שירות Edge Cache כדי שתוכלו להשתמש בכתובת ה-IP של השירות להזרמת הסרטון בהמשך. קובץ ה-YAML של Edge Cache Service מאפשר לנו לפרט את כל שמות המארחים או כתובות ה-IP ש-Edge Cache Service תקבל מהם בקשות. בשלב הזה ציינו רק את demo.cme.com כמארח. כדי לספק תרגום שם (name resolution) לדומיין הזה, אפשר להגדיר תחום DNS. עם זאת, פתרון פשוט יותר יהיה להוסיף את כתובת ה-IP לרשימת המארחים בקובץ yaml. עורכים שוב את קובץ ה-YAML כך שייראה כמו הקובץ שמופיע בהמשך:

name: cme-demo
routing:
  hostRules:
    - hosts:
        - demo.cme.com
        - IPADDRESS
      pathMatcher: routes
  pathMatchers:
    - name: routes
      routeRules:
        - headerAction:
            responseHeadersToAdd:
              - headerName: x-cache-status
                headerValue: "{cdn_cache_status}"
          matchRules:
            - prefixMatch: /
          origin: cme-origin
          priority: 100
          routeAction:
            cdnPolicy:
              cacheKeyPolicy: {}
              cacheMode: FORCE_CACHE_ALL
              defaultTtl: 3600s
              signedRequestMode: DISABLED
        - headerAction:
            responseHeadersToAdd:
              - headerName: x-cache-status
                headerValue: "{cdn_cache_status}"
          matchRules:
            - pathTemplateMatch: /**.m3u8
          origin: cme-origin
          priority: 25
          routeAction:
            cdnPolicy:
              cacheKeyPolicy: {}
              cacheMode: FORCE_CACHE_ALL
              defaultTtl: 1s
              signedRequestMode: DISABLED
        - headerAction: {}
          matchRules:
            - pathTemplateMatch: /**.ts
          origin: cme-origin
          priority: 50
          routeAction:
            cdnPolicy:
              cacheKeyPolicy: {}
              cacheMode: FORCE_CACHE_ALL
              defaultTtl: 2s
              signedRequestMode: DISABLED

כדי שהשינויים יתעדכנו, צריך לייבא מחדש את קובץ ה-YAML. בטרמינל של Cloud Shell, מריצים את הפקודה הבאה:

Command

gcloud edge-cache services import cme-demo \
    --source=cme-demo.yaml

בודקים את הפלט של הפקודה ומוודאים שכתובת ה-IP מופיעה ברשימת המארחים.

בשלב הזה, מופע Edge Cache Service יקבל בקשות עם "demo.cme.com" או עם כתובת ה-IP כמארח.

12. יצירת אות הקלט

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

  1. מתקינים את FFmpeg, תוכנת קוד פתוח חינמית
  2. שליחת אות בדיקה של שידור חי לקלט או לערוץ

1. התקנה של FFmpeg

‫FFmpeg הוא פרויקט תוכנה חינמי בקוד פתוח שכולל חבילה של ספריות ותוכנות לטיפול בסרטונים, באודיו ובקובצי מולטימדיה אחרים ובסטרימינג. במסוף של Cloud Shell, משתמשים בפקודה הבאה כדי להתקין את FFmpeg:

Command

sudo apt install ffmpeg -y

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

Command

ffmpeg -version

פלט לדוגמה

ffmpeg version 4.3.4-0+deb11u1 Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 10 (Debian 10.2.1-6)
...

התקנת FFmpeg בוצעה בצורה תקינה.

2. מתחילים את האות של השידור החי אל הערוץ או אל הקלט

עכשיו, אחרי שהתקנתם את FFmpeg, נשלח זרם קלט לבדיקה לנקודת הקלט כדי ליצור את השידור החי.

בטרמינל של Cloud Shell, מריצים את הפקודה הבאה באמצעות משתנה הסביבה של ה-URI שיצרנו בקטע 'יצירה והגדרה של נקודת הקצה של הקלט'.

Command

ffmpeg -re -f lavfi -i "testsrc=size=1280x720 [out0]; sine=frequency=500 [out1]" \
  -acodec aac -vcodec h264 -f flv $URI

אמור להופיע FFmpeg ששולח את אות הבדיקה בשידור חי. הפקודה לא תחזיר את ההנחיה. האות יופק עד שתפסיקו אותו. תצטרכו לפתוח חלון חדש של Cloud Shell כדי להמשיך במעבדה.

13. פתיחת Cloud Shell חדש

בשלב הזה תצטרכו לפתוח חלון חדש של Cloud Shell כדי להמשיך במעבדה, כי FFmpeg יפעל באופן קבוע עד שתקישו על ‎ <CTRL+C>‎ על הפקודה כדי לעצור אותו וכך לעצור את יצירת האות של השידור החי.

לוחצים על הסמל '+' לצד השם של הטרמינל הנוכחי של Cloud Shell. ייפתח חלון נוסף של Cloud Shell.

b3c7b0be6276c194.png

מריצים את שאר המעבדה בחלון Cloud Shell שנפתח.

הגדרת משתני הסביבה

מכיוון שזה CloudShell חדש, צריך להגדיר שוב את משתני הסביבה. נשתמש בפקודה source כדי להגדיר את משתני הסביבה.

Command

source ~/env_variables.txt

אימות שהמשתנים מוגדרים

צריך לוודא שכל משתני הסביבה הנדרשים מוגדרים. בפלט אמורים להופיע 6 משתני סביבה.

Command

env | grep -E 'DEVSHELL_PROJECT_ID=|LOGNAME|PROJECT_NUMBER|LOCATION|INPUT_ID|CHANNEL_ID'

פלט לדוגמה

LOCATION=us-west2
DEVSHELL_PROJECT_ID=<YOUR_PROJECT_ID>
LOGNAME=<YOUR_USERNAME>
PROJECT_NUMBER=<YOUR_PROJECT_NUMBER>
INPUT_ID=lab-live-input
CHANNEL_ID=lab-live-channel

14. אימות שהאות של השידור החי עובר טרנסקוד

נריץ curl כדי לתאר את הערוץ. בפלט אמור להופיע שהערך של streamingState השתנה מ-"AWAITING_INPUT" ל-"STREAMING"

Command

curl -s -X GET -H "Authorization: Bearer "$(gcloud auth application-default print-access-token) "https://livestream.googleapis.com/v1/projects/$PROJECT_NUMBER/locations/$LOCATION/channels/$CHANNEL_ID" | grep "streamingState"

בתגובת קובץ ה-JSON של הפלט אמור להופיע "streamingState": "STREAMING" – שמציין שהערוץ משדר סטרימינג והאות של השידור החי עובר המרה.

בנוסף, נבדוק את התוכן של ה-bucket שבו אמור להופיע קובץ מניפסט וכמה מקטעי וידאו בפורמט TS. מריצים את הפקודה הבאה ב-Cloud Shell כדי להציג את התוכן של קטגוריית האחסון שיצרנו בתחילת המעבדה, שמשמשת את Live Streaming API כדי להפיק את מניפסט האות של השידור החי שעבר המרה ואת פלחי הווידאו בפורמט TS:

Command

gcloud storage ls --recursive gs://live-streaming-storage-$LOGNAME/**

פלט לדוגמה

gs://live-streaming-storage-$LOGNAME/
gs://live-streaming-storage-$LOGNAME/main.m3u8
gs://live-streaming-storage-$LOGNAME/mux_video_ts/index-1.m3u8
gs://live-streaming-storage-$LOGNAME/mux_video_ts/segment-0000000016.ts
gs://live-streaming-storage-$LOGNAME/mux_video_ts/segment-0000000017.ts
gs://live-streaming-storage-$LOGNAME/mux_video_ts/segment-0000000018.ts
gs://live-streaming-storage-$LOGNAME/mux_video_ts/segment-0000000019.ts
gs://live-streaming-storage-$LOGNAME/mux_video_ts/segment-0000000020.ts
gs://live-streaming-storage-$LOGNAME/mux_video_ts/segment-0000000021.ts
gs://live-streaming-storage-$LOGNAME/mux_video_ts/segment-0000000022.ts
...

הפרטים שמוצגים הם:

  • קובץ המניפסט של HLS: main.m3u8
  • קטעי הווידאו התואמים בפורמט TS: סדרה של קבצים ממוספרים segment-000000000X.ts

בשלב הזה סיימנו את הפעולות הבאות:

  • ‫Live Streaming API: האות לשידור החי נוצר ועובר קידוד מחדש ל-bucket באמצעות Live Streaming API
  • ‫Media CDN: הגדרת Media CDN עם קטגוריית האחסון של השידור החי כמקור של Media CDN.

בקטעים הבאים נאמת את שירות Edge Cache ואז נזרים את הסרטון שעבר המרה באמצעות כתובת ה-IP של Media CDN anycast.

15. אימות של מופע Edge Cache Service

בקטע הזה נבדוק שמופע Edge Cache Service פועל כמו שצריך. לשם כך, ננסה לגשת לקובץ ממופע של Edge Cache Service באמצעות כתובת ה-IP של Edge Cache Service. בפעם הראשונה שניגשים לאובייקט, הוא עדיין לא נמצא במטמון. צריך לראות מטמון MISS. בבקשה הראשונה, האובייקט נקרא מהמקור ונשמר במטמון בקצה הרשת. כל הניסיונות הבאים לגשת לאותו קובץ יחזירו מטמון HIT כי האובייקט נמצא עכשיו במטמון בקצה הרשת. כדי לבדוק את ההתנהגות הזו:

מריצים את הפקודה curl הבאה ב-Cloud Shell כדי לגשת לקובץ המניפסט של הסרטון שעבר המרת קידוד, שמאוחסן במקור למטמון הקצה:

Command

curl -svo /dev/null --resolve demo.cme.com:80:<Replace_With_Edge_Cache_IP> \
"http://demo.cme.com/main.m3u8"

שימו לב לפעולת ה-resolve שבה אנחנו משתמשים בכתובת ה-IP של מופע Edge Cache Service כדי לפתור את השם שלו. חשוב להשתמש ב-demo.cme.com:<IP> כאשר IP הוא כתובת ה-IP של מופע Edge Cache Service שיצרנו זה עתה.

חפשו את הכותרת x-cache-status בפלט.

פלט לדוגמה

Added demo.cme.com:80:34.104.35.152 to DNS cache
* Hostname demo.cme.com was found in DNS cache
*   Trying 34.104.35.152:80...
* Connected to demo.cme.com (34.104.35.152) port 80 (#0)
> GET /main.m3u8 HTTP/1.1
> Host: demo.cme.com
> User-Agent: curl/7.74.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< x-guploader-uploadid: ADPycdtKtflWt4Kha5YxXNNRwO-Eu6fGSPs-T-XY4HJmNMo46VJyWlD4EAk-8a6SegxjWq3o1gTPqZbpkU_sjW__HPAdDw
< date: Wed, 07 Dec 2022 18:23:46 GMT
< last-modified: Wed, 07 Dec 2022 18:23:45 GMT
< etag: "6bff620ccca4a9849ba4e17fa7c521fb"
< x-goog-generation: 1670437425805400
< x-goog-metageneration: 1
< x-goog-stored-content-encoding: identity
< x-goog-stored-content-length: 193
< content-type: application/x-mpegURL
< x-goog-hash: crc32c=sPO3zw==
< x-goog-hash: md5=a/9iDMykqYSbpOF/p8Uh+w==
< x-goog-storage-class: STANDARD
< accept-ranges: bytes
< content-length: 193
< server: Google-Edge-Cache
< x-request-id: fd25285b-fc1a-4fd4-981a-c50ead2c85ed
< x-xss-protection: 0
< x-frame-options: SAMEORIGIN
< x-cache-status: den;miss
< cache-control: public,max-age=3600
<
{ [193 bytes data]
* Connection #0 to host demo.cme.com left intact

שימו לב לאי מציאה במטמון, כי האובייקט עדיין לא נשמר במטמון והוא נקרא מהמקור.

עכשיו נבצע כמה בקשות לקובץ m3u8, ואם הכול מוגדר בצורה נכונה, Media CDN יתחיל להציג את התוכן מהמטמון שלו. הפקודה שלמטה תבצע 10 בקשות curl ותדפיס רק את הכותרת x-cache-status.

Command

for i in {1..10};do curl -Is --resolve demo.cme.com:80:<Replace_With_Edge_Cache_IP> "http://demo.cme.com/main.m3u8" | grep x-cache-status;done

הפלט צריך להיות שילוב של מטמון hit ו-miss. אם אתם רואים פגיעות במטמון בפלט, סימן ש-Media CDN פועל כמצופה.

פלט לדוגמה

x-cache-status: den;miss
x-cache-status: den;hit
x-cache-status: den;hit
x-cache-status: den;hit
x-cache-status: den;hit
x-cache-status: den;hit
x-cache-status: den;hit
x-cache-status: den;hit
x-cache-status: den;hit
x-cache-status: den;hit

שימו לב לפגיעה במטמון, כי האובייקט נמצא עכשיו במטמון בקצה הרשת. שירות Cloud Media Edge פועל כצפוי.

16. שידור של וידאו עם אותות חיים שעברו המרה של הקידוד באמצעות VLC

בשלב הזה נחבר את כל הנקודות ונשלב את כל השלבים שעבדנו עליהם עד עכשיו:

  • יצרנו מאגר שנקרא live-streaming-storage-$LOGNAME שמקבל את התוצאה של אות השידור החי שעבר המרה לתוכן HLS באמצעות Live Streaming API.
  • הגדרנו את Live Streaming API.
  • התחלנו אות RTMP בשידור חי באמצעות FFmpeg, שמוזן לקלט של Live Streaming API או לערוץ.
  • בדקנו שהאות של השידור החי הועבר לערוץ ושהערוץ היה במצב streaming.
  • בדקנו שקובצי הטרנסקוד שהתקבלו (מניפסט + פלחי TS) נוצרו ונשמרו בדלי live-streaming-storage-$LOGNAME.
  • הוגדר המקור למטמון הקצה בשם cme-origin עם קטגוריית GCS‏ live-streaming-storage-$LOGNAME כמקור.
  • מופע של Edge Cache בשם cme-demo הוגדר עם cme-origin כמקור.
  • בדקנו את ההתנהגות (אי מציאה במטמון, מציאה במטמון) של מופע Edge Cache Service.

הגענו עכשיו למצב שבו אפשר להשתמש בנגן וידאו כדי להזרים את האות של השידור החי שעבר המרה דרך מטמון Media CDN. כדי לעשות זאת, נשתמש ב-VLC Player. VLC Player הוא נגן מולטימדיה וסביבת עבודה בפלטפורמות שונות, חינמי וקוד פתוח, שמנגן את רוב קובצי המולטימדיה. הוא מפעיל פורמטים של מדיה דינמית (כמו DASH ו-HLS). הנגן משתמש בעיקרון של סטרימינג דינמי – בהתאם לאיכות החיבור לרשת ולרוחב הפס הזמין, הנגן יתאים את איכות הסרטון שמופעל. בעבודת הטרנסקודינג שביצענו הרגע, השתמשנו בהגדרות הקבועות מראש שמוגדרות כברירת מחדל ויצרנו שתי איכויות 'בלבד': SD ו-HD. כשמתחילים להפעיל את הסרטון בנגן, הוא אמור להתחיל לפעול בפורמט SD ולעבור במהירות לפורמט HD אם החיבור לרשת טוב מספיק.

אנחנו נשדר את האות בשידור חי אחרי קידוד טרנסקוד של HLS (פורמט וידאו של אפל שנתמך באופן נרחב). הקובץ המתאים נקרא main.m3u8 – זהו מניפסט HLS. קובץ המניפסט מצביע על קטעי הווידאו בפורמט TS.

כדי להשתמש ב-VLC Player, צריך להיכנס לכתובת https://www.videolan.org/vlc/ ולהוריד גרסה של הנגן למערכת ההפעלה של המחשב הנייד – VLC זמין ל-Windows, ל-MacOSX, ל-Linux, ל-Android ול-iOS.

2a2d19abe728d222.png

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

כדי להפעיל סרטון, עוברים אל 'קובץ' / 'פתיחת רשת':

f85565301f7c68dc.png

הגדרה באמצעות:

  • כתובת ה-URL: ‏ http://<Replace_With_Edge_Cache_IP>/main.m3u8. זו כתובת ה-URL של הסרטון שאנחנו רוצים להזרים. הערה:
  • כתובת ה-IP של מופע Media CDN: 34.105.35.246. מחליפים את הערך בכתובת ה-IP של שירות המדיה בענן שפרסתם.
  • הנתיב לקובץ הווידאו של המניפסט: '/'. זהו הנתיב שבו השתמשנו בדלי live-streaming-storage-$LOGNAME כדי לאחסן את קובצי האותות של השידור החי שעברו המרה. הנתיב הוא נתיב הבסיס כאן: '/'.
  • השם של קובץ המניפסט של הסרטון: קובץ המניפסט של HLS‏, main.m3u8.

ולוחצים על 'פתיחה'. הווידאו בשידור חי שהקידוד שלו הומר אמור להתחיל לפעול. הסרטון ייראה כמו בצילום המסך שלמטה. המונה במסך יפעל במרווחים של 1, ותוכלו לשמוע צפצוף רציף.

זהו אות בשידור חי לבדיקה בסיסית של RTMP שנוצר על ידי FFmpeg, עבר המרה ל-HLS על ידי Live Streaming API ומוצג דרך מטמון Media CDN:

28fc359b49d44ec2.png

אם רוצים, אפשר להשתמש בכל נגן אחר של HLS ו-MPEG DASH. הנה כמה נגנים שכדאי לשקול:

  • נגן Quicktime – מותקן כברירת מחדל במחשבי Mac. גם כאן: פותחים חיבור לרשת אל http://34.104.36.157/main.m3u8 – מחליפים את כתובת ה-IP בכתובת של מופע Edge Cache Service.

17. מעקב אחרי Media CDN

צוות ה-SME יצר תבנית של מרכז בקרה ל-Media CDN – https://gist.github.com/elithrar/1c511d00f5cd3736fb2a3897867209c1.

כדי להתקין אותו, מריצים את הפקודות הבאות בחלון Cloud Shell:

מורידים את קובץ ה-YAML:

curl https://gist.githubusercontent.com/elithrar/1c511d00f5cd3736fb2a3897867209c1/raw/3cb70855304f29e5c06b8d63063196354db0dec3/media-edge-20210208-dashboard --output media-edge-20210208-dashboard.yaml

יוצרים את לוח הבקרה של Cloud Monitoring:

gcloud monitoring dashboards create --config-from-file media-edge-20210208-dashboard.yaml

יכול להיות שיעברו כמה דקות עד שההגדרה תסתיים. נכנסים אל מסוף Google Cloud ולוחצים על סמל 3 הקווים > Operations > מעקב > מרכז בקרה. אמור להופיע לוח בקרה בשם Media Edge Metrics (מדדים של Media Edge). לוחצים על האפשרות הזו ורואים את המדדים:

d0821d84a88a928d.png

18. לפנות את סביבת ה-Lab

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

הפסקת האות של FFmpeg:

לוחצים על <CTRL+C> בטרמינל של Cloud Shell שבו FFmpeg פועל.

כדי להפסיק את הערוץ של השידור החי:

Command

curl -X POST \
-H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
-H "Content-Type: application/json; charset=utf-8" \
-d "" \
"https://livestream.googleapis.com/v1/projects/$PROJECT_NUMBER/locations/$LOCATION/channels/$CHANNEL_ID:stop"

מחיקת הערוץ של השידור החי:

Command

curl -X DELETE -H "Authorization: Bearer "$(gcloud auth application-default print-access-token) "https://livestream.googleapis.com/v1/projects/$PROJECT_NUMBER/locations/$LOCATION/channels/$CHANNEL_ID"

מחיקת נקודת הקצה של קלט השידור החי:

Command

curl -X DELETE \
-H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
"https://livestream.googleapis.com/v1/projects/$PROJECT_NUMBER/locations/$LOCATION/inputs/$INPUT_ID"

מוחקים את קטגוריית ה-GCS:

Command

gsutil rm -r gs://live-streaming-storage-$LOGNAME

מחיקת מופע של שירות Edge Cache:

Command

gcloud edge-cache services delete cme-demo

כשמוצגת הודעה לאישור המחיקה, מקלידים Y.

מחיקת המקור למטמון הקצה:

Command

gcloud edge-cache origins delete cme-origin

כשמוצגת הודעה לאישור המחיקה, מקלידים Y.

מחיקת לוח בקרה בהתאמה אישית

Command

gcloud monitoring dashboards delete $(gcloud monitoring dashboards list --filter="displayName:Media Edge Metrics" --format="value(name)")