মিডিয়া CDN এবং লাইভ স্ট্রিমিং API সহ Google ক্লাউডে লাইভ স্ট্রিমিং

১. ভূমিকা

কন্টেন্ট ডেলিভারি নেটওয়ার্ক (CDN) প্রায়শই ব্যবহৃত কন্টেন্টকে প্রান্তিক ব্যবহারকারীদের কাছাকাছি ক্যাশ করে, ক্লায়েন্টের কাছাকাছি সংযোগ স্থাপন করে, উৎসের সাথে সংযোগ পুনঃব্যবহার করে এবং আধুনিক নেটওয়ার্কিং প্রোটোকল ও কাস্টমাইজেশন গ্রহণের মাধ্যমে ব্যবহারকারীর পারফরম্যান্স উন্নত করে। ব্যবহারকারীদের (এবং আমাদের গ্রাহকদের) জন্য এর অর্থ হলো কম ল্যাটেন্সি, অধিক নির্ভরযোগ্যতা এবং খরচ হ্রাস—যা উন্নত বিক্রয়, ওয়েব অভিজ্ঞতা এবং সার্বিকভাবে ব্যবহারকারীর অভিজ্ঞতা বৃদ্ধি করে। আজকাল খুব কম আধুনিক সাইট এবং ভিডিও স্ট্রিমিং প্ল্যাটফর্মই CDN ছাড়া পরিচালিত হয়।

আপনি যা শিখবেন

এই ল্যাবটি আমাদেরকে মিডিয়া সিডিএন (CDN) + ক্লাউড মিডিয়া লাইভ স্ট্রিমিং এপিআই (লাইভ ভিডিও ট্রান্সকোডিং) + ক্লাউড স্টোরেজ (ভিডিও সংরক্ষণের জন্য) + ভিডিও প্লেয়ার (ভিএলসি, গুগল শাকা প্লেয়ার, ইত্যাদি - এইচএলএস + এমপিইজি-ড্যাশ প্রস্তুত প্লেয়ার) ব্যবহার করে একটি লাইভ স্ট্রিমিং ওয়ার্কফ্লো পরিবেশ স্থাপন করার ধাপগুলো সম্পর্কে নির্দেশনা দেবে।

আমরা লাইভ স্ট্রিমিং এপিআই-এর উপাদানগুলো—ইনপুট, চ্যানেল—সেট আপ করব এবং FFmpeg ব্যবহার করে ইনপুট/চ্যানেলে একটি লাইভ ফিড চালু করব (FFmpeg একটি লাইভ টেস্ট সিগন্যাল তৈরি করতে পারে)। লাইভ স্ট্রিমিং এপিআই লাইভ ফিডটিকে ট্রান্সকোড করবে। ট্রান্সকোড করা ভিডিও ম্যানিফেস্ট এবং সেগমেন্টগুলো একটি ক্লাউড স্টোরেজ বাকেটে সংরক্ষণ করা হবে। এরপর আমরা লাইভ ভিডিও ক্লাউড স্টোরেজ বাকেটটিকে অরিজিন হিসেবে ব্যবহার করে একটি মিডিয়া সিডিএন সেট আপ করব। সবশেষে, মিডিয়া সিডিএন-এর মাধ্যমে ক্যাশ করা লাইভ কন্টেন্ট চালানোর জন্য ভিএলসি প্লেয়ার ব্যবহার করা হবে। আমরা মিডিয়া সিডিএন-এর কার্যকলাপ দেখার জন্য একটি ক্লাউড মনিটরিং ড্যাশবোর্ডও সেট আপ করব।

আপনি যা তৈরি করবেন

এই ল্যাবে আমরা নিম্নলিখিত স্থাপত্যের উপর ভিত্তি করে পরিবেশটি স্থাপন করব:

de33cb3e75d52549.png

ল্যাবের অংশ হিসেবে আমরা নিম্নলিখিত উপাদানগুলো স্থাপন করব এবং নিম্নলিখিত কাজগুলো সম্পাদন করব:

  • লাইভ ট্রান্সকোড করা ভিডিও সংরক্ষণের জন্য একটি গুগল ক্লাউড স্টোরেজ (GCS) বাকেট তৈরি করুন।
  • ভিডিওটিকে একাধিক ফরম্যাটে (HLS + MPEG DASH, SD এবং HD) ট্রান্সকোড করার জন্য লাইভ স্ট্রিমিং API কনফিগার করুন।
  • লাইভ স্ট্রিমিংয়ের উপাদানগুলো সেট আপ করুন: ইনপুট/চ্যানেল
  • লাইভ স্ট্রিম চ্যানেলটি চালু করুন
  • GCS বাকেটকে অরিজিন হিসেবে ব্যবহার করে মিডিয়া সিডিএন সেটআপ করুন।
  • লাইভ চ্যানেলে ফিড দেওয়ার জন্য FFmpeg সেট আপ করুন।
  • একটি ভিডিও প্লেয়ারের মাধ্যমে ট্রান্সকোড করা লাইভ ফিডটি স্ট্রিম করুন।
  • মিডিয়া সিডিএন কার্যকলাপ (লেটেন্সি, ক্যাশে হিট, ক্যাশে মিস, ইত্যাদি) নিরীক্ষণ করার জন্য একটি ক্লাউড মনিটরিং ড্যাশবোর্ড সেটআপ করুন।

দ্রষ্টব্য : এই ল্যাবের জন্য, আমরা ধরে নিচ্ছি যে ব্যবহারকারীদের গুগল ক্লাউড কনসোলে অ্যাক্সেস আছে এবং তাদের একটি প্রজেক্ট আগে থেকেই সেটআপ করা আছে। আমরা আরও ধরে নিচ্ছি যে ব্যবহারকারীরা একটি নতুন এনভায়রনমেন্ট দিয়ে শুরু করছেন এবং এই ডেমোর জন্য তাদের কিছুই সেটআপ করা নেই।

সমস্ত কনফিগারেশন কার্যক্রম ক্লাউড শেল -এর কমান্ড লাইনের মাধ্যমে করা হবে। আমরা কমান্ড লাইনের মাধ্যমে কনফিগার করা কম্পোনেন্টগুলো কনসোলে যেকোনো সময় পরীক্ষা করতে পারব। পুরো ল্যাব জুড়ে আমরা নির্দেশক দেখতে পাব যা গুগল ক্লাউড কনসোলের দিকে নির্দেশ করবে।

২. শুরু করার আগে

মিডিয়া সিডিএন-এ প্রবেশাধিকার সীমিত। মিডিয়া সিডিএন-এ প্রবেশাধিকার পেতে, আপনার অ্যাকাউন্ট টিমের সাথে যোগাযোগ করুন। তারা আপনার পক্ষ থেকে একটি প্রবেশাধিকারের অনুরোধ তৈরি করে দিতে পারে। আপনি যদি গুগলের গ্রাহক হন এবং মিডিয়া সিডিএন ব্যবহার করে লাইভ স্ট্রিমিং পরীক্ষা করতে চান, তবে মিডিয়া সিডিএন-এ প্রবেশাধিকারের অনুরোধ জানাতে মিডিয়া সিডিএন-এর পিএম-এর সাথে যোগাযোগ করুন।

৩. সেটআপ এবং প্রয়োজনীয়তা

ক্লাউড শেল শুরু করুন

যদিও গুগল ক্লাউড আপনার ল্যাপটপ থেকে দূরবর্তীভাবে পরিচালনা করা যায়, এই কোডল্যাবে আপনি গুগল ক্লাউড শেল ব্যবহার করবেন, যা ক্লাউডে চলমান একটি কমান্ড লাইন পরিবেশ।

গুগল ক্লাউড কনসোল থেকে, উপরের ডানদিকের টুলবারে থাকা ক্লাউড শেল আইকনটিতে ক্লিক করুন:

55efc1aaa7a4d3ad.png

পরিবেশটি প্রস্তুত করতে এবং এর সাথে সংযোগ স্থাপন করতে মাত্র কয়েক মুহূর্ত সময় লাগবে। এটি শেষ হলে, আপনি এইরকম কিছু দেখতে পাবেন:

7ffe5cbb04455448.png

এই ভার্চুয়াল মেশিনটিতে আপনার প্রয়োজনীয় সমস্ত ডেভেলপমেন্ট টুলস লোড করা আছে। এটি একটি স্থায়ী ৫ জিবি হোম ডিরেক্টরি প্রদান করে এবং গুগল ক্লাউডে চলে, যা নেটওয়ার্ক পারফরম্যান্স ও অথেনটিকেশনকে ব্যাপকভাবে উন্নত করে। এই কোডল্যাবে আপনার সমস্ত কাজ একটি ব্রাউজারের মধ্যেই করা যাবে। আপনাকে কিছুই ইনস্টল করতে হবে না।

৪. গুগল ক্লাউড এসডিকে সংস্করণ

এই প্রতিবেদন লেখার সময়, 408.0.0 হলো গুগল ক্লাউড এসডিকে-র সর্বশেষ সংস্করণ। এই ল্যাবের সমস্ত কমান্ড গুগল ক্লাউড এসডিকে-র সর্বশেষ সংস্করণ ব্যবহার করে পরীক্ষা করা হয়েছে। সামনে এগোনোর আগে, অনুগ্রহ করে নিশ্চিত হয়ে নিন যে ক্লাউড শেল এসডিকে-র সর্বশেষ সংস্করণ ব্যবহার করছে।

এসডিকে সংস্করণ পরীক্ষা করা হচ্ছে

আমরা SDK ভার্সন চেক করার জন্য gcloud version কমান্ডটি ব্যবহার করব।

আদেশ

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. প্রয়োজনীয় সার্ভিস এপিআইগুলো সক্রিয় করুন

১. পরিবেশ ভেরিয়েবল সেট আপ করুন

এই ল্যাব জুড়ে আমরা কয়েকটি ভেরিয়েবল সহ gcloud এবং curl কমান্ড চালাব। আমাদের নিম্নলিখিত এনভায়রনমেন্ট ভেরিয়েবলগুলো কনফিগার করতে হবে।

  • প্রকল্প আইডি
  • প্রকল্প নম্বর
  • ব্যবহারকারীর নাম
  • অঞ্চল
  • আইডি ইনপুট করুন
  • চ্যানেল আইডি

প্রজেক্ট আইডি এবং ব্যবহারকারীর নাম

এই এনভায়রনমেন্ট ভেরিয়েবলগুলো সাধারণত ক্লাউডশেলে আগে থেকেই কনফিগার করা থাকে। আমরা env কমান্ড ব্যবহার করে তা যাচাই করব।

আদেশ

env | grep -E 'DEVSHELL_PROJECT_ID=|LOGNAME'

আউটপুট উদাহরণ

DEVSHELL_PROJECT_ID=<YOUR_PROJECT_ID>
LOGNAME=<YOUR_USERNAME>

env_variables ফাইলটি তৈরি করুন

env_variables.txt ফাইলটি তৈরি করতে cat কমান্ড ব্যবহার করুন। নিচের কমান্ডটি ব্যবহারকারীর হোম ডিরেক্টরিতে 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-গুলো সক্রিয় আছে কিনা তা নিশ্চিত করতে হবে।

  • নেটওয়ার্ক পরিষেবা এপিআই
  • সার্টিফিকেট ম্যানেজার এপিআই
  • লাইভস্ট্রিম এপিআই
  • মিডিয়া সিডিএন এজ ক্যাশে এপিআই

নেটওয়ার্ক সার্ভিসেস এপিআই সক্রিয় করুন

নেটওয়ার্ক সার্ভিসেস এপিআই সক্রিয় করতে, নিম্নলিখিত কমান্ডটি চালান:

আদেশ

gcloud services enable networkservices.googleapis.com

সার্টিফিকেট ম্যানেজার এপিআই সক্রিয় করুন

সার্টিফিকেট ম্যানেজার এপিআই সক্রিয় করতে, নিম্নলিখিত কমান্ডটি চালান:

আদেশ

gcloud services enable certificatemanager.googleapis.com

লাইভ স্ট্রিম এপিআই সক্রিয় করুন

লাইভ স্ট্রিম এপিআই সক্রিয় করতে, নিম্নলিখিত কমান্ডটি চালান:

আদেশ

gcloud services enable livestream.googleapis.com

মিডিয়া সিডিএন এজ ক্যাশে এপিআই সক্রিয় করুন

মিডিয়া সিডিএন এজ ক্যাশ এপিআই সক্রিয় করতে, নিম্নলিখিত কমান্ডটি চালান:

আদেশ

gcloud services enable edgecache.googleapis.com

এপিআইগুলো সক্রিয় আছে কিনা তা যাচাই করুন।

সক্রিয় থাকা সমস্ত API-এর তালিকা দেখতে gcloud services list কমান্ডটি চালান। আউটপুটে আমরা ৪টি 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. বালতিটি সর্বসাধারণের জন্য প্রবেশযোগ্য করুন

পরবর্তীতে ল্যাবে, আমরা ট্রান্সকোড করা ভিডিও ফাইলগুলো সংরক্ষণ করতে এই বাকেটটি ব্যবহার করব। এই বাকেটটি মিডিয়া সিডিএন সার্ভিসের জন্য একটি অরিজিন স্টোরেজ হিসেবেও কাজ করবে।

১. বালতিটি তৈরি করুন

আমরা বাকেটটি তৈরি করতে gsutil mb কমান্ডটি ব্যবহার করব:

আদেশ

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

২. বালতিটি সর্বসাধারণের জন্য প্রবেশযোগ্য করুন।

ফাইলগুলো সর্বজনীনভাবে উপলব্ধ করার জন্য আমরা gsutil iam কমান্ডটি ব্যবহার করব:

আদেশ

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

৭. লাইভ স্ট্রিমিং এপিআই পরিবেশ সেট আপ করা

লাইভ স্ট্রিমিং এপিআই চেইনের উপাদানগুলো নিম্নরূপভাবে বিন্যস্ত করা হয়েছে:

96b5d26aedeb89a6.png

আমরা পূর্ববর্তী বিভাগে live-streaming-storage-$LOGNAME ক্লাউড স্টোরেজ বাকেটটি তৈরি করেছি। পরবর্তী দুটি বিভাগে, আমরা নিম্নলিখিত রিসোর্সগুলো তৈরি করব:

  • লাইভ স্ট্রিমিং ইনপুট: ইনপুট এন্ডপয়েন্ট হলো এমন একটি এন্ডপয়েন্ট যেখানে আপনার এনকোডার আপনার ইনপুট স্ট্রিম পাঠায়। আপনি ইনপুট এন্ডপয়েন্ট ব্যবহার করে আপনার স্ট্রিমের জন্য বিভিন্ন কনফিগারেশন, যেমন ইনপুট রেজোলিউশন, ইনপুট টাইপ এবং ভিডিও ক্রপিং, নির্দিষ্ট করতে পারেন।
  • লাইভ স্ট্রিমিং চ্যানেল: চ্যানেল হলো এমন একটি রিসোর্স যা একটি ইনপুট এন্ডপয়েন্টের মাধ্যমে ইনপুট স্ট্রিম গ্রহণ করে, সেই ইনপুট স্ট্রিমকে একাধিক সংস্করণে ট্রান্সকোড করে এবং নির্দিষ্ট স্থানে নির্দিষ্ট ফরম্যাটে আউটপুট লাইভ স্ট্রিম প্রকাশ করে। আপনি একই চ্যানেলে একটি প্রাইমারি এবং একটি ব্যাকআপ ইনপুট স্ট্রিম অন্তর্ভুক্ত করতে পারেন।

আমরা পরে ল্যাবে নিম্নলিখিত উপকরণগুলো তৈরি করব:

  • এনকোডার: এনকোডার হলো একটি প্রোগ্রাম যা ইনপুট স্ট্রিম পাঠাতে ব্যবহৃত হয়। এই ল্যাবে আমরা FFmpeg ব্যবহার করব।

৮. ইনপুট এন্ডপয়েন্ট তৈরি এবং কনফিগার করুন

input.json ফাইলটি তৈরি করুন

লাইভ স্ট্রিম সিগন্যালের ধরন নির্দিষ্ট করার জন্য আমরা একটি input.json ফাইল তৈরি করব। এই ল্যাবে আমরা RTMP লাইভ সিগন্যাল ব্যবহার করছি।

আদেশ

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

ইনপুট এন্ডপয়েন্ট তৈরি করুন

এই ল্যাবটি লেখার সময় পর্যন্ত, লাইভ স্ট্রিম এপিআই-এর জন্য জিক্লাউড (gcloud) সাপোর্ট নেই। আমরা এপিআই কল করার জন্য curl কমান্ড ব্যবহার করব।

আদেশ

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

আউটপুট উদাহরণ

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

আউটপুটে অনেক দরকারি তথ্য আছে, কিন্তু এই মুহূর্তে আমাদের দুটি ক্ষেত্রের ওপর মনোযোগ দিতে হবে:

  • অপারেশন আইডি: আউটপুট থেকে অপারেশন আইডিটি কপি করে লিখে রাখুন। নিচে আউটপুটের একটি উদাহরণ দেওয়া হলো। এটি আউটপুটের "name" দিয়ে শুরু হওয়া লাইনে পাওয়া যাবে। "operation-1661405972853-5e70a38d6f27f-79100d00-310671b4"
  • অবস্থা: আমাদের অপেক্ষা করতে হবে যতক্ষণ না অবস্থাটি "done": false থেকে "done": true তে পরিবর্তিত হয়।

অবস্থা যাচাই করুন

সামনে অগ্রসর হওয়ার আগে, আমাদের যাচাই করে নিতে হবে যে ইনপুট এন্ডপয়েন্টটি সফলভাবে তৈরি হয়েছে এবং প্রস্তুত আছে।

নীচের কমান্ডে, <OPERATION> এর জায়গায় আমরা উপরে পাওয়া অপারেশনটির আইডি বসান। এই উদাহরণে, আইডিটি হলো "operation-1661405972853-5e70a38d6f27f-79100d00-310671b4"

আদেশ

export OPERATION_ID_1=<OPERATION>

আদেশ

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

আউটপুট উদাহরণ

{
  "name": "projects/PROJECT_NUMBER/locations/us-west2/operations/operation-1661408816982-5e70ae25cea49-617844f0-8fdcb4a1",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata",
    "createTime": "2022-08-25T06:26:57.001530499Z",
    "endTime": "2022-08-25T06:26:57.043623522Z",
    "target": "projects/PROJECT_NUMBER/locations/us-west2/inputs/lab-live-input",
    "verb": "create",
    "requestedCancellation": false,
    "apiVersion": "v1"
  },
  "done": true,
  "response": {
    "@type": "type.googleapis.com/google.cloud.video.livestream.v1.Input",
    "name": "projects/PROJECT_ID/locations/us-west2/inputs/lab-live-input",
    "createTime": "2022-08-25T06:26:56.997623672Z",
    "updateTime": "2022-08-25T06:26:56.997623672Z",
    "type": "RTMP_PUSH",
    "uri": "rtmp://34.94.97.220/live/4b7846a1-4a67-44ed-bfd0-d98281b6464a",
    "tier": "HD"
  }
}

"done:true" না দেখা পর্যন্ত কমান্ডটি পুনরায় চালান, যা নির্দেশ করে যে ইনপুট এন্ডপয়েন্টটি তৈরি হয়েছে এবং প্রস্তুত।

URI সংরক্ষণ করুন

আমরা ল্যাবের পরবর্তী অংশে আগের আউটপুট থেকে URI ব্যবহার করব। এই মুহূর্তে, চলুন URI জন্য একটি এনভায়রনমেন্ট ভ্যারিয়েবল সেট করি।

আদেশ

export URI=<uri>

<uri> এর জায়গায় উপরে উল্লেখিত URI-টি বসান। ঐচ্ছিকভাবে, আপনি URI-টি পাওয়ার জন্য GET মেথডও ব্যবহার করতে পারেন।

আদেশ

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

৯. লাইভ স্ট্রিমিং চ্যানেল তৈরি ও কনফিগার করুন

চলুন, লাইভ স্ট্রিমিং চ্যানেলটি তৈরি করি, যা আমরা আগের অংশে তৈরি করা ইনপুট এন্ডপয়েন্টের সাথে যুক্ত করব। নিচের উদাহরণটি এমন একটি চ্যানেল তৈরি করে যা একটি একক, হাই-ডেফিনিশন (1280x720) রেন্ডিশন সমন্বিত একটি HLS লাইভ স্ট্রিম তৈরি করবে। চ্যানেলটি ইনপুট এন্ডপয়েন্ট এবং আমাদের পূর্বে তৈরি করা স্টোরেজ বাকেটের সাথে যুক্ত থাকবে।

channel.json ফাইলটি তৈরি করুন

ক্লাউড শেল টার্মিনালে, একটি "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" অবস্থায় আছে।

১. চ্যানেলটি চালু করুন

ক্লাউড শেলে, চ্যানেলটি চালু করতে নিম্নলিখিত 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 " দেখতে পান, যা নির্দেশ করে যে চ্যানেলটি চালু আছে এবং সংকেত গ্রহণের জন্য প্রস্তুত।

১১. মিডিয়া সিডিএন কনফিগার করুন

এই অংশে আমরা মিডিয়া সিডিএন – অর্থাৎ সিডিএন পরিকাঠামোটি স্থাপন করব। আমরা নিম্নলিখিত রিসোর্সগুলো তৈরি করব:

  1. এজ ক্যাশে অরিজিন
  2. এজ ক্যাশে পরিষেবা

১. একটি এজ ক্যাশে অরিজিন তৈরি করুন

একটি এজ ক্যাশ অরিজিন একটি কন্টেন্টের অবস্থানকে বোঝায়, যেমন একটি ক্লাউড স্টোরেজ বাকেট, একটি তৃতীয় পক্ষের স্টোরেজ লোকেশন, বা একটি লোড ব্যালেন্সার। CDN-এর পরিভাষায়, অরিজিন (বা অরিজিন সার্ভার) হলো সেই অবস্থান যেখানে আমরা যে কন্টেন্ট বিতরণ করতে চাই তার উৎস অবস্থিত – যেমন সমস্ত CSS, জাভাস্ক্রিপ্ট, HTML, ছবি, ইত্যাদি। এই ল্যাবের জন্য, আমরা এমন একটি অরিজিন তৈরি করব যা ল্যাবের শুরুতে তৈরি করা ক্লাউড স্টোরেজ বাকেটটির সাথে ম্যাপ করা থাকবে। আমরা এজ ক্যাশ অরিজিনটির নাম দেব 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 Service-টি তৈরি করতে পারি।

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

আমরা এজ ক্যাশ সার্ভিস কনফিগারেশনের সমস্ত ডিফল্ট অপরিবর্তিত রাখব। উপরের ফাইলটিতে ৩টি ফিল্ড ভ্যালু আছে যা ব্যবহারকারীরা আপডেট করতে চাইতে পারেন:

  • name : মিডিয়া সিডিএন ইনস্ট্যান্সের নাম - এখানে: cme-demo
  • hosts: ডোমেইন নেমগুলোর তালিকা যা এই মিডিয়া সিডিএন সার্ভিস দ্বারা রিজলভ করা হবে - এখানে: demo.cme.com । আমরা এই ডেমোর সময় এটি ব্যবহার করব। আমরা মিডিয়া সিডিএন ইনস্ট্যান্সের আইপি অ্যাড্রেস ব্যবহার করব।
  • Origin: এটি হলো এজ ক্যাশ অরিজিন যা আমরা আগের ধাপে তৈরি করেছি। এটিকে cme-origin এ সেট করুন – যা হলো মিডিয়া সিডিএন অরিজিনের নাম।

YAML ফাইলে আপনি যে বিভিন্ন ভেরিয়েবল ব্যবহার করতে পারেন সে সম্পর্কে আরও তথ্যের জন্য, এজ ক্যাশ সার্ভিস কনফিগারেশন গাইড দেখুন।

এজ ক্যাশে পরিষেবা তৈরি করুন

আমরা cme-origin এজ ক্যাশ অরিজিনে এবং demo.cme.com হোস্টে cme-demo নামের একটি এজ ক্যাশ সার্ভিস তৈরি করব। সার্ভিসটি তৈরি করতে ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালান:

আদেশ

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

এজ ক্যাশ সার্ভিসটি তৈরি হতে কয়েক মিনিট সময় লাগতে পারে।

আউটপুট উদাহরণ

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'

Edge Cache Service ইনস্ট্যান্সটির ipv4Addresses টি (এখানে 34.104.36.157 ) নোট করে কপি করুন। আমরা এটি cme-demo.yaml ফাইলটি আপডেট করতে এবং পরে ট্রান্সকোড করা ভিডিওটি স্ট্রিম করতে ব্যবহার করব।

এজ ক্যাশে পরিষেবা আপডেট করুন

এই পর্যায়ে এজ ক্যাশ সার্ভিস কনফিগারেশন আপডেট করে নেওয়া ভালো, যাতে পরবর্তীতে ভিডিও স্ট্রিম করার জন্য সার্ভিসটির আইপি ব্যবহার করা যায়। এজ ক্যাশ সার্ভিস YAML ফাইলটি আমাদেরকে সেই সমস্ত হোস্ট নেম/আইপি তালিকাভুক্ত করার সুযোগ দেয় যেখান থেকে এজ ক্যাশ সার্ভিস অনুরোধ গ্রহণ করবে। এই পর্যায়ে আমরা শুধুমাত্র demo.cme.com কে একটি হোস্ট হিসেবে নির্দিষ্ট করেছি। এই ডোমেইনের জন্য নেম রেজোলিউশন প্রদান করতে, আপনি একটি ডিএনএস জোন কনফিগার করতে পারেন। তবে, একটি সহজ সমাধান হলো 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 ফাইলটি পুনরায় ইম্পোর্ট করতে হবে। ক্লাউড শেল টার্মিনালে নিম্নলিখিত কমান্ডটি চালান:

আদেশ

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

কমান্ডের আউটপুট পরীক্ষা করুন এবং যাচাই করুন যে আইপিটি হোস্টের তালিকায় দেখা যাচ্ছে কিনা।

এই পর্যায়ে এজ ক্যাশ সার্ভিস ইনস্ট্যান্সটি হোস্ট হিসেবে "demo.cme.com" অথবা আইপি অ্যাড্রেস সহ যেকোনো অনুরোধ গ্রহণ করবে।

১২. ইনপুট সংকেত তৈরি করুন

এখন যেহেতু আমরা সমস্ত প্রয়োজনীয় পরিষেবা কনফিগার করে ফেলেছি, চলুন লাইভ স্ট্রিম ইনপুট সিগন্যালটি তৈরি করি। এই অংশে, আমরা নিম্নলিখিত কাজগুলো করব:

  1. FFmpeg ইনস্টল করুন, এটি একটি বিনামূল্যের ওপেন-সোর্স সফটওয়্যার।
  2. ইনপুট/চ্যানেলে একটি পরীক্ষামূলক লাইভ সিগন্যাল পাঠান

১. FFmpeg ইনস্টল করুন

FFmpeg হলো একটি ফ্রি এবং ওপেন-সোর্স সফটওয়্যার প্রজেক্ট, যা ভিডিও, অডিও এবং অন্যান্য মাল্টিমিডিয়া ফাইল ও স্ট্রিম পরিচালনার জন্য একাধিক লাইব্রেরি ও প্রোগ্রামের সমন্বয়ে গঠিত। ক্লাউড শেল টার্মিনালে 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 ইনস্টল করা হয়ে গেছে, আমরা লাইভ স্ট্রিম তৈরি করার জন্য ইনপুট এন্ডপয়েন্টে একটি পরীক্ষামূলক ইনপুট স্ট্রিম পাঠাবো।

"ইনপুট এন্ডপয়েন্ট তৈরি এবং কনফিগার করুন" বিভাগে আমরা যে URI এনভায়রনমেন্ট ভেরিয়েবলটি তৈরি করেছিলাম, সেটি ব্যবহার করে ক্লাউড শেল টার্মিনালে নিম্নলিখিত কমান্ডটি চালান।

আদেশ

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

আপনি দেখবেন FFmpeg টেস্ট লাইভ সিগন্যালটি পাঠাচ্ছে। কমান্ডটি প্রম্পট ফিরিয়ে আনবে না। যতক্ষণ না আপনি এটি বন্ধ করছেন, সিগন্যালটি তৈরি হতে থাকবে। ল্যাবের বাকি অংশের জন্য আপনাকে একটি নতুন ক্লাউড শেল উইন্ডো খুলতে হবে।

১৩. নতুন ক্লাউড শেল খুলুন

এই পর্যায়ে ল্যাবটি চালিয়ে যাওয়ার জন্য আপনাকে একটি নতুন ক্লাউড শেল উইন্ডো খুলতে হবে, কারণ যতক্ষণ না আপনি <CTRL+C> চেপে এটিকে বন্ধ করছেন এবং এর মাধ্যমে লাইভ সিগন্যাল তৈরি হওয়া বন্ধ করছেন, ততক্ষণ FFmpeg স্থায়ীভাবে চলতে থাকবে।

বর্তমান ক্লাউড শেল টার্মিনালের নামের পাশে থাকা "+" চিহ্নে ক্লিক করুন। এতে একটি অতিরিক্ত ক্লাউড শেল উইন্ডো খুলবে।

b3c7b0be6276c194.png

নতুন খোলা ক্লাউড শেল উইন্ডোতে ল্যাবের বাকি অংশ চালান।

পরিবেশ ভেরিয়েবল সেট আপ করুন

যেহেতু এটি একটি নতুন ক্লাউডশেল, তাই আমাদের এনভায়রনমেন্ট ভেরিয়েবলগুলো আবার সেট করতে হবে। এনভায়রনমেন্ট ভেরিয়েবলগুলো সেট করার জন্য আমরা ` 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 ভিডিও সেগমেন্ট দেখতে পাব। ল্যাবের শুরুতে তৈরি করা এবং লাইভ স্ট্রিমিং 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

এই পর্যায়ে আমরা নিম্নলিখিত বিষয়গুলো সম্পন্ন করেছি:

  • লাইভ স্ট্রিমিং এপিআই: লাইভ স্ট্রিমিং এপিআই-এর মাধ্যমে লাইভ সিগন্যালটি তৈরি এবং ট্রান্সকোড করে একটি বাকেটে রূপান্তর করা হয়।
  • মিডিয়া সিডিএন: লাইভ স্ট্রিমিং স্টোরেজ বাকেটকে মিডিয়া সিডিএন-এর অরিজিন হিসেবে ব্যবহার করে মিডিয়া সিডিএন কনফিগার করা হয়েছে।

পরবর্তী অংশগুলোতে, আমরা এজ ক্যাশ সার্ভিসটি যাচাই করব এবং তারপর মিডিয়া সিডিএন অ্যানিকাস্ট আইপি অ্যাড্রেস ব্যবহার করে ট্রান্সকোড করা ভিডিওটি স্ট্রিম করব।

১৫. এজ ক্যাশ সার্ভিস ইনস্ট্যান্সটি কাজ করছে কিনা তা যাচাই করুন।

এই অংশে আমরা যাচাই করব যে এজ ক্যাশ সার্ভিস ইনস্ট্যান্সটি প্রত্যাশিতভাবে কাজ করছে কিনা। এটি করার জন্য, আমরা এজ ক্যাশ সার্ভিস ইনস্ট্যান্সের আইপি অ্যাড্রেস ব্যবহার করে একটি ফাইল অ্যাক্সেস করার চেষ্টা করব। প্রথমবার যখন কোনো অবজেক্ট অ্যাক্সেস করা হয়, তখন সেটি ক্যাশ করা থাকে না। এক্ষেত্রে আমরা একটি ক্যাশ মিস (cache MISS দেখতে পাব। প্রথম অনুরোধের জন্য, অবজেক্টটি অরিজিন থেকে পড়া হয় এবং এজে ক্যাশ করা হয়। একই ফাইল অ্যাক্সেস করার পরবর্তী সমস্ত প্রচেষ্টায় একটি ক্যাশ HIT রিটার্ন করবে, কারণ অবজেক্টটি এখন এজে ক্যাশ করা আছে। চলুন এই আচরণটি যাচাই করে দেখি:

Edge Cache Origin-এ সংরক্ষিত ট্রান্সকোডেড ভিডিও ম্যানিফেস্ট ফাইলটি অ্যাক্সেস করতে Cloud Shell-এ নিম্নলিখিত curl কমান্ডটি চালান:

আদেশ

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

লক্ষ্য করুন, আমরা Edge Cache Service ইনস্ট্যান্সের নামটি রিজলভ করার জন্য এর IP অ্যাড্রেস ব্যবহার করেছি। নিশ্চিত করুন যে আপনি demo.cme.com:<IP> ব্যবহার করছেন, যেখানে IP হলো আমাদের এইমাত্র তৈরি করা Edge Cache Service ইনস্ট্যান্সটির IP।

আউটপুটে 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 ফাইলটির জন্য একাধিক অনুরোধ পাঠাব, এবং সবকিছু সঠিকভাবে কনফিগার করা থাকলে, মিডিয়া সিডিএন তার ক্যাশ থেকে কন্টেন্ট পরিবেশন করা শুরু করবে। নিচের কমান্ডটি ১০টি কার্ল (curl) অনুরোধ পাঠাবে এবং শুধুমাত্র x-cache-status হেডারটি প্রিন্ট করবে।

আদেশ

for i in {1..10};do curl -Is --resolve demo.cme.com:80:<Replace_With_Edge_Cache_IP> "http://demo.cme.com/main.m3u8" | grep x-cache-status;done

আউটপুটে ক্যাশে hit এবং miss মিশ্রণ থাকা উচিত। যদি আপনি আউটপুটে ক্যাশে হিট দেখতে পান, তাহলে মিডিয়া সিডিএন প্রত্যাশিতভাবে কাজ করছে।

আউটপুট উদাহরণ

x-cache-status: den;miss
x-cache-status: den;hit
x-cache-status: den;hit
x-cache-status: den;hit
x-cache-status: den;hit
x-cache-status: den;hit
x-cache-status: den;hit
x-cache-status: den;hit
x-cache-status: den;hit
x-cache-status: den;hit

ক্যাশে হিটটি লক্ষ্য করুন, কারণ অবজেক্টটি এখন এজে ক্যাশ করা হয়েছে। ক্লাউড মিডি এজ সার্ভিসটি প্রত্যাশা অনুযায়ী কাজ করছে।

১৬. VLC দিয়ে ট্রান্সকোড করা লাইভ সিগন্যাল ভিডিও স্ট্রিম করুন।

এই পর্যায়ে আমরা এখন পর্যন্ত করা সমস্ত ধাপগুলোকে একসূত্রে গাঁথব:

  • আমরা live-streaming-storage-$LOGNAME নামে একটি বাকেট তৈরি করেছি, যেটি লাইভ স্ট্রিমিং এপিআই দ্বারা লাইভ সিগন্যালকে এইচএলএস কন্টেন্টে ট্রান্সকোড করার ফলাফল গ্রহণ করে।
  • আমরা লাইভ স্ট্রিমিং এপিআইটি স্থাপন করেছি।
  • আমরা FFmpeg ব্যবহার করে একটি RTMP লাইভ সিগন্যাল চালু করেছি, যা লাইভ স্ট্রিমিং API-এর ইনপুট/চ্যানেলে ডেটা পাঠায়।
  • আমরা যাচাই করে দেখেছি যে চ্যানেলে লাইভ সিগন্যাল পাঠানো হচ্ছিল এবং চ্যানেলটি streaming মোডে ছিল।
  • আমরা যাচাই করে দেখেছি যে, ফলস্বরূপ ট্রান্সকোড করা ফাইলগুলো (ম্যানিফেস্ট + টিএস সেগমেন্ট) live-streaming-storage-$LOGNAME বাকেটটিতে তৈরি ও সংরক্ষিত হয়েছে।
  • live-streaming-storage-$LOGNAME GCS বাকেটকে অরিজিন হিসেবে ব্যবহার করে cme-origin নামে একটি এজ ক্যাশ অরিজিন সেট আপ করা হয়েছিল।
  • cme-demo নামের একটি এজ ক্যাশ ইনস্ট্যান্স cme-origin অরিজিন হিসেবে সেট আপ করা হয়েছিল।
  • আমরা এজ ক্যাশ সার্ভিস ইনস্ট্যান্সটির আচরণ (ক্যাশ মিস, ক্যাশ হিট) যাচাই করেছি।

আমরা এখন এমন একটি পর্যায়ে আছি যেখানে আমরা মিডিয়া সিডিএন ক্যাশের মাধ্যমে ট্রান্সকোড করা লাইভ সিগন্যালটি স্ট্রিম করার জন্য একটি ভিডিও প্লেয়ার ব্যবহার করতে পারি। এটি করার জন্য আমরা ভিএলসি প্লেয়ার ব্যবহার করব। ভিএলসি প্লেয়ার হলো একটি ফ্রি এবং ওপেন সোর্স ক্রস-প্ল্যাটফর্ম মাল্টিমিডিয়া প্লেয়ার ও ফ্রেমওয়ার্ক যা বেশিরভাগ মাল্টিমিডিয়া ফাইল প্লে করতে পারে। এটি অ্যাডাপটিভ মিডিয়া ফরম্যাট (যেমন ড্যাশ এবং এইচএলএস) প্লে করে। এটি অ্যাডাপটিভ স্ট্রিমিং- এর নীতি ব্যবহার করে – আপনার নেটওয়ার্ক সংযোগের মান এবং উপলব্ধ ব্যান্ডউইথের উপর ভিত্তি করে, প্লেয়ারটি প্লে করা ভিডিওর মান পরিবর্তন করে নেয়। আমরা এইমাত্র যে ট্রান্সকোডিংয়ের কাজটি করেছি, তাতে আমরা ডিফল্ট প্রিসেট ব্যবহার করে "কেবল" দুটি কোয়ালিটি তৈরি করেছি: এসডি এবং এইচডি। যখন আমরা প্লেয়ারে ভিডিওটি প্লে করা শুরু করব, তখন আপনি দেখবেন এটি প্রথমে এসডি ফরম্যাটে প্লে হওয়া শুরু করবে এবং আপনার নেটওয়ার্ক সংযোগ যথেষ্ট ভালো হলে দ্রুত এইচডি ফরম্যাটে পরিবর্তিত হয়ে যাবে।

আমরা HLS (অ্যাপলের বহুল সমর্থিত ভিডিও ফরম্যাট) ট্রান্সকোড করা লাইভ সিগন্যালটি স্ট্রিম করব। এর সংশ্লিষ্ট ফাইলটির নাম main.m3u8 – যেটি হলো HLS ম্যানিফেস্ট। এই ম্যানিফেস্টটি TS ভিডিও সেগমেন্টগুলোকে নির্দেশ করে।

VLC প্লেয়ার ব্যবহার করতে, https://www.videolan.org/vlc/ ওয়েবসাইটে যান এবং আপনার ল্যাপটপের অপারেটিং সিস্টেমের জন্য প্লেয়ারটির একটি সংস্করণ ডাউনলোড করুন — VLC উইন্ডোজ, ম্যাকওএসএক্স, লিনাক্স, অ্যান্ড্রয়েড এবং আইওএস-এর জন্য উপলব্ধ।

2a2d19abe728d222.png

আপনার ল্যাপটপে প্লেয়ারটি ইনস্টল করে চালু করুন। পরবর্তী কয়েকটি ধাপে আমরা প্লেয়ারটির MacOSX সংস্করণটি ব্যবহার করব।

ভিডিও চালানোর জন্য, "ফাইল" / "ওপেন নেটওয়ার্ক"-এ যান:

f85565301f7c68dc.png

এর সাথে এটি সেট আপ করুন:

  • URL: http://<Replace_With_Edge_Cache_IP>/main.m3u8 । এটি সেই ভিডিওর URL যা আমরা স্ট্রিম করতে চাই। দ্রষ্টব্য:
  • মিডিয়া সিডিএন ইনস্ট্যান্সের আইপি: 34.105.35.246 । এটি আপনার স্থাপন করা ক্লাউড মিডিয়া সার্ভিসের আইপি দিয়ে প্রতিস্থাপন করুন।
  • ম্যানিফেস্ট ভিডিও ফাইলের পাথ: " / "। ট্রান্সকোড করা লাইভ সিগন্যাল ফাইলগুলো সংরক্ষণ করার জন্য আমরা live-streaming-storage-$LOGNAME বাকেটে এই পাথটি ব্যবহার করেছি। এখানে পাথটি হলো রুট পাথ: "/"।
  • ম্যানিফেস্ট ভিডিও ফাইলের নাম: HLS ম্যানিফেস্ট ফাইল, main.m3u8

এবং "ওপেন"-এ ক্লিক করুন। আপনি দেখবেন ট্রান্সকোড করা লাইভ ভিডিওটি চলতে শুরু করেছে। ভিডিওটি নিচের স্ক্রিনশটের মতো দেখাবে। স্ক্রিনের কাউন্টারটি ১ করে বাড়তে থাকবে এবং আপনি একটি একটানা বিপ শব্দ শুনতে পাবেন।

এটি FFmpeg দ্বারা তৈরি একটি সাধারণ RTMP পরীক্ষামূলক লাইভ সিগন্যাল, যা লাইভ স্ট্রিমিং API-এর মাধ্যমে HLS-এ ট্রান্সকোড করা হয় এবং মিডিয়া CDN ক্যাশের মাধ্যমে পরিবেশন করা হয়:

28fc359b49d44ec2.png

আপনি চাইলে অন্য যেকোনো HLS এবং MPEG DASH প্লেয়ার ব্যবহার করতে পারেন। এখানে কয়েকটি দেওয়া হলো যা আপনি বিবেচনা করতে পারেন:

  • কুইকটাইম প্লেয়ার - ম্যাক-এ ডিফল্টভাবে ইনস্টল করা থাকে। এখানেও একই: http://34.104.36.157/main.m3u8- এ একটি নেটওয়ার্ক সংযোগ খুলুন - আইপি অ্যাড্রেসটি আপনার এজ ক্যাশ সার্ভিস ইনস্ট্যান্সের আইপি অ্যাড্রেস দিয়ে প্রতিস্থাপন করুন।

১৭. মনিটরিং মিডিয়া সিডিএন

SME টিম একটি মিডিয়া সিডিএন ড্যাশবোর্ড টেমপ্লেট তৈরি করেছে - https://gist.github.com/elithrar/1c511d00f5cd3736fb2a3897867209c1

এটি ইনস্টল করতে, ক্লাউড শেল উইন্ডোতে নিম্নলিখিত কমান্ডগুলি চালান:

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

এটি সেট আপ করতে কয়েক মিনিট সময় লাগতে পারে। গুগল ক্লাউড কনসোলে যান এবং ৩টি বারে ক্লিক করুন > অপারেশনস > মনিটরিং > ড্যাশবোর্ডস। আপনি "মিডিয়া এজ মেট্রিক্স" নামে একটি ড্যাশবোর্ড দেখতে পাবেন। সেটিতে ক্লিক করুন এবং আপনি মেট্রিক্সগুলো দেখতে পাবেন:

d0821d84a88a928d.png

১৮. পরীক্ষাগারের পরিবেশ পরিষ্কার করুন।

ল্যাবটি সম্পন্ন করার জন্য অভিনন্দন। এই অংশে আমরা ল্যাব জুড়ে তৈরি করা সমস্ত রিসোর্স মুছে ফেলব।

FFmpeg সিগন্যালটি বন্ধ করুন:

যে ক্লাউড শেল টার্মিনালে 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 Service Instance-টি মুছে ফেলুন:

আদেশ

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