البث المباشر على Google Cloud باستخدام Media CDN وLive Streaming API

1. مقدمة

تعمل شبكات توصيل المحتوى (CDN) على تحسين أداء المستخدم من خلال التخزين المؤقت للمحتوى الذي يتم الوصول إليه بشكل متكرر بالقرب من المستخدمين النهائيين، وإنهاء الاتصالات بالقرب من العملاء، وإعادة استخدام الاتصالات إلى المصدر، واعتماد بروتوكولات الشبكة الحديثة والتخصيصات. وبالنسبة إلى المستخدمين (وعملائنا)، يعني هذا تقليل وقت الاستجابة وزيادة الموثوقية وتقليل التكلفة، ما يؤدي إلى تحسين المبيعات وتجربة الويب وزيادة صافية في تجربة المستخدم. يعمل عدد قليل جدًا من المواقع ومنصات بث الفيديو الحديثة بدون شبكة توصيل للمحتوى في الوقت الحالي.

ما ستتعرَّف عليه

سيرشدنا هذا الدرس إلى الخطوات اللازمة لنشر بيئة سير عمل البث المباشر باستخدام Media CDN (CDN) + Cloud Media Live Streaming API (تحويل ترميز الفيديوهات المباشرة) + Cloud Storage (تخزين الفيديوهات) + مشغّل الفيديو (VLC وGoogle Shaka Player وما إلى ذلك: مشغّل HLS + MPEG-DASH جاهز).

سنتولى إعداد مكونات واجهة برمجة التطبيقات لبث البث المباشر - الإدخال والقناة - وبدء خلاصة مباشرة إلى الإدخال/القناة باستخدام FFmpeg (يمكن أن تنشئ FFmpeg إشارة اختبار مباشر). ستحوِّل واجهة Live Streaming API ترميز الخلاصة المباشرة. سيتم تخزين بيان الفيديو والأقسام التي تم تحويل ترميزها في حزمة على Cloud Storage. بعد ذلك، سنعمل على إعداد Media CDN باستخدام حزمة Cloud Storage للفيديو المباشر كالمصدر. وأخيرًا، سيتم استخدام مشغّل VLC لتشغيل المحتوى المباشر الذي تمّ تخزينه مؤقتًا من خلال Media CDN. سنقوم أيضًا بإعداد لوحة تحكم Cloud Monitoring لعرض نشاط Media CDN.

ما الذي ستنشئه

في هذا التمرين المعملي، سنقوم بإعداد البيئة بناءً على البنية التالية:

de33cb3e75d52549.png

سنقوم بإعداد المكونات التالية وننفذ المهام التالية كجزء من التمرين المعملي:

  • إنشاء حزمة Google Cloud Storage (GCS) لتخزين الفيديوهات المباشرة التي تم تحويل ترميزها
  • ضبط واجهة برمجة التطبيقات Live Streaming API لتحويل ترميز الفيديو إلى تنسيقات متعددة: HLS + MPEG DASH وSD وHD
  • إعداد مكونات البث المباشر: الإدخال/القناة
  • بدء قناة البث المباشر
  • إعداد Media CDN باستخدام حزمة GCS كمصدر
  • ابدأ بإعداد FFmpeg لبثّ المحتوى المباشر.
  • بث الخلاصة المباشرة التي تم تحويل ترميزها باستخدام مشغّل فيديو
  • إعداد لوحة بيانات Cloud Monitoring لمراقبة نشاط Media CDN (وقت الاستجابة ونتيجة ذاكرة التخزين المؤقت وذاكرة التخزين المؤقت غير المتوفّرة وما إلى ذلك)

ملاحظة: في هذا الدرس، نفترض أنّ المستخدمين لديهم إذن بالوصول إلى Google Cloud Console وأنّه سبق لهم إعداد مشروع. نفترض أيضًا أن المستخدمين يبدأون ببيئة جديدة وليس لديهم إعداد لهذا العرض التوضيحي.

سيتم تنفيذ جميع إجراءات الضبط من خلال سطر الأوامر في Cloud Shell. يمكننا دائمًا التحقق من المكونات التي تم ضبطها عبر سطر الأوامر في وحدة التحكم. وسنرى مؤشرات خلال التمرين المعملي ستشير إلى Google Cloud Console.

2. قبل البدء

تم حظر الوصول إلى Media CDN. للوصول إلى Media CDN، يُرجى التواصل مع فريق الحساب. ويمكنها إنشاء طلب وصول نيابةً عنك. إذا كنت جزءًا من Google وتريد اختبار البث المباشر باستخدام Media CDN، تواصَل مع مزوّد خدمة Media CDN لطلب الوصول إلى Media CDN.

3- الإعداد والمتطلبات

بدء Cloud Shell

مع أنّه يمكن إدارة Google Cloud عن بُعد من الكمبيوتر المحمول، ستستخدم في هذا الدرس التطبيقي Google Cloud Shell، وهي بيئة سطر أوامر يتم تشغيلها في السحابة الإلكترونية.

من Google Cloud Console، انقر على رمز Cloud Shell في شريط الأدوات العلوي الأيسر:

55efc1aaa7a4d3ad.png

من المفترَض أن تستغرق عملية إدارة الحسابات والاتصال بالبيئة بضع لحظات فقط. عند الانتهاء، من المفترض أن يظهر لك شيء مثل هذا:

7ffe5cbb04455448.png

يتم تحميل هذه الآلة الافتراضية مزوّدة بكل أدوات التطوير التي ستحتاج إليها. وتوفّر هذه الشبكة دليلاً رئيسيًا دائمًا بسعة 5 غيغابايت وتعمل على Google Cloud، ما يحسّن بشكل كبير من أداء الشبكة والمصادقة. يمكنك تنفيذ جميع أعمالك في هذا الدرس التطبيقي حول الترميز من خلال متصفّح. لا تحتاج إلى تثبيت أي تطبيقات.

4. إصدار حزمة تطوير البرامج (SDK) لخدمة Google Cloud

في وقت كتابة هذه الرسالة، كان 408.0.0 هو أحدث إصدار من حزمة Google Cloud SDK. تم اختبار جميع الأوامر في هذا التمرين المعملي باستخدام أحدث إصدار من 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. تفعيل واجهات برمجة تطبيقات الخدمة المطلوبة

1. إعداد متغيّرات البيئات

خلال هذا الدرس التطبيقي، سنشغِّل الأمرَين 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. تفعيل واجهات برمجة تطبيقات الخدمة المطلوبة

نحتاج إلى التأكّد من تفعيل واجهات برمجة التطبيقات التالية في مشروعنا.

  • Network Services API
  • واجهة برمجة تطبيقات إدارة الشهادات
  • واجهة برمجة تطبيقات البث المباشر
  • واجهة برمجة التطبيقات لذاكرة التخزين المؤقت لـ Media CDN Edge

تفعيل Network Services API

لتفعيل واجهة برمجة التطبيقات لخدمات الشبكة، شغِّل الأمر التالي:

الأمر

gcloud services enable networkservices.googleapis.com

تفعيل واجهة برمجة تطبيقات إدارة الشهادات

لتفعيل واجهة برمجة تطبيقات إدارة الشهادات، شغِّل الأمر التالي:

الأمر

gcloud services enable certificatemanager.googleapis.com

تفعيل واجهة برمجة تطبيقات البث المباشر

لتفعيل واجهة برمجة التطبيقات للبث المباشر، شغِّل الأمر التالي:

الأمر

gcloud services enable livestream.googleapis.com

تفعيل واجهة برمجة التطبيقات Media CDN Edge Cache API

لتفعيل واجهة برمجة التطبيقات Media CDN Edge Cache API، شغِّل الأمر التالي:

الأمر

gcloud services enable edgecache.googleapis.com

التحقّق من تفعيل واجهات برمجة التطبيقات

شغِّل الأمر gcloud services list لعرض جميع واجهات برمجة التطبيقات المفعّلة. ومن المفترض أن تظهر لنا 4 واجهات برمجة تطبيقات في الإخراج.

الأمر

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 لإنشاء الحزمة:

الأمر

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

2. إتاحة إمكانية الوصول للجميع إلى الحزمة

سنستخدم الأمر iam gsutil لإتاحة الملفات للجميع:

الأمر

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

7. إعداد بيئة Live Streaming API

يتم تصميم مكونات سلسلة واجهة برمجة التطبيقات للبث المباشر على النحو التالي:

96b5d26aedeb89a6.png

لقد أنشأنا حزمة Cloud Storage live-streaming-storage-$LOGNAME في القسم السابق. في القسمَين التاليَين، سننشئ الموارد التالية:

  • إدخال البث المباشر: نقطة نهاية الإدخال هي نقطة نهاية يرسل إليها برنامج الترميز البث الوارد. يمكنك استخدام نقطة نهاية الإدخال لتحديد إعدادات البث، مثل درجة دقة الإدخال ونوع الإدخال واقتصاص الفيديو.
  • قناة البث المباشر: القناة هي مورد يستوعب البث الوارد من خلال نقطة نهاية إدخال، ويحوّل ترميز البث المباشر إلى عروض متعددة، وينشر أحداث بث مباشر للمخرجات بتنسيقات معيّنة في المكان المحدّد. يمكنك تضمين مصدرَي بيانات إدخال أساسي واحتياطي في القناة نفسها.

سننشئ الموارد التالية لاحقًا في التمرين المعملي:

  • برنامج الترميز: برنامج الترميز هو برنامج يُستخدم لإرسال أحداث بث الإدخال. سوف نستخدم في هذا التمرين المعملي برنامج FFmpeg.

8. إنشاء نقطة نهاية الإدخال وضبطها

إنشاء ملف enter.json

سننشئ ملف input.json لتحديد نوع إشارة البث المباشر. نستخدم في هذا التمرين المعملي إشارة RTMP مباشرة.

الأمر

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

إنشاء "نقطة نهاية الإدخال"

بعد الانتهاء من كتابة هذا التمرين، لن يكون هناك دعم gcloud لواجهة برمجة تطبيقات البث المباشر. سنستخدم الأمر curl لإجراء طلبات البيانات من واجهة برمجة التطبيقات.

الأمر

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

الأمر

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" يشير إلى أنّه تم إنشاء نقطة نهاية الإدخال وأنّها جاهزة.

حفظ عنوان URI

سنستخدم URI من المخرجات السابقة لاحقًا في التمرين المعملي. لنضبط متغيّر بيئة لـ 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 وتتألف من عرض واحد بدقة عالية (1280×720). سيتم ربط القناة بنقطة نهاية الإدخال وحزمة التخزين التي أنشأناها سابقًا.

إنشاء ملف 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" يشير إلى أنّه تم إنشاء نقطة نهاية الإدخال وأنّها جاهزة.

يُرجى العِلم أنّ قيمة "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. تهيئة Media CDN

في هذا القسم، سننشر Media CDN - البنية الأساسية لشبكة توصيل المحتوى (CDN). سننشئ الموارد التالية:

  1. أصل ذاكرة التخزين المؤقت على Edge
  2. خدمة ذاكرة التخزين المؤقت على Edge

1. إنشاء مصدر ذاكرة التخزين المؤقت على Edge

يمثّل مصدر ذاكرة التخزين المؤقت Edge أحد مواقع المحتوى، مثل حزمة Cloud Storage أو موقع تخزين تابع لجهة خارجية أو جهاز موازنة الحمل. في مصطلحات شبكة توصيل المحتوى، فإن المصدر (أو خادم المصدر) هو الموقع الذي يوجد فيه مصدر المحتوى الذي نريد توزيعه - على سبيل المثال كل CSS وJavaScript وHTML والصور وما إلى ذلك. وفي هذا التمرين، سننشئ مصدرًا يرتبط بحزمة Cloud Storage التي أنشأناها في بداية التمرين المعملي. سنطلق على مصدر ذاكرة التخزين المؤقت 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 Cache Origin، يمكننا إنشاء خدمة Edge Cache نفسها.

إنشاء ملف 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. في الملف أعلاه، هناك 3 قيم حقول قد يرغب المستخدمون في تعديلها:

  • name: اسم مثيل Media CDN - هنا: cme-demo
  • hosts: قائمة أسماء النطاقات التي ستحلها خدمة Media CDN هذه - هنا: demo.cme.com. سنستخدم هذا خلال هذا العرض التوضيحي. سنستخدم عنوان IP لمثيل Media CDN.
  • Origin: هذا هو أصل Edge Cache الذي أنشأناه في الخطوة السابقة. اضبط السمة على cme-origin - اسم مصدر شبكة توصيل محتوى الوسائط.

لمزيد من المعلومات حول المتغيّرات المختلفة التي يمكنك استخدامها في ملف YAML، يُرجى الاطّلاع على دليل إعداد خدمة Edge Cache Service.

إنشاء خدمة Edge Cache

سننشئ خدمة Edge Cache Service بالاسم 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 بضع دقائق.

مثال على الناتج

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 الطلبات منها. في هذه المرحلة، نحدد فقط demo.cme.com كمضيف. لتوفير تحليل الاسم لهذا النطاق، يمكنك ضبط السحابة الإلكترونية لمنطقة نظام أسماء النطاقات. مع ذلك، قد يكون الحل الأسهل هو إضافة عنوان 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 الطلبات من خلال "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 الذي أنشأناه في قسم "إنشاء نقطة نهاية الإدخال وضبطها" .

الأمر

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 لضبط متغيّرات البيئة.

الأمر

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 لوصف القناة. من المفترض أن يظهر في الإخراج أنّ حالة StreamingState تم تغييرها من "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"

من المفترض أن يظهر الرمز "streamingState": "STREAMING" في استجابة ملف JSON للمخرجات، ما يشير إلى أنّ القناة يتم بثها وأنّه يتم تحويل ترميز الإشارة المباشرة.

علينا أيضًا التحقّق من محتوى الحزمة حيث من المفترض أن يظهر لنا ملف بيان والعديد من مقاطع فيديو TS. شغّل الأمر التالي في Cloud Shell لسرد محتوى الحزمة التي أنشأناها في بداية التمرين المعملي واستخدمها 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

في هذه المرحلة، انتهينا من ما يلي:

  • واجهة برمجة تطبيقات البث المباشر: يتم إنشاء الإشارة المباشرة وتحويل ترميزها إلى حزمة عبر واجهة برمجة تطبيقات البث المباشر.
  • Media CDN: تم ضبط Media CDN مع حزمة مساحة تخزين البث المباشر باعتبارها مصدر Media CDN.

في الأقسام التالية، سنتحقق من صحة خدمة Edge Cache Service ثم سنبثّ الفيديو الذي تم تحويل ترميزه باستخدام عنوان IP anycast لـ Media CDN.

15. التحقق من عمل مثيل خدمة Edge Cache

في هذا القسم، سنتحقق من عمل مثيل خدمة Edge Cache Service على النحو المتوقّع. لإجراء ذلك، سنحاول الوصول إلى ملف من مثيل خدمة Edge cache باستخدام عنوان IP الخاص بخدمة Edge Cache Service. وعند الوصول إلى كائن لأول مرة، لا يتم تخزينها مؤقتًا بعد. من المفترض أن نلاحظ ذاكرة التخزين المؤقت للسمة MISS. بالنسبة إلى الطلب الأول، تتم قراءة الكائن من المصدر ويتم تخزينه مؤقتًا عند الحافة. ستؤدي كل المحاولات التالية للوصول إلى الملف نفسه إلى عرض ذاكرة تخزين مؤقت HIT نظرًا لأن الكائن مخزن مؤقتًا عند الحافة. لنتحقق من هذا السلوك:

شغِّل أمر curl التالي في Cloud Shell للوصول إلى ملف بيان الفيديو الذي تم تحويل ترميزه والمخزن في Edge Cache Origin:

الأمر

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. إذا ظهرت لك نتائج ذاكرة التخزين المؤقت في الإخراج، يعني ذلك أنّ شبكة توصيل محتوى الوسائط تعمل على النحو المتوقّع.

مثال على الناتج

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 Service على النحو المتوقّع.

16. بث فيديو إشارة مباشرة تم تحويل ترميزه باستخدام VLC

هذا هو الجزء الذي نربط فيه النقاط ونربط جميع الخطوات التي كنا نعمل عليها حتى الآن:

  • أنشأنا حزمة باسم live-streaming-storage-$LOGNAME تتلقى نتيجة الإشارة المباشرة التي تم تحويل ترميزها إلى محتوى HLS من خلال Live Streaming API.
  • تمّ إعداد واجهة برمجة التطبيقات Live Streaming API.
  • بدأنا تشغيل إشارة مباشرة لبروتوكول RTMP مع معيار FFmpeg تعمل على إرسال خلاصات إدخال/قناة بث مباشر عبر واجهة برمجة تطبيقات البث المباشر.
  • تحقّقنا من أنّه تم إرسال الإشارة المباشرة إلى القناة وتأكّدنا من أنّها في الوضع "streaming".
  • لقد تحقّقنا من أنّه تم إنشاء الملفات الناتجة التي تم تحويل ترميزها (البيان + شرائح الدعم الفني) وتخزينها في الحزمة live-streaming-storage-$LOGNAME.
  • تم إعداد مصدر ذاكرة التخزين المؤقت على Edge يُعرف باسم cme-origin باستخدام حزمة GCS live-streaming-storage-$LOGNAME كالمصدر.
  • تم إعداد مثيل لذاكرة التخزين المؤقت على Edge يسمى cme-demo مع cme-origin كأصل له.
  • تحققنا من السلوك (خطأ في ذاكرة التخزين المؤقت، نتيجة ذاكرة التخزين المؤقت) لمثيل خدمة Edge Cache.

أصبحنا الآن في مرحلة يمكننا من خلالها استخدام مشغّل فيديو لبث الإشارة المباشرة التي تم تحويل ترميزها عبر ذاكرة التخزين المؤقت لوسائط CDN. لتنفيذ هذا الإجراء، سنستخدم مشغّل VLC. VLC Player هو مشغّل وإطار عمل مجاني ومفتوح المصدر يعمل على عدة أنظمة أساسية لتشغيل معظم ملفات الوسائط المتعددة. ويشغِّل تنسيقات الوسائط التكيُّفية (مثل DASH وHLS). وتستند هذه الميزة إلى مبدأ البث التكيُّفي، إذ إنّها ستعدّل جودة الفيديو الذي يتمّ تشغيله وفقًا لجودة الاتصال بالشبكة ومعدّل نقل البيانات المتاح. من خلال مهمة تحويل الترميز التي أنجزناها للتو، استخدمنا الإعدادات المسبقة الافتراضية وأنشأنا صفتين "فقط": الدقة العادية والدقة العالية. عند بدء تشغيل الفيديو في المشغّل، سترى أنه يبدأ تشغيل تنسيق SD والتبديل بسرعة إلى التنسيق HD إذا كان الاتصال بالشبكة جيدًا بدرجة كافية.

سنبثّ إشارة البث المباشر التي تم تحويل ترميزها HLS (تنسيق فيديو Apple المتوافق على نطاق واسع). يُسمى الملف المقابل main.m3u8، وهو بيان HLS. ويشير البيان إلى مقاطع فيديو TS.

لاستخدام مشغّل VLC، انتقِل إلى https://www.videolan.org/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 التي نشرتها.
  • المسار إلى ملف فيديو البيان: "/". هذا هو المسار الذي استخدمناه في حزمة live-streaming-storage-$LOGNAME لتخزين ملفات الإشارات المباشرة التي تم تحويل ترميزها. المسار هو المسار الجذر هنا: "/".
  • اسم ملف فيديو البيان: ملف بيان HLS، main.m3u8

ثم انقر على "فتح". من المفترض أن يبدأ تشغيل الفيديو المباشر الذي تم تحويل ترميزه. سيظهر الفيديو على النحو الموضّح في لقطة الشاشة أدناه. سيظهر العدّاد الظاهر على الشاشة بزيادات بمقدار 1 ومن المفترض أن تتمكّن من سماع صوت صفير مستمر.

وهي عبارة عن إشارة مباشرة اختبارية أساسية لبروتوكول RTMP تم إنشاؤها بواسطة FFmpeg، ويتم تحويل ترميزها إلى HLS من خلال Live Streaming API ويتم عرضها من خلال ذاكرة التخزين المؤقت الخاصة بـ Media CDN:

28fc359b49d44ec2.png

يمكنك استخدام أي مشغّل آخر لبروتوكول HLS وMPEG DASH إذا أردت ذلك. فيما يلي بعض الأشياء التي قد ترغب في وضعها في الاعتبار:

  • Quicktime Player - مثبت بشكل افتراضي على أجهزة Mac. الأمر نفسه: افتح الاتصال بالشبكة على http://34.104.36.157/main.m3u8 - استبدل عنوان IP بمثيل خدمة Edge Cache Service.

17. مراقبة شبكة توصيل المحتوى (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 Console وانقر على الأشرطة الثلاثة > العمليات > المراقبة > لوحات المعلومات. من المفترض أن تظهر لك لوحة بيانات باسم "Media Edge Metrics (مقاييس حافة الوسائط)". انقر عليه وستظهر المقاييس التالية:

d0821d84a88a928d.png

18 تنظيف بيئة البرنامج

تهانينا على إكمال التمرين المعملي. في هذا القسم، سنحذف جميع الموارد التي أنشأتها في هذا القسم.

إيقاف إشارة 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 Cache:

الأمر

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