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

1. מבוא

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

מה תלמדו

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

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

מה תפַתחו

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

de33cb3e75d52549.png

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

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

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

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

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

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

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

הפעלת Cloud Shell

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

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

55efc1aaa7a4d3ad.png

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

7ffe5cbb04455448.png

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

4. גרסת Google Cloud SDK

נכון למועד כתיבת המאמר, 408.0.0 היא גרסת Google Cloud SDK העדכנית ביותר. כל הפקודות במעבדה הזו נבדקו באמצעות הגרסה האחרונה של 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. הפעלת ממשקי ה-API הנדרשים של השירות

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

במהלך הסדנה הזו נריץ את הפקודות 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

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

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

בהמשך שיעור ה-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 מהפלט הקודם בהמשך המעבדה. בשלב הזה, נגדיר משתנה סביבה עבור URI.

Command

export URI=<uri>

מחליפים את <uri> במזהה המשאבים האחיד (URI) שציינתם למעלה. אפשר גם להשתמש בשיטת GET כדי לאחזר את ה-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

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

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. שירות מטמון קצה

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

מקור של מטמון Edge מייצג מיקום תוכן, כמו קטגוריה של 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, אתם יכולים ליצור את שירות מטמון Edge עצמו.

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

ההגדרה של Edge Cache Service מתבצעת באמצעות קובץ YAML. יוצרים קובץ מקומי בשם cme-demo.yaml ב-Cloud Shell. משתמשים ב-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 Cache

נוצר שירות Edge Cache בשם cme-demo, במקור Edge Cache 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 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:

Command

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

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

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

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

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

  1. מתקינים את FFmpeg, תוכנת קוד פתוח חינמית
  2. שולחים אות בדיקה של שידור חי ל-Input/Channel

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

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

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

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

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"

שימו לב לפתרון שבו אנחנו משתמשים בכתובת ה-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.
  • מקור מטמון של 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://<Replace_With_Edge_Cache_IP>/main.m3u8. זו כתובת ה-URL של הסרטון שאנחנו רוצים להעביר בסטרימינג. הודעה:
  • כתובת ה-IP של המכונה של Media CDN: 34.105.35.246. מחליפים את הערך ב-IP של Cloud Media Service שפרסמתם.
  • הנתיב לקובץ הווידאו של המניפסט: /. זהו הנתיב שבו השתמשנו בקטגוריה 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

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

d0821d84a88a928d.png

18. הסרת המשאבים מסביבת ה-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' כשמופיעה ההודעה

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

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)")