پخش زنده در Google Cloud با CDN رسانه و Live Streaming API

۱. مقدمه

شبکه‌های تحویل محتوا (CDN) با ذخیره‌سازی محتوای پرکاربرد در نزدیکی کاربران نهایی، قطع اتصالات نزدیک‌تر به کلاینت‌ها، استفاده مجدد از اتصالات به مبدا و از طریق اتخاذ پروتکل‌ها و سفارشی‌سازی‌های شبکه مدرن، عملکرد کاربر را بهبود می‌بخشند. برای کاربران (و مشتریان ما)، این به معنای تأخیر کمتر، قابلیت اطمینان بیشتر و کاهش هزینه است که منجر به بهبود فروش، تجربه وب و افزایش خالص تجربه کاربر می‌شود. امروزه تعداد بسیار کمی از سایت‌های مدرن و پلتفرم‌های پخش ویدیو بدون CDN کار می‌کنند.

آنچه یاد خواهید گرفت

این آزمایشگاه ما را در مراحل استقرار یک محیط گردش کار پخش زنده با Media CDN (CDN) + Cloud Media Live Streaming API (ترانسکد ویدیوی زنده) + Cloud Storage (فضای ذخیره‌سازی ویدیوها) + پخش‌کننده ویدیو (VLC، Google Shaka Player و غیره - HLS + پخش‌کننده آماده MPEG-DASH) راهنمایی می‌کند.

ما اجزای API پخش زنده - ورودی، کانال - را راه‌اندازی خواهیم کرد و یک فید زنده به ورودی/کانال با FFmpeg راه‌اندازی خواهیم کرد (FFmpeg می‌تواند یک سیگنال تست زنده تولید کند). API پخش زنده، فید زنده را تبدیل کد می‌کند. مانیفست و بخش‌های ویدیوی تبدیل کد شده در یک مخزن ذخیره‌سازی ابری ذخیره می‌شوند. سپس Media CDN را با مخزن ذخیره‌سازی ابری ویدیوی زنده به عنوان مبدا راه‌اندازی خواهیم کرد. در نهایت، از VLC Player برای پخش محتوای زنده ذخیره شده از طریق Media CDN استفاده خواهد شد. همچنین یک داشبورد Cloud Monitoring برای تجسم فعالیت Media CDN راه‌اندازی خواهیم کرد.

آنچه خواهید ساخت

در این آزمایش، محیط را بر اساس معماری زیر راه‌اندازی خواهیم کرد:

de33cb3e75d52549.png

ما اجزای زیر را راه‌اندازی خواهیم کرد و وظایف زیر را به عنوان بخشی از آزمایشگاه انجام خواهیم داد:

  • یک مخزن ذخیره‌سازی ابری گوگل (GCS) برای ذخیره‌سازی ویدیوهای زنده‌ی تبدیل‌شده ایجاد کنید
  • پیکربندی API پخش زنده برای تبدیل کد ویدیو به چندین فرمت: HLS + MPEG DASH، SD و HD
  • اجزای پخش زنده را تنظیم کنید: ورودی/کانال
  • کانال پخش زنده را شروع کنید
  • راه‌اندازی Media CDN با استفاده از GCS bucket به عنوان مبدا
  • FFmpeg را برای تغذیه کانال زنده تنظیم کنید
  • پخش زنده‌ی تبدیل کد شده را با یک پخش‌کننده‌ی ویدیو پخش کنید
  • یک داشبورد مانیتورینگ ابری راه‌اندازی کنید تا فعالیت CDN رسانه‌ای (تأخیر، آسیب به حافظه پنهان، از دست دادن حافظه پنهان و غیره) را رصد کنید.

توجه : برای این آزمایش، فرض می‌کنیم که کاربران به کنسول گوگل کلود دسترسی دارند و از قبل تنظیمات پروژه را انجام داده‌اند. همچنین فرض می‌کنیم که کاربران با یک محیط جدید شروع می‌کنند و هیچ تنظیماتی برای این نسخه آزمایشی ندارند.

تمام اقدامات پیکربندی از طریق خط فرمان در Cloud Shell انجام خواهد شد. ما همیشه می‌توانیم اجزای پیکربندی شده از طریق خط فرمان را در کنسول بررسی کنیم. در سراسر تمرین، اشاره‌گرهایی را خواهیم دید که به کنسول Google Cloud اشاره می‌کنند.

۲. قبل از شروع

دسترسی به Media CDN محدود شده است. برای دسترسی به Media CDN، با تیم حساب خود تماس بگیرید. آنها می‌توانند از طرف شما درخواست دسترسی ایجاد کنند. اگر عضوی از گوگل هستید و می‌خواهید پخش زنده را با Media CDN آزمایش کنید، برای درخواست دسترسی به Media CDN با مدیر بخش Media CDN تماس بگیرید.

۳. تنظیمات و الزامات

شروع پوسته ابری

اگرچه می‌توان از راه دور و از طریق لپ‌تاپ، گوگل کلود را مدیریت کرد، اما در این آزمایشگاه کد، از گوگل کلود شل ، یک محیط خط فرمان که در فضای ابری اجرا می‌شود، استفاده خواهید کرد.

از کنسول گوگل کلود ، روی آیکون Cloud Shell در نوار ابزار بالا سمت راست کلیک کنید:

55efc1aaa7a4d3ad.png

آماده‌سازی و اتصال به محیط فقط چند لحظه طول می‌کشد. وقتی تمام شد، باید چیزی شبیه به این را ببینید:

7ffe5cbb04455448.png

این ماشین مجازی با تمام ابزارهای توسعه‌ای که نیاز دارید، مجهز شده است. این ماشین مجازی یک دایرکتوری خانگی پایدار ۵ گیگابایتی ارائه می‌دهد و روی فضای ابری گوگل اجرا می‌شود که عملکرد شبکه و احراز هویت را تا حد زیادی بهبود می‌بخشد. تمام کارهای شما در این آزمایشگاه کد را می‌توان در یک مرورگر انجام داد. نیازی به نصب چیزی ندارید.

۴. نسخه Google Cloud SDK

در زمان نگارش این مطلب، نسخه 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

۵. پیش‌نیازها

قبل از اینکه پیکربندی منابع GCP را شروع کنیم، باید موارد زیر را انجام دهیم -

  1. متغیرهای محیطی را تنظیم کنید
  2. فعال کردن APIهای سرویس مورد نیاز

۱. تنظیم متغیرهای محیطی

در طول این تمرین، دستورات 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

تأیید کنید که متغیرها تنظیم شده‌اند

بیایید بررسی کنیم که آیا تمام متغیرهای محیطی مورد نیاز تنظیم شده‌اند یا خیر. باید در مجموع ۶ متغیر محیطی در خروجی ببینیم.

فرماندهی

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

۲. فعال کردن APIهای سرویس مورد نیاز

ما باید مطمئن شویم که API های زیر در پروژه ما فعال هستند.

  • API خدمات شبکه
  • رابط برنامه‌نویسی مدیریت گواهی
  • رابط برنامه‌نویسی پخش زنده
  • رابط برنامه‌نویسی کاربردی حافظه پنهان لبه CDN رسانه‌ای

فعال کردن API سرویس‌های شبکه

برای فعال کردن API سرویس‌های شبکه، دستور زیر را اجرا کنید:

فرماندهی

gcloud services enable networkservices.googleapis.com

فعال کردن API مدیریت گواهی

برای فعال کردن API مدیریت گواهینامه، دستور زیر را اجرا کنید:

فرماندهی

gcloud services enable certificatemanager.googleapis.com

فعال کردن API پخش زنده

برای فعال کردن API پخش زنده، دستور زیر را اجرا کنید:

فرماندهی

gcloud services enable livestream.googleapis.com

فعال کردن API حافظه پنهان لبه CDN مدیا

برای فعال کردن API حافظه پنهان Media CDN Edge، دستور زیر را اجرا کنید:

فرماندهی

gcloud services enable edgecache.googleapis.com

تأیید کنید که APIها فعال هستند

دستور gcloud services list را اجرا کنید تا تمام APIهای فعال شده را فهرست کنید. باید 4 API در خروجی ببینیم.

فرماندهی

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

مثال خروجی

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

۶. ایجاد سطل ذخیره‌سازی ابری

در این بخش موارد زیر را انجام خواهیم داد:

  1. یک سطل ذخیره‌سازی ابری ایجاد کنید
  2. سطل را در دسترس عموم قرار دهید

بعداً در این تمرین، از این باکت برای ذخیره فایل‌های ویدیویی تبدیل‌شده استفاده خواهیم کرد. این باکت همچنین به عنوان یک فضای ذخیره‌سازی اصلی برای سرویس Media CDN عمل خواهد کرد.

۱. سطل را ایجاد کنید

ما از دستور gsutil mb برای ایجاد سطل استفاده خواهیم کرد:

فرماندهی

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

۲. سطل را در دسترس عموم قرار دهید

ما از دستور gsutil iam برای در دسترس عموم قرار دادن فایل‌ها استفاده خواهیم کرد:

فرماندهی

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

۷. راه‌اندازی محیط API پخش زنده

اجزای زنجیره‌ی رابط برنامه‌نویسی کاربردی پخش زنده (Live Streaming API) به شرح زیر معماری شده‌اند:

۹۶b5d26aedeb89a6.png

ما در بخش قبلی، مخزن ذخیره‌سازی ابری live-streaming-storage-$LOGNAME ایجاد کردیم. در دو بخش بعدی، منابع زیر را ایجاد خواهیم کرد:

  • ورودی پخش زنده: نقطه پایانی ورودی، نقطه پایانی است که انکودر شما، جریان ورودی شما را به آن ارسال می‌کند. می‌توانید از نقطه پایانی ورودی برای تعیین پیکربندی‌های جریان خود، مانند وضوح ورودی، نوع ورودی و برش ویدیو، استفاده کنید.
  • کانال پخش زنده: یک کانال منبعی است که جریان ورودی را از طریق یک نقطه پایانی ورودی دریافت می‌کند، جریان ورودی را به چندین نسخه تبدیل کد می‌کند و جریان‌های زنده خروجی را در قالب‌های خاصی در مکان مشخص شده منتشر می‌کند. می‌توانید یک جریان ورودی اصلی و پشتیبان را در یک کانال واحد قرار دهید.

ما منابع زیر را بعداً در آزمایشگاه ایجاد خواهیم کرد:

  • انکودر: انکودر برنامه‌ای است که برای ارسال جریان‌های ورودی استفاده می‌شود. در این آزمایش، ما از FFmpeg استفاده خواهیم کرد.

۸. ایجاد و پیکربندی نقطه پایانی ورودی

فایل input.json را ایجاد کنید

ما یک فایل input.json برای مشخص کردن نوع سیگنال پخش زنده ایجاد خواهیم کرد. در این آزمایش، ما از سیگنال زنده RTMP استفاده می‌کنیم.

فرماندهی

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

ایجاد نقطه پایانی ورودی

در زمان نگارش این تمرین، جی‌کلود از رابط برنامه‌نویسی کاربردی پخش زنده (Live Stream API) پشتیبانی نمی‌کند. ما از دستور curl برای فراخوانی‌های API استفاده خواهیم کرد.

فرماندهی

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

مثال خروجی

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

خروجی اطلاعات مفید زیادی دارد، اما در حال حاضر باید روی دو فیلد تمرکز کنیم:

  • شناسه عملیات: از خروجی، شناسه عملیات را کپی کرده و یادداشت کنید. در زیر شناسه عملیات از مثال خروجی آمده است. این شناسه را می‌توانید در خط خروجی که با "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

۹. کانال پخش زنده را ایجاد و پیکربندی کنید

بیایید کانال پخش زنده را ایجاد کنیم، که با نقطه پایانی ورودی که در بخش قبل ایجاد کردیم مرتبط است. مثال زیر کانالی ایجاد می‌کند که یک پخش زنده HLS را تولید می‌کند که شامل یک نمایش واحد با کیفیت بالا (1280x720) است. این کانال با نقطه پایانی ورودی و سطل ذخیره‌سازی که قبلاً ایجاد کردیم مرتبط خواهد بود.

فایل channel.json را ایجاد کنید

در ترمینال Cloud Shell، دستور زیر را برای ایجاد فایل "channel.json" تایپ کنید:

فرماندهی

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

کانال را ایجاد کنید

برای ایجاد کانال، دستور curl زیر را اجرا کنید:

فرماندهی

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

مثال خروجی

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

شناسه عملیات را یادداشت و کپی کنید. در یکی از مراحل بعدی به آن نیاز خواهیم داشت. این شناسه را می‌توانید در خط خروجی که با "name" شروع می‌شود، پیدا کنید.

وضعیت را بررسی کنید

قبل از اینکه ادامه دهیم، باید بررسی کنیم که کانال با موفقیت ایجاد شده و آماده است.

در دستور زیر، <OPERATION> با شناسه عملیاتی که در بالا به دست آوردیم جایگزین کنید. در این مثال، این operation-1661405972853-5e70a38d6f27f-79100d00-310671b4 است.

فرماندهی

export OPERATION_ID_2=<OPERATION>

فرماندهی

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

مثال خروجی

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

دستور را دوباره اجرا کنید تا "done:true" را ببینید که نشان می‌دهد نقطه پایانی ورودی ایجاد شده و آماده است.

توجه داشته باشید که در حال حاضر "streamingState" روی "STOPPED" قرار دارد؛ کانال را در بخش بعدی آغاز خواهیم کرد.

۱۰. کانال پخش زنده را راه‌اندازی کنید

حالا که کانال پخش زنده خود را ایجاد کرده‌ایم، بیایید کانال را شروع کنیم. در این بخش، موارد زیر را انجام خواهیم داد:

  1. کانال پخش زنده را راه اندازی کنید
  2. وضعیت کانال را بررسی کنید، باید مطمئن شویم که streamingState در "AWAITING INPUT" قرار دارد.

۱. کانال را شروع کنید

در 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
}

۲. وضعیت کانال را بررسی کنید

برای دریافت وضعیت کانال، دستور 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 » را ببینید که نشان می‌دهد کانال در حال اجرا است و آماده دریافت سیگنال می‌باشد.

۱۱. پیکربندی CDN رسانه‌ای

در این بخش، ما Media CDN - زیرساخت CDN - را مستقر خواهیم کرد. ما منابع زیر را ایجاد خواهیم کرد:

  1. مبدا حافظه نهان لبه
  2. سرویس حافظه پنهان لبه

۱. یک مبدا Edge Cache ایجاد کنید

یک Edge Cache Origin نشان‌دهنده یک مکان محتوا، مانند یک مخزن ذخیره‌سازی ابری، یک مکان ذخیره‌سازی شخص ثالث یا یک متعادل‌کننده بار است. در اصطلاحات CDN، مبدأ (یا سرور مبدأ) مکانی است که منبع محتوایی که می‌خواهیم توزیع کنیم در آن قرار دارد - مثلاً تمام CSS، Javascript، HTML، تصاویر و غیره. برای این آزمایش، یک مبدأ ایجاد خواهیم کرد که به مخزن ذخیره‌سازی ابری که در ابتدای آزمایش ایجاد کردیم، نگاشت می‌شود. ما Edge Cache Origin را 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

۲. یک سرویس حافظه پنهان لبه ایجاد کنید

اکنون که 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 Service) را به صورت پیش‌فرض باقی می‌گذاریم. در فایل بالا، ۳ مقدار فیلد وجود دارد که کاربران ممکن است بخواهند آن‌ها را به‌روزرسانی کنند:

  • name : نام نمونه‌ی Media CDN - اینجا: cme-demo
  • hosts: فهرست نام‌های دامنه‌ای که توسط این سرویس CDN رسانه‌ای پردازش می‌شوند - اینجا: demo.cme.com . ما در این نسخه آزمایشی از این استفاده خواهیم کرد. ما از آدرس IP نمونه CDN رسانه‌ای استفاده خواهیم کرد.
  • Origin: این همان Edge Cache Origin است که در مرحله قبل ایجاد کردیم. آن را روی cme-origin تنظیم کنید - نام Media CDN Origin.

برای اطلاعات بیشتر در مورد متغیرهای مختلفی که می‌توانید در فایل YAML استفاده کنید، به راهنمای پیکربندی سرویس حافظه پنهان Edge مراجعه کنید.

ایجاد سرویس Edge Cache

ما یک سرویس Edge Cache با نام cme-demo ، روی Edge Cache Origin cme-origin و با هاست demo.cme.com ایجاد خواهیم کرد. برای ایجاد سرویس، دستور زیر را در Cloud Shell اجرا کنید:

فرماندهی

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

ایجاد سرویس Edge Cache ممکن است چند دقیقه طول بکشد.

مثال خروجی

Request issued for: [cme-demo]
Waiting for operation [projects/PROJECT_ID/locations/global/operations/operation-1670476252264-5ef4a0f9f36ce-dd380af5-321be9a0] to complete...done.     
createTime: '2022-12-07T18:08:54.403446942Z'
ipv4Addresses:
- 34.104.35.152
ipv6Addresses:
- '2600:1900:4110:d18::'
name: projects/PROJECT_ID/locations/global/edgeCacheServices/cme-demo
routing:
  hostRules:
  - hosts:
    - demo.cme.com
    - 34.104.35.152
    pathMatcher: routes
  pathMatchers:
  - name: routes
    routeRules:
    - headerAction:
        responseHeadersToAdd:
        - headerName: x-cache-status
          headerValue: '{cdn_cache_status}'
      matchRules:
      - prefixMatch: /
      origin: projects/123456789/locations/global/edgeCacheOrigins/cme-origin
      priority: '100'
      routeAction:
        cdnPolicy:
          cacheKeyPolicy: {}
          cacheMode: FORCE_CACHE_ALL
          defaultTtl: 3600s
          signedRequestMode: DISABLED
    - headerAction:
        responseHeadersToAdd:
        - headerName: x-cache-status
          headerValue: '{cdn_cache_status}'
      matchRules:
      - pathTemplateMatch: /**.m3u8
      origin: projects/123456789/locations/global/edgeCacheOrigins/cme-origin
      priority: '25'
      routeAction:
        cdnPolicy:
          cacheKeyPolicy: {}
          cacheMode: FORCE_CACHE_ALL
          defaultTtl: 1s
          signedRequestMode: DISABLED
    - headerAction: {}
      matchRules:
      - pathTemplateMatch: /**.ts
      origin: projects/123456789/locations/global/edgeCacheOrigins/cme-origin
      priority: '50'
      routeAction:
        cdnPolicy:
          cacheKeyPolicy: {}
          cacheMode: FORCE_CACHE_ALL
          defaultTtl: 2s
          signedRequestMode: DISABLED
updateTime: '2022-12-08T05:11:31.598744308Z'

آدرس‌های ipv4Addresses مربوط به نمونه‌ی Edge Cache Service را یادداشت و کپی کنید - در اینجا 34.104.36.157 . ما از آن برای به‌روزرسانی فایل cme-demo.yaml و بعداً برای پخش ویدیوی تبدیل‌شده استفاده خواهیم کرد.

سرویس حافظه نهان Edge را به‌روزرسانی کنید

در این مرحله، ایده خوبی است که پیکربندی سرویس Edge Cache را به‌روزرسانی کنید تا بتوانید بعداً از IP این سرویس برای پخش ویدیو استفاده کنید. فایل YAML سرویس Edge Cache به ما این امکان را می‌دهد که نام/IP تمام میزبان‌هایی را که سرویس Edge Cache درخواست‌های آنها را می‌پذیرد، فهرست کنیم. در این مرحله، ما فقط demo.cme.com را به عنوان میزبان مشخص کرده‌ایم. برای ارائه وضوح نام برای این دامنه، شما یک منطقه DNS را به صورت ابری پیکربندی می‌کنید. با این حال، یک راه حل آسان‌تر این است که آدرس IP را به لیست میزبان‌ها در فایل yaml اضافه کنید. فایل YAML را دوباره ویرایش کنید و آن را طوری ویرایش کنید که مانند تصویر زیر باشد:

name: cme-demo
routing:
  hostRules:
    - hosts:
        - demo.cme.com
        - IPADDRESS
      pathMatcher: routes
  pathMatchers:
    - name: routes
      routeRules:
        - headerAction:
            responseHeadersToAdd:
              - headerName: x-cache-status
                headerValue: "{cdn_cache_status}"
          matchRules:
            - prefixMatch: /
          origin: cme-origin
          priority: 100
          routeAction:
            cdnPolicy:
              cacheKeyPolicy: {}
              cacheMode: FORCE_CACHE_ALL
              defaultTtl: 3600s
              signedRequestMode: DISABLED
        - headerAction:
            responseHeadersToAdd:
              - headerName: x-cache-status
                headerValue: "{cdn_cache_status}"
          matchRules:
            - pathTemplateMatch: /**.m3u8
          origin: cme-origin
          priority: 25
          routeAction:
            cdnPolicy:
              cacheKeyPolicy: {}
              cacheMode: FORCE_CACHE_ALL
              defaultTtl: 1s
              signedRequestMode: DISABLED
        - headerAction: {}
          matchRules:
            - pathTemplateMatch: /**.ts
          origin: cme-origin
          priority: 50
          routeAction:
            cdnPolicy:
              cacheKeyPolicy: {}
              cacheMode: FORCE_CACHE_ALL
              defaultTtl: 2s
              signedRequestMode: DISABLED

برای اعمال تغییرات، فقط کافی است فایل YAML را دوباره وارد کنیم. در ترمینال Cloud Shell دستور زیر را اجرا کنید:

فرماندهی

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

خروجی دستور را بررسی کنید و مطمئن شوید که IP در لیست میزبان‌ها ظاهر می‌شود.

در این مرحله، نمونه سرویس Edge Cache درخواست‌هایی را که میزبان آنها "demo.cme.com" یا آدرس IP باشد، می‌پذیرد.

۱۲. سیگنال ورودی را تولید کنید

حالا که تمام سرویس‌های مورد نیاز را پیکربندی کرده‌ایم، بیایید سیگنال ورودی پخش زنده را تولید کنیم. در این بخش، موارد زیر را انجام خواهیم داد:

  1. نصب FFmpeg، یک نرم‌افزار متن‌باز رایگان
  2. یک سیگنال زنده آزمایشی به ورودی/کانال ارسال کنید

۱. نصب 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 به درستی نصب شد.

۲. سیگنال پخش زنده را به ورودی/کانال ارسال کنید

اکنون که 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 جدید باز کنید.

۱۳. باز کردن پوسته ابری جدید

در این مرحله، برای ادامه‌ی آزمایش، باید یک پنجره‌ی Cloud Shell جدید باز کنید، زیرا FFmpeg تا زمانی که با استفاده از <CTRL+C> دستور توقف آن را اجرا نکنید و در نتیجه تولید سیگنال زنده متوقف نشود، به طور دائم اجرا خواهد شد.

روی علامت "+" کنار نام ترمینال فعلی Cloud Shell کلیک کنید. این کار یک پنجره Cloud Shell اضافی باز می‌کند.

b3c7b0be6276c194.png

بقیه‌ی آزمایشگاه را در پنجره‌ی Cloud Shell که تازه باز شده است، اجرا کنید.

متغیرهای محیطی را تنظیم کنید

از آنجایی که این یک CloudShell جدید است، باید متغیرهای محیطی را دوباره تنظیم کنیم. ما از دستور source برای تنظیم متغیرهای محیطی استفاده خواهیم کرد.

فرماندهی

source ~/env_variables.txt

تأیید کنید که متغیرها تنظیم شده‌اند

بیایید بررسی کنیم که آیا تمام متغیرهای محیطی مورد نیاز تنظیم شده‌اند یا خیر. باید در مجموع ۶ متغیر محیطی در خروجی ببینیم.

فرماندهی

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

۱۴. بررسی کنید که سیگنال زنده در حال تبدیل کد است.

ما یک 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"

در پاسخ فایل JSON خروجی، باید "streamingState": "STREAMING" را ببینید - که نشان می‌دهد کانال در حال پخش است و سیگنال زنده در حال تبدیل کد است.

بیایید محتوای باکت را نیز بررسی کنیم، جایی که باید یک فایل مانیفست و چندین بخش ویدیوی 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

در این مرحله کار ما با موارد زیر تمام شده است:

  • رابط برنامه‌نویسی پخش زنده: سیگنال زنده از طریق رابط برنامه‌نویسی پخش زنده تولید و به یک سطل کد تبدیل می‌شود.
  • CDN رسانه‌ای: CDN رسانه‌ای پیکربندی شده با مخزن ذخیره‌سازی پخش زنده به عنوان مبدأ CDN رسانه‌ای.

در بخش‌های بعدی، سرویس Edge Cache را اعتبارسنجی خواهیم کرد و سپس ویدیوی تبدیل‌شده را با استفاده از آدرس IP Anycast مدیا CDN پخش خواهیم کرد.

۱۵. تأیید کنید که نمونه سرویس Edge Cache کار می‌کند

در این بخش، بررسی خواهیم کرد که آیا نمونه سرویس حافظه پنهان لبه (Edge Cache Service) مطابق انتظار کار می‌کند یا خیر. برای انجام این کار، سعی خواهیم کرد با استفاده از آدرس IP سرویس حافظه پنهان لبه (Edge Cache Service Service)، به یک فایل از نمونه سرویس حافظه پنهان لبه (Edge Cache Service) دسترسی پیدا کنیم. اولین باری که به یک شیء دسترسی پیدا می‌شود، هنوز در حافظه پنهان (Cache) ذخیره نشده است. باید یک خطای cache MISS مشاهده کنیم. برای اولین درخواست، شیء از مبدا خوانده شده و در لبه ذخیره می‌شود. تمام تلاش‌های بعدی برای دسترسی به همان فایل، خطای cache HIT را برمی‌گرداند، زیرا شیء اکنون در لبه ذخیره شده است. بیایید این رفتار را بررسی کنیم:

برای دسترسی به فایل مانیفست ویدیوی کدگذاری شده که در Edge Cache Origin ذخیره شده است، دستور curl زیر را در Cloud Shell اجرا کنید:

فرماندهی

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

به resolve که در آن از آدرس IP نمونه سرویس Edge Cache برای حل نام آن استفاده می‌کنیم، توجه کنید. حتماً از 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 را چاپ می‌کند.

فرماندهی

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 Mediae Edge همانطور که انتظار می‌رود کار می‌کند.

۱۶. پخش زنده‌ی ویدیوی تبدیل کد شده با VLC

این بخشی است که ما نقاط را به هم وصل می‌کنیم و تمام مراحلی را که تاکنون روی آنها کار کرده‌ایم، به هم پیوند می‌دهیم:

  • ما یک باکت به نام live-streaming-storage-$LOGNAME ایجاد کردیم که نتیجه سیگنال زنده تبدیل‌شده به محتوای HLS توسط رابط برنامه‌نویسی کاربردی پخش زنده را دریافت می‌کند.
  • ما API پخش زنده (Live Streaming API) را راه‌اندازی کردیم.
  • ما یک سیگنال زنده RTMP با FFmpeg راه‌اندازی کردیم که ورودی/کانال API پخش زنده را تغذیه می‌کند.
  • ما تأیید کردیم که سیگنال زنده به کانال ارسال شده و کانال در حالت streaming جریانی است.
  • ما تأیید کردیم که فایل‌های تبدیل‌شده‌ی حاصل (بخش‌های مانیفست + TS) تولید و در سطل live-streaming-storage-$LOGNAME ذخیره شده‌اند.
  • یک Edge Cache Origin به نام cme-origin با GCS bucket live-streaming-storage-$LOGNAME به عنوان مبدا راه‌اندازی شد.
  • یک نمونه Edge Cache به نام cme-demo با cme-origin به عنوان مبدا آن راه‌اندازی شد.
  • ما رفتار (از دست دادن حافظه پنهان، برخورد با حافظه پنهان) نمونه سرویس حافظه پنهان Edge را تأیید کردیم.

اکنون به نقطه‌ای رسیده‌ایم که می‌توانیم از یک پخش‌کننده ویدیو برای پخش سیگنال زنده‌ی تبدیل‌شده از طریق حافظه‌ی نهان Media CDN استفاده کنیم. برای انجام این کار، از پخش‌کننده‌ی VLC استفاده خواهیم کرد. پخش‌کننده‌ی VLC یک پخش‌کننده‌ی چندرسانه‌ای و چارچوب چندرسانه‌ای رایگان و متن‌باز چندسکویی است که اکثر فایل‌های چندرسانه‌ای را پخش می‌کند. این پخش‌کننده فرمت‌های رسانه‌ای تطبیقی ​​(مانند DASH و HLS) را پخش می‌کند. از اصل پخش تطبیقی ​​​​استفاده می‌کند - پخش‌کننده با توجه به کیفیت اتصال شبکه و پهنای باند موجود، کیفیت ویدیوی پخش‌شده را تطبیق می‌دهد. با کار تبدیل کدی که انجام دادیم، از تنظیمات پیش‌فرض استفاده کردیم و «فقط» دو کیفیت ایجاد کردیم: SD و HD. به محض شروع پخش ویدیو در پخش‌کننده، باید ببینید که پخش با فرمت SD شروع می‌شود و اگر اتصال شبکه شما به اندازه کافی خوب باشد، به سرعت به فرمت HD تغییر می‌کند.

ما سیگنال زنده‌ی تبدیل‌شده‌ی HLS (فرمت ویدیویی اپل که به‌طور گسترده پشتیبانی می‌شود) را پخش خواهیم کرد. فایل مربوطه main.m3u8 نام دارد - که مانیفست HLS است. مانیفست به بخش‌های ویدیوی TS اشاره می‌کند.

برای استفاده از پخش‌کننده VLC، به آدرس https://www.videolan.org/vlc/ بروید و نسخه‌ای از پخش‌کننده را برای سیستم عامل لپ‌تاپ خود دانلود کنید - VLC برای ویندوز، MacOSX، لینوکس، اندروید و iOS در دسترس است.

2a2d19abe728d222.png

پخش‌کننده را روی لپ‌تاپ خود نصب و اجرا کنید. ما برای چند مرحله‌ی بعدی از نسخه‌ی MacOSX پخش‌کننده استفاده خواهیم کرد.

برای پخش ویدیو، به «فایل» / «شبکه باز» بروید:

f85565301f7c68dc.png

آن را با موارد زیر تنظیم کنید:

  • آدرس اینترنتی: http://<Replace_With_Edge_Cache_IP>/main.m3u8 . این آدرس اینترنتی ویدیویی است که می‌خواهیم پخش کنیم. توجه:
  • IP مربوط به نمونه‌ی Media CDN: 34.105.35.246 . آن را با IP سرویس Cloud Media که پیاده‌سازی کرده‌اید جایگزین کنید.
  • مسیر فایل ویدیوی مانیفست: " / ". این مسیری است که ما در باکت live-streaming-storage-$LOGNAME برای ذخیره فایل‌های سیگنال زنده‌ی کد شده استفاده کردیم. این مسیر، مسیر ریشه در اینجا است: "/".
  • نام فایل ویدیویی مانیفست: فایل مانیفست HLS، main.m3u8 .

و روی «باز کردن» کلیک کنید. باید ویدیوی زنده‌ی تبدیل کد شده را ببینید که شروع به پخش می‌کند. ویدیو مانند تصویر زیر خواهد بود. شمارنده‌ی روی صفحه با گام‌های ۱ تایی اجرا می‌شود و باید بتوانید صدای بوق ممتد بشنوید.

این یک سیگنال زنده آزمایشی RTMP پایه است که توسط FFmpeg تولید شده، توسط API پخش زنده به HLS تبدیل کد شده و از طریق حافظه پنهان Media CDN ارائه می‌شود:

28fc359b49d44ec2.png

در صورت تمایل می‌توانید از هر پخش‌کننده HLS و MPEG DASH دیگری استفاده کنید. در اینجا مواردی وجود دارد که ممکن است بخواهید در نظر بگیرید:

  • پخش‌کننده‌ی کوئیک‌تایم - که به‌طور پیش‌فرض روی مک‌ها نصب شده است. اینجا هم همینطور: یک اتصال شبکه به آدرس http://34.104.36.157/main.m3u8 باز کنید - آدرس IP را با آدرس سرویس Edge Cache خود جایگزین کنید.

۱۷. نظارت بر CDN رسانه‌ای

یک الگوی داشبورد Media CDN توسط تیم 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

ممکن است راه‌اندازی آن چند دقیقه طول بکشد. به کنسول گوگل کلود بروید و روی ۳ نوار > عملیات > نظارت > داشبوردها کلیک کنید. باید داشبوردی به نام "Media Edge Metrics" ببینید. روی آن کلیک کنید تا معیارها را ببینید:

d0821d84a88a928d.png

۱۸. محیط آزمایشگاه را تمیز کنید

تبریک می‌گویم که این آزمایش را به پایان رساندید. در این بخش، تمام منابعی را که در طول آزمایش ایجاد کرده‌ایم، حذف خواهیم کرد.

سیگنال FFmpeg را متوقف کنید:

در ترمینال Cloud Shell که FFmpeg در آن اجرا می‌شود <CTRL+C> را فشار دهید.

کانال پخش زنده را متوقف کنید:

فرماندهی

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 Cache Origin:

فرماندهی

gcloud edge-cache origins delete cme-origin

با وارد کردن "Y" در هنگام درخواست، حذف را تأیید کنید

حذف داشبورد سفارشی

فرماندهی

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