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

1. ভূমিকা

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

তুমি কি শিখবে

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

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

তুমি কী তৈরি করবে

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

de33cb3e75d52549.png সম্পর্কে

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

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

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

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

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

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

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

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

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

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

55efc1aaa7a4d3ad.png সম্পর্কে

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

অনুসরণ

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

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

লেখার সময়, 408.0.0 হল সর্বশেষ Google Cloud SDK সংস্করণ। এই ল্যাবের সমস্ত কমান্ড Google Cloud SDK এর সর্বশেষ সংস্করণ ব্যবহার করে পরীক্ষা করা হয়েছে। এগিয়ে যাওয়ার আগে, দয়া করে নিশ্চিত করুন যে Cloud Shell SDK এর সর্বশেষ সংস্করণ ব্যবহার করছে।

SDK সংস্করণ পরীক্ষা করা হচ্ছে

আমরা 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. প্রয়োজনীয় পরিষেবা API গুলি সক্ষম করুন

১. পরিবেশগত পরিবর্তনশীল সেটআপ করুন

এই ল্যাব জুড়ে, আমরা কয়েকটি ভেরিয়েবল সহ 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 গুলি সক্ষম করুন

আমাদের নিশ্চিত করতে হবে যে আমাদের প্রকল্পে নিম্নলিখিত API গুলি সক্রিয় আছে।

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

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

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

কমান্ড

gcloud services enable networkservices.googleapis.com

সার্টিফিকেট ম্যানেজার API সক্ষম করুন

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

কমান্ড

gcloud services enable certificatemanager.googleapis.com

লাইভ স্ট্রিম API সক্ষম করুন

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

কমান্ড

gcloud services enable livestream.googleapis.com

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

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

কমান্ড

gcloud services enable edgecache.googleapis.com

API গুলি সক্রিয় আছে কিনা তা যাচাই করুন

সকল সক্রিয় API তালিকাভুক্ত করার জন্য gcloud services list কমান্ডটি চালান। আউটপুটে আমরা 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. বালতিটি সর্বজনীনভাবে অ্যাক্সেসযোগ্য করে তুলুন

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

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

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

কমান্ড

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

২. বালতিটি সর্বজনীনভাবে অ্যাক্সেসযোগ্য করে তুলুন

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

কমান্ড

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

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

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

96b5d26aedeb89a6.png সম্পর্কে

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

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

আমরা ল্যাবে পরে নিম্নলিখিত রিসোর্স তৈরি করব:

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

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

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

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

কমান্ড

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

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

এই ল্যাবটি লেখার সময়, লাইভ স্ট্রিম API-এর জন্য কোনও gcloud সমর্থন নেই। আমরা API কল করার জন্য 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 পেয়েছি তার ID ব্যবহার করুন। এই উদাহরণে এটি "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

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

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

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
}

2. চ্যানেলের স্থিতি পরীক্ষা করুন

চ্যানেলের অবস্থা পেতে নিম্নলিখিত curl কমান্ডটি চালান:

কমান্ড

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

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

"streamingState": "AWAITING_INPUT",

চ্যানেলটি চলমান এবং সংকেত গ্রহণের জন্য প্রস্তুত বলে " AWAITING_INPUT " না দেখা পর্যন্ত কমান্ডটি পুনরায় চালান।

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

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

  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

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

এখন যেহেতু আমাদের একটি এজ ক্যাশে অরিজিন সেট আপ করা হয়েছে, আমরা নিজেই এজ ক্যাশে পরিষেবা তৈরি করতে পারি।

cme-demo.yaml ফাইলটি তৈরি করুন।

এজ ক্যাশে সার্ভিস কনফিগারেশনটি একটি YAML ফাইলের মাধ্যমে করা হয়। ক্লাউড শেলে, 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

আমরা সমস্ত এজ ক্যাশে পরিষেবা কনফিগারেশন ডিফল্ট রেখে দেব। উপরের ফাইলটিতে ব্যবহারকারীরা আপডেট করতে চাইতে পারেন এমন 3টি ফিল্ড মান রয়েছে:

  • name : মিডিয়া সিডিএন ইনস্ট্যান্সের নাম - এখানে: cme-demo
  • hosts: এই মিডিয়া সিডিএন পরিষেবা দ্বারা সমাধান করা ডোমেন নামের তালিকা - এখানে: demo.cme.com । আমরা এই ডেমো চলাকালীন এটি ব্যবহার করব। আমরা মিডিয়া সিডিএন ইনস্ট্যান্সের আইপি ঠিকানা ব্যবহার করব।
  • Origin: এটি হল Edge Cache Origin যা আমরা আগের ধাপে তৈরি করেছি। এটিকে cme-origin - Media CDN Origin এর নাম হিসেবে সেট করুন।

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

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

আমরা হোস্ট demo.cme.com ব্যবহার করে Edge Cache Origin cme-origincme-demo নামে একটি Edge Cache পরিষেবা তৈরি করব। পরিষেবাটি তৈরি করতে ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালান:

কমান্ড

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'

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

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

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

2. ইনপুট/চ্যানেলে লাইভ স্ট্রিম সিগন্যাল শুরু করুন

এখন যেহেতু FFmpeg ইনস্টল করা হয়েছে, আমরা লাইভ স্ট্রিম তৈরি করতে ইনপুট এন্ডপয়েন্টে একটি পরীক্ষামূলক ইনপুট স্ট্রিম পাঠাব।

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

কমান্ড

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

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

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

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

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

b3c7b0be6276c194.png সম্পর্কে

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

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

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

কমান্ড

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

এই মুহুর্তে আমরা নিম্নলিখিত কাজগুলি সম্পন্ন করেছি:

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

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

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

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

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

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

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

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

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

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

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

ভিএলসি প্লেয়ার ব্যবহার করতে, https://www.videolan.org/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

এবং "খুলুন" এ ক্লিক করুন। আপনি ট্রান্সকোড করা লাইভ ভিডিওটি প্লে হতে শুরু করতে দেখবেন। ভিডিওটি নীচের স্ক্রিনশটের মতো দেখাবে। স্ক্রিনে কাউন্টারটি ১ ধাপে চলবে এবং আপনি একটি অবিরাম বিপ শুনতে পাবেন।

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

28fc359b49d44ec2.png সম্পর্কে

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

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

১৭. মিডিয়া সিডিএন পর্যবেক্ষণ

SME টিম একটি মিডিয়া CDN ড্যাশবোর্ড টেমপ্লেট তৈরি করেছে - 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

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

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

এজ ক্যাশে সার্ভিস ইনস্ট্যান্স মুছে ফেলুন:

কমান্ড

gcloud edge-cache services delete cme-demo

অনুরোধ করা হলে "Y" লিখে মুছে ফেলা নিশ্চিত করুন

এজ ক্যাশে অরিজিন মুছুন:

কমান্ড

gcloud edge-cache origins delete cme-origin

অনুরোধ করা হলে "Y" লিখে মুছে ফেলা নিশ্চিত করুন

কাস্টম ড্যাশবোর্ড মুছুন

কমান্ড

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