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

1. مقدمة

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

المُعطيات

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

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

التطبيق الذي ستصممه

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

de33cb3e75d52549.png

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

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

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

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

2. قبل البدء

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

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- المتطلبات الأساسية

قبل بدء ضبط موارد Google Cloud Platform، علينا إجراء ما يلي:

  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

لتفعيل واجهة برمجة التطبيقات 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. إتاحة الوصول إلى الحزمة للجميع

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

حفظ عنوان URL

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

إنشاء ملف 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. ضبط شبكة توصيل محتوى الوسائط

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

  1. مصدر ذاكرة التخزين المؤقت للصفحة
  2. خدمة ذاكرة التخزين المؤقت في الأجهزة الطرفية

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

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

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

يتم ضبط إعدادات خدمة ذاكرة التخزين المؤقت Edge من خلال ملف 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: اسم نسخة "شبكة توصيل محتوى الوسائط"، هنا: cme-demo
  • hosts: قائمة أسماء النطاقات التي ستحلّها خدمة CDN للوسائط هذه: demo.cme.com سنستخدم هذا الإجراء أثناء هذه التجربة التوضيحية. سنستخدم عنوان IP لمثيل "شبكة توصيل المحتوى (CDN) للوسائط".
  • Origin: هذا هو مصدر ذاكرة التخزين المؤقت في Edge الذي أنشأناه للتو في الخطوة السابقة. اضبطه على cme-origin، وهو اسم نقطة انطلاق شبكة توصيل المحتوى (CDN) للوسائط.

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

إنشاء خدمة ذاكرة التخزين المؤقت في الحافة

سننشئ خدمة ذاكرة تخزين مؤقت على الحافة باسم cme-demo، على أصل ذاكرة التخزين المؤقت على الحافة 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 في قائمة المضيفين.

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

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

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

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

1. تثبيت FFmpeg

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

Command

sudo apt install ffmpeg -y

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

Command

ffmpeg -version

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

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

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

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

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

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

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.
  • شبكة توصيل محتوى الوسائط: تم ضبط شبكة توصيل محتوى الوسائط باستخدام حزمة تخزين البث المباشر كمصدر شبكة توصيل محتوى الوسائط.

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

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

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

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

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

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

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

2a2d19abe728d222.png

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

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

f85565301f7c68dc.png

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

  • عنوان URL: http://<Replace_With_Edge_Cache_IP>/main.m3u8. هذا هو عنوان URL للفيديو الذي نريد بثّه. ملاحظة:
  • عنوان IP لنسخة "شبكة توصيل محتوى الوسائط": 34.105.35.246. استبدِل عنوان IP بخدمة Cloud Media Service التي تم نشرها.
  • مسار ملف بيان الفيديو: "/". هذا هو المسار الذي استخدمناه في حزمة live-streaming-storage-$LOGNAME لتخزين ملفات إشارة البث المباشر التي تم تحويل ترميزها. المسار هو المسار الجذر هنا: "/".
  • اسم ملف بيان الفيديو: ملف بيان HLS، main.m3u8.

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

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

28fc359b49d44ec2.png

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

  • مشغّل Quicktime: يتم تثبيته تلقائيًا على أجهزة Mac. نفس الإجراء هنا: افتح اتصالاً بالشبكة على http://34.104.36.157/main.m3u8، واستبدِل عنوان IP بعنوان مثيل خدمة Edge Cache Service.

17. مراقبة شبكة توصيل محتوى الوسائط

أنشأ فريق SME نموذج لوحة بيانات "شبكة توصيل المحتوى" للوسائط على الرابط 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

أنشئ لوحة البيانات الخاصة بميزة "مراقبة السحابة الإلكترونية":

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

قد يستغرق الإعداد بضع دقائق. انتقِل إلى وحدة تحكّم Google Cloud وانقر على الأشرطة الثلاثة > العمليات > المراقبة > لوحات البيانات. من المفترض أن تظهر لك لوحة بيانات بعنوان "مقاييس حواف الوسائط". انقر على ذلك وسيظهر لك المقاييس:

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:

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