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

1. מבוא

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

מה תלמדו

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

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

מה תפַתחו

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

de33cb3e75d52549.png

אנחנו נגדיר את הרכיבים הבאים ונבצע את המשימות הבאות כחלק משיעור ה-Lab:

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

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

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

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

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

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

הפעלת Cloud Shell

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

במסוף 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.

פקודה

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. הפעלת ממשקי ה-API הנדרשים של השירות

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

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

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

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

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

פקודה

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 כדי להגדיר את משתני הסביבה

פקודה

source ~/env_variables.txt

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

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

פקודה

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
  • ממשק API של Certificate Manager
  • API של סטרימינג בשידור חי
  • ממשק API של Media CDN Edge Cache

הפעלת Network Services API

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

פקודה

gcloud services enable networkservices.googleapis.com

הפעלת Certificate Manager API

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

פקודה

gcloud services enable certificatemanager.googleapis.com

הפעלת ממשק ה-API של סטרימינג בשידור חי

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

פקודה

gcloud services enable livestream.googleapis.com

הפעלת Media CDN Edge Cache API

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

פקודה

gcloud services enable edgecache.googleapis.com

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

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

פקודה

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. הגדרת הקטגוריה כנגישה באופן ציבורי

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

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

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

פקודה

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

2. הגדרת הקטגוריה כגלויה לכולם

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

פקודה

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

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

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

96b5d26aedeb89a6.png

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

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

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

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

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

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

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

פקודה

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

יוצרים את נקודת הקצה לקליטת נתונים

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

פקודה

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
}

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

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

בדיקת הסטטוס

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

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

פקודה

export OPERATION_ID_1=<OPERATION>

פקודה

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", שמציין שנקודת הקצה (endpoint) לקלט נוצרה ומוכנה.

שמירת ה-URI

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

פקודה

export URI=<uri>

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

פקודה

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 שמורכב מעיבוד יחיד באיכות HD (1280x720). הערוץ ישויך לנקודת הקצה של הקלט ולקטגוריית האחסון שיצרנו קודם.

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

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

פקודה

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 הבאה כדי ליצור את הערוץ:

פקודה

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

פקודה

export OPERATION_ID_2=<OPERATION>

פקודה

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", שמציין שנקודת הקצה (endpoint) לקלט נוצרה ומוכנה.

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

10. הפעלת ערוץ סטרימינג בשידור חי

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

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

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

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

פקודה

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 הבאה כדי לבדוק את סטטוס הערוץ:

פקודה

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. הגדרת CDN של מדיה

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

  1. מקור המטמון של Edge
  2. שירות Edge במטמון

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

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

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

פקודה

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

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

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

הגדרת השירות של Edge Cache Service מתבצעת באמצעות קובץ 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: זהו מקור המטמון של Edge שיצרנו עכשיו בשלב הקודם. מגדירים אותו ל-cme-origin – השם של מקור ה-Media CDN.

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

יצירת שירות המטמון של Edge

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

פקודה

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

יצירת ה-Edge Cache Service עשויה להימשך מספר דקות.

דוגמה לפלט

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

בשלב הזה, כדאי לעדכן את ההגדרה של Edge Cache Service כדי שתוכלו להשתמש בכתובת ה-IP של השירות כדי לשדר את הסרטון מאוחר יותר. קובץ YAML של Edge Cache Service מאפשר לנו להציג רשימה של כל כתובות ה-IP והשמות של המארחים ש-Edge Cache Service יקבל בקשות מהן. בשלב הזה הגדרנו רק את demo.cme.com כמארח. כדי לספק רזולוציית שמות לדומיין הזה, צריך להגדיר תחום 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, מריצים את הפקודה הבאה:

פקודה

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:

פקודה

sudo apt install ffmpeg -y

בסיום ההתקנה, כדאי לוודא שה-FFmpeg הותקן כראוי על ידי בדיקת הגרסה שלו:

פקודה

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 שיצרנו במקטע "Create and Setting the קלט Endpoint" (יצירה והגדרה של נקודת הקצה בקלט). .

פקודה

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

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

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

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

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

b3c7b0be6276c194.png

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

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

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

פקודה

source ~/env_variables.txt

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

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

פקודה

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 כדי לתאר את הערוץ. בפלט אמור להופיע שינוי ה-streamState מ-"AWAITING_INPUT" ל-"STREAMING".

פקודה

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", שמציין שהערוץ מבצע סטרימינג והקידוד של האות החי עובר המרת קידוד.

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

פקודה

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: האות בשידור חי נוצר וממיר את הקידוד לקטגוריה באמצעות Live Streaming API
  • Media CDN: מוגדר CDN של מדיה עם קטגוריית האחסון בשידור חי כמקור Media CDN.

בקטעים הבאים, נאמת את השירות 'Edge Cache Service', ולאחר מכן נציג את הסרטון שעבר המרת קידוד באמצעות כתובת ה-IP של anycast של Media CDN.

15. איך מוודאים שהמכונה של Edge Cache Service פועלת

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

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

פקודה

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

שימו לב לפתרון שבו אנחנו משתמשים בכתובת ה-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.

פקודה

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 Medie Edge פועל כמו שצריך.

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

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

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

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

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

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

2a2d19abe728d222.png

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

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

f85565301f7c68dc.png

מגדירים אותו באמצעות:

  • כתובת URL: http://&lt;Replace_With_Edge_Cache_IP&gt;/main.m3u8. זו כתובת ה-URL של הסרטון שאנחנו רוצים לשדר. הודעה:
  • כתובת ה-IP של מכונת Media CDN: 34.105.35.246. מחליפים בכתובת ה-IP של Cloud Media Service שפרסתם.
  • הנתיב לקובץ המניפסט של סרטון: "/". זה הנתיב שבו השתמשנו בקטגוריה live-streaming-storage-$LOGNAME כדי לאחסן את קובצי האותות החיים שהומרו לקידוד. הנתיב הוא הנתיב הבסיסי (root) כאן: "/".
  • השם של קובץ הווידאו של המניפסט: קובץ המניפסט של ה-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. מעקב אחרי CDN של מדיה

תבנית מרכז בקרה של 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 העמודות > פעולות > מעקב > מרכזי בקרה. אמור להופיע לוח בקרה בשם Media Edge Metrics. לחיצה עליו תציג את המדדים:

d0821d84a88a928d.png

18. מנקים את סביבת ה-Lab

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

צריך להפסיק את האות של ה-FFmpeg:

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

עוצרים את ערוץ הסטרימינג בשידור חי:

פקודה

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"

מחיקת ערוץ הסטרימינג בשידור חי:

פקודה

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"

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

פקודה

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:

פקודה

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

מוחקים את המופע של שירות המטמון של Edge:

פקודה

gcloud edge-cache services delete cme-demo

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

מוחקים את מקור המטמון של Edge:

פקודה

gcloud edge-cache origins delete cme-origin

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

מחיקת מרכז הבקרה בהתאמה אישית

פקודה

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