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

1. مقدمة

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

أهداف الدورة التعليمية

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

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

ما ستنشئه

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

de33cb3e75d52549.png

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

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

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

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

2. قبل البدء

الوصول إلى شبكة توصيل المحتوى (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. إصدار Google Cloud SDK

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

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. تفعيل واجهات برمجة التطبيقات المطلوبة للخدمة

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

  • 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، شغِّل الأمر التالي:

Command

gcloud services enable livestream.googleapis.com

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

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

Command

gcloud services enable edgecache.googleapis.com

التأكّد من أنّ واجهات برمجة التطبيقات مفعَّلة

نفِّذ الأمر gcloud services list لعرض قائمة بجميع واجهات برمجة التطبيقات المفعَّلة. من المفترض أن تظهر 4 واجهات برمجة تطبيقات في الناتج.

Command

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

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

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

6. إنشاء حزمة Cloud Storage

في هذا القسم، سننفّذ ما يلي:

  1. إنشاء حزمة في Cloud Storage
  2. إتاحة الوصول إلى الحزمة بشكل علني

في وقت لاحق من الدرس التطبيقي، سنستخدم هذه الحزمة لتخزين ملفات الفيديو التي تم تحويل ترميزها. سيعمل هذا الحِزمة أيضًا كمساحة تخزين أصلية لخدمة Media CDN.

1. إنشاء الحزمة

سنستخدم الأمر gsutil mb لإنشاء الحزمة:

Command

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

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

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

Command

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

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

تم تصميم مكونات سلسلة Live Streaming API على النحو التالي:

96b5d26aedeb89a6.png

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

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

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

  • برنامج الترميز: برنامج يُستخدم لإرسال تدفقات الإدخال. في هذا التمرين العملي، سنستخدم FFmpeg.

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

إنشاء ملف input.json

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

Command

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

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

في وقت كتابة هذا المختبر، لا تتوفّر إمكانية استخدام gcloud مع Live Stream API. سنستخدم الأمر curl لإجراء طلبات البيانات من واجهة برمجة التطبيقات.

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> بمعرّف الموارد المنتظم الذي دوّنته للتوّ أعلاه. يمكنك أيضًا استخدام طريقة 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- إنشاء قناة البث المباشر وضبط إعداداتها

لننشئ الآن قناة البث المباشر المرتبطة بنقطة نهاية الإدخال التي أنشأناها في القسم السابق. ينشئ المثال التالي قناة تبث محتوى مباشرًا وفق بروتوكول HTTP ‏(HLS) يتضمّن عرضًا واحدًا عالي الدقة (1280x720). سيتم ربط القناة بنقطة نهاية الإدخال وحزمة التخزين التي أنشأناها سابقًا.

إنشاء ملف channel.json

في نافذة Cloud Shell، اكتب الأمر التالي لإنشاء ملف "channel.json":

Command

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

إنشاء القناة

نفِّذ أمر curl التالي لإنشاء القناة:

Command

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

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

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

سجِّل رقم تعريف العملية وانسَخه. سنحتاج إليه في إحدى الخطوات القادمة. يمكن العثور على ذلك في سطر الإخراج الذي يبدأ بـ "name".

التحقّق من الحالة

قبل المتابعة، علينا التأكّد من أنّه تم إنشاء القناة بنجاح وأنّها جاهزة.

في الأمر أدناه، استبدِل <OPERATION> برقم تعريف العملية الذي حصلنا عليه للتو أعلاه. في هذا المثال، تكون قيمة operation-1661405972853-5e70a38d6f27f-79100d00-310671b4

Command

export OPERATION_ID_2=<OPERATION>

Command

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

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

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

أعِد تشغيل الأمر إلى أن تظهر لك "done:true" للإشارة إلى أنّه تم إنشاء نقطة نهاية الإدخال وأصبحت جاهزة.

يُرجى العِلم أنّ "streamingState" في الوقت الحالي هو "STOPPED" وسنبدأ القناة في القسم التالي.

10. بدء قناة البث المباشر

بعد إنشاء قناة البث المباشر، لنبدأ القناة. في هذا القسم، سننفّذ ما يلي:

  1. بدء قناة البث المباشر
  2. تحقَّق من حالة القناة، ويجب التأكّد من أنّ streamingState هي "AWAITING INPUT"

1. بدء القناة

في Cloud Shell، نفِّذ الأمر curl التالي لبدء القناة:

Command

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

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

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

2. التحقّق من حالة القناة

نفِّذ أمر curl التالي للحصول على حالة القناة:

Command

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

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

"streamingState": "AWAITING_INPUT",

أعِد تشغيل الأمر إلى أن يظهر لك "AWAITING_INPUT" للإشارة إلى أنّ القناة تعمل وجاهزة لتلقّي إشارة.

11. ضبط Media CDN

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

  1. مصدر Edge Cache
  2. Edge Cache Service

1. إنشاء Edge Cache Origin

يمثّل Edge Cache Origin موقعًا للمحتوى، مثل حزمة Cloud Storage أو موقع تخزين تابع لجهة خارجية أو موازن تحميل. في مصطلحات شبكة توصيل المحتوى (CDN)، يشير المصدر (أو خادم المصدر) إلى الموقع الجغرافي الذي يتضمّن مصدر المحتوى الذي نريد توزيعه، مثل جميع ملفات CSS وJavaScript وHTML والصور وما إلى ذلك. في هذا المختبر، سننشئ مصدرًا يتم ربطه بحزمة Cloud Storage التي أنشأناها في بداية المختبر. سنطلق على مصدر Edge Cache اسم cme-origin. مصدر شبكة توصيل المحتوى هو المكان الذي يتم فيه تخزين كل المحتوى المصدر قبل توزيعه على خوادم ذاكرة التخزين المؤقت على الحافة.

سنستخدم الأمر 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 Service

بعد إعداد Edge Cache Origin، يمكننا إنشاء خدمة Edge Cache نفسها.

إنشاء ملف cme-demo.yaml

يتم ضبط إعدادات "خدمة ذاكرة التخزين المؤقت على الحافة" من خلال ملف 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 Cache Origin الذي أنشأناه للتو في الخطوة السابقة. اضبطها على cme-origin - اسم نقطة الانطلاق في شبكة توصيل المحتوى (CDN) الخاصة بالوسائط.

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

إنشاء خدمة Edge Cache

سننشئ خدمة Edge Cache Service باسم cme-demo على Edge Cache Origin cme-origin مع المضيف demo.cme.com. لإنشاء الخدمة، نفِّذ الأمر التالي في Cloud Shell:

Command

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 Cache Service

في هذه المرحلة، من المستحسن تعديل إعدادات "خدمة ذاكرة التخزين المؤقت على الحافة" لتتمكّن من استخدام عنوان IP الخاص بالخدمة لبث الفيديو لاحقًا. يتيح لنا ملف YAML الخاص بخدمة Edge Cache Service إدراج جميع أسماء المضيفين أو عناوين IP التي ستقبل منها خدمة Edge Cache Service الطلبات. في هذه المرحلة، حدّدنا 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 الطرفية، نفِّذ الأمر التالي:

Command

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

تحقَّق من نتيجة الأمر وتأكَّد من ظهور عنوان IP في قائمة المضيفين.

في هذه المرحلة، سيقبل مثيل "خدمة ذاكرة التخزين المؤقت على الحافة" الطلبات التي تتضمّن "demo.cme.com" أو عنوان IP كمضيف.

12. إنشاء إشارة الإدخال

بعد أن أعددنا جميع الخدمات المطلوبة، لننشئ إشارة إدخال البث المباشر. في هذا القسم، سننفّذ ما يلي:

  1. تثبيت FFmpeg، وهو برنامج مجاني مفتوح المصدر
  2. إرسال إشارة بث مباشر تجريبية إلى الإدخال/القناة

1. تثبيت FFmpeg

‫FFmpeg هو مشروع برنامج مجاني ومفتوح المصدر يتألف من مجموعة من المكتبات والبرامج للتعامل مع ملفات الفيديو والصوت والوسائط المتعددة الأخرى وعمليات البث. في نافذة Cloud Shell الطرفية، استخدِم الأمر التالي لتثبيت FFmpeg:

Command

sudo apt install ffmpeg -y

بعد اكتمال عملية التثبيت، لننتحقق من تثبيت FFmpeg بشكل صحيح من خلال التحقّق من إصدارها:

Command

ffmpeg -version

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

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

تم تثبيت FFmpeg بشكل صحيح.

2. ابدأ إشارة البث المباشر إلى الإدخال/القناة

بعد تثبيت FFmpeg، سنرسل الآن دفق إدخال تجريبيًا إلى نقطة نهاية الإدخال لإنشاء البث المباشر.

في وحدة Cloud Shell الطرفية، شغِّل الأمر التالي باستخدام متغيّر بيئة URI الذي أنشأناه في قسم "إنشاء نقطة نهاية الإدخال وضبطها".

Command

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

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

13. فتح Cloud Shell جديد

في هذه المرحلة، عليك فتح نافذة Cloud Shell جديدة لمواصلة التمرين العملي، لأنّ FFmpeg سيظل يعمل بشكل دائم إلى أن تضغط على <CTRL+C> لإيقاف الأمر وبالتالي إيقاف إنشاء الإشارة المباشرة.

انقر على علامة "+" بجانب اسم نافذة Cloud Shell الحالية. سيؤدي ذلك إلى فتح نافذة Cloud Shell إضافية.

b3c7b0be6276c194.png

نفِّذ بقية التدريب العملي في نافذة Cloud Shell التي تم فتحها حديثًا.

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

بما أنّ هذه CloudShell جديدة، علينا ضبط متغيرات البيئة مرة أخرى. سنستخدم الأمر source لضبط متغيرات البيئة.

Command

source ~/env_variables.txt

التأكّد من ضبط المتغيّرات

لنتأكّد من ضبط جميع متغيّرات البيئة المطلوبة. من المفترض أن يظهر إجمالي 6 متغيرات بيئية في الناتج.

Command

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

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

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

14. التأكّد من أنّ الإشارة المباشرة يتم تحويل ترميزها

سنعرض curl لوصف القناة. يجب أن نرى في الناتج أنّ قيمة streamingState قد تغيّرت من "AWAITING_INPUT" إلى "STREAMING"

Command

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

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

لنتأكّد أيضًا من محتوى الحزمة التي من المفترض أن يظهر فيها ملف بيان وعدة مقاطع فيديو بتنسيق 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 Service، ثم سنبث الفيديو المحوَّل باستخدام عنوان IP الخاص ببث أي محتوى من Media CDN.

15. التأكّد من أنّ مثيل Edge Cache Service يعمل

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

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

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 الذي أنشأناه للتوّ.

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

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 Cache باسم cme-origin باستخدام حزمة GCS live-streaming-storage-$LOGNAME كنقطة انطلاق.
  • تم إعداد مثيل Edge Cache باسم cme-demo مع cme-origin كنقطة انطلاق.
  • تحقّقنا من سلوك مثيل "خدمة ذاكرة التخزين المؤقت على الحافة" (البيانات غير متوفرة في ذاكرة التخزين المؤقت، نتيجة ذاكرة التخزين المؤقت).

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

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

لاستخدام VLC Player، انتقِل إلى https://www.videolan.org/vlc/ ونزِّل إصدارًا من المشغّل لنظام تشغيل الكمبيوتر المحمول، إذ يتوفّر VLC لأنظمة التشغيل Windows وMacOSX وLinux وAndroid وiOS.

2a2d19abe728d222.png

ثبِّت المشغّل على الكمبيوتر المحمول وشغِّله. سنستخدم إصدار مشغّل MacOSX في الخطوات القليلة التالية.

لتشغيل فيديو، انتقِل إلى "ملف" / "فتح شبكة":

f85565301f7c68dc.png

يمكنك إعدادها باستخدام:

  • عنوان URL: http://<Replace_With_Edge_Cache_IP>/main.m3u8 هذا هو عنوان URL للفيديو الذي نريد بثه. ملاحظة:
  • عنوان IP الخاص بمثيل Media CDN: 34.105.35.246 استبدِلها بعنوان IP الخاص بخدمة 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. رصد شبكة توصيل محتوى الوسائط

أنشأ فريق 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" وانقر على الرموز الثلاثة > "العمليات" > "المراقبة" > "لوحات البيانات". من المفترض أن تظهر لك لوحة بيانات باسم "مقاييس Media Edge". انقر على ذلك وستظهر لك المقاييس:

d0821d84a88a928d.png

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

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

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

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