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

1. ভূমিকা

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

আপনি কি শিখবেন

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

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

আপনি কি নির্মাণ করবেন

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

de33cb3e75d52549.png

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

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

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

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

2. আপনি শুরু করার আগে

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

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

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

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

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

55efc1aaa7a4d3ad.png

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

7ffe5cbb04455448.png

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

4. Google Cloud SDK সংস্করণ

লেখার সময়, 408.0.0 হল সর্বশেষ Google Cloud SDK সংস্করণ। এই ল্যাবের সমস্ত কমান্ড Google ক্লাউড SDK-এর সর্বশেষ সংস্করণ ব্যবহার করে পরীক্ষা করা হয়েছে৷ এগিয়ে যাওয়ার আগে, দয়া করে নিশ্চিত করুন যে ক্লাউড শেল 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

5. পূর্বশর্ত

আমরা GCP সংস্থানগুলি কনফিগার করা শুরু করার আগে, আমাদের নিম্নলিখিতগুলি করতে হবে -

  1. পরিবেশ ভেরিয়েবল সেটআপ করুন
  2. প্রয়োজনীয় পরিষেবা API সক্রিয় করুন

1. এনভায়রনমেন্ট ভেরিয়েবল সেটআপ করুন

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

ভেরিয়েবল সেট করা আছে তা যাচাই করুন

আসুন যাচাই করি যে সমস্ত প্রয়োজনীয় পরিবেশ ভেরিয়েবল সেট করা আছে। আমাদের আউটপুটে মোট 6টি পরিবেশের ভেরিয়েবল দেখতে হবে।

আদেশ

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

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

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

2. প্রয়োজনীয় পরিষেবা API সক্রিয় করুন৷

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

  • নেটওয়ার্ক পরিষেবা API
  • সার্টিফিকেট ম্যানেজার API
  • লাইভস্ট্রিম API
  • মিডিয়া CDN এজ ক্যাশে 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

মিডিয়া CDN এজ ক্যাশে API সক্ষম করুন৷

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

আদেশ

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

6. ক্লাউড স্টোরেজ বালতি তৈরি করুন

এই বিভাগে আমরা নিম্নলিখিত কাজ করব:

  1. একটি ক্লাউড স্টোরেজ বালতি তৈরি করুন
  2. বালতিটি সর্বজনীনভাবে অ্যাক্সেসযোগ্য করুন

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

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

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

আদেশ

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

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

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

আদেশ

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

7. লাইভ স্ট্রিমিং API পরিবেশ সেট আপ করা হচ্ছে

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

96b5d26aedeb89a6.png

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

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

আমরা পরবর্তীতে ল্যাবে নিম্নলিখিত সংস্থানগুলি তৈরি করব:

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

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

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

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

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

10. লাইভ স্ট্রিমিং চ্যানেল শুরু করুন

এখন যেহেতু আমরা আমাদের লাইভ স্ট্রিম চ্যানেল তৈরি করেছি, আসুন চ্যানেলটি শুরু করি। এই বিভাগে, আমরা নিম্নলিখিত কাজ করব:

  1. লাইভ স্ট্রিমিং চ্যানেল শুরু করুন
  2. চ্যানেলের স্থিতি পরীক্ষা করুন, আমাদের নিশ্চিত করতে হবে যে streamingState "AWAITING INPUT"

1. চ্যানেল শুরু করুন

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

11. মিডিয়া CDN কনফিগার করুন

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

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

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

একটি এজ ক্যাশে অরিজিন একটি বিষয়বস্তুর অবস্থান উপস্থাপন করে, যেমন একটি ক্লাউড স্টোরেজ বালতি, একটি তৃতীয় পক্ষের স্টোরেজ অবস্থান, বা একটি লোড ব্যালেন্সার৷ CDN পরিভাষায়, উৎপত্তি (বা অরিজিন সার্ভার) হল সেই অবস্থান যেখানে আমরা যে সামগ্রী বিতরণ করতে চাই তার উৎসটি অবস্থিত - যেমন সমস্ত CSS, Javascripts, 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 : মিডিয়া CDN উদাহরণের নাম - এখানে: cme-demo
  • hosts: ডোমেন নামের তালিকা যা এই মিডিয়া CDN পরিষেবা দ্বারা সমাধান করা হবে - এখানে: demo.cme.com । আমরা এই ডেমো সময় এটি ব্যবহার করব. আমরা মিডিয়া সিডিএন ইনস্ট্যান্সের আইপি ঠিকানা ব্যবহার করব।
  • Origin: এটি হল এজ ক্যাশে অরিজিন যা আমরা আগের ধাপে তৈরি করেছি। এটিকে cme-origin এ সেট করুন - মিডিয়া CDN অরিজিনের নাম।

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

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

আমরা হোস্ট demo.cme.com সহ এজ ক্যাশে অরিজিন cme-origincme-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'

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

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

এই মুহুর্তে এজ ক্যাশে পরিষেবা কনফিগারেশন আপডেট করা একটি ভাল ধারণা যাতে পরবর্তীতে ভিডিওটি স্ট্রিম করতে পরিষেবাটির আইপি ব্যবহার করতে সক্ষম হয়৷ এজ ক্যাশে পরিষেবা YAML ফাইলটি আমাদের সমস্ত হোস্টের নাম/আইপি তালিকাভুক্ত করতে দেয় যেগুলি এজ ক্যাশে পরিষেবা থেকে অনুরোধ গ্রহণ করবে। এই মুহুর্তে আমরা শুধুমাত্র একটি হোস্ট হিসাবে 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" বা হোস্ট হিসাবে IP ঠিকানা সহ অনুরোধগুলি গ্রহণ করবে৷

12. ইনপুট সিগন্যাল তৈরি করুন

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

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

1. 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 পরীক্ষা লাইভ সংকেত পাঠাতে দেখতে হবে. কমান্ড প্রম্পট ফেরত দেবে না। আপনি এটি বন্ধ না করা পর্যন্ত সংকেত তৈরি করা হবে। ল্যাবের বাকি অংশের জন্য আপনাকে একটি নতুন ক্লাউড শেল উইন্ডো খুলতে হবে।

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

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

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

b3c7b0be6276c194.png

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

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

যেহেতু এটি একটি নতুন CloudShell, আমাদের আবার পরিবেশের ভেরিয়েবল সেট করতে হবে। আমরা এনভায়রনমেন্ট ভেরিয়েবল সেট করতে source কমান্ড ব্যবহার করব।

আদেশ

source ~/env_variables.txt

ভেরিয়েবল সেট করা আছে তা যাচাই করুন

আসুন যাচাই করি যে সমস্ত প্রয়োজনীয় পরিবেশ ভেরিয়েবল সেট করা আছে। আমাদের আউটপুটে মোট 6টি পরিবেশের ভেরিয়েবল দেখতে হবে।

আদেশ

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

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

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

14. লাইভ সিগন্যাল ট্রান্সকোড হচ্ছে তা যাচাই করুন

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

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

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

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

15. যাচাই করুন যে এজ ক্যাশে সার্ভিস ইনস্ট্যান্স কাজ করে

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

এজ ক্যাশে অরিজিনে সংরক্ষিত ট্রান্সকোড করা ভিডিও ম্যানিফেস্ট ফাইল অ্যাক্সেস করতে ক্লাউড শেলে নিম্নলিখিত curl কমান্ডটি চালান:

আদেশ

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

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

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

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

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

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

আমরা এখন এমন এক পর্যায়ে আছি যেখানে আমরা মিডিয়া CDN ক্যাশের মাধ্যমে ট্রান্সকোড করা লাইভ সিগন্যাল স্ট্রিম করতে একটি ভিডিও প্লেয়ার ব্যবহার করতে পারি। এটি করার জন্য আমরা ভিএলসি প্লেয়ার ব্যবহার করব। ভিএলসি প্লেয়ার হল একটি ফ্রি এবং ওপেন সোর্স ক্রস-প্ল্যাটফর্ম মাল্টিমিডিয়া প্লেয়ার এবং ফ্রেমওয়ার্ক যা বেশিরভাগ মাল্টিমিডিয়া ফাইল চালায়। এটি অভিযোজিত মিডিয়া ফর্ম্যাটগুলি (যেমন 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 । আপনি যে ক্লাউড মিডিয়া পরিষেবাটি স্থাপন করেছেন তার IP দিয়ে প্রতিস্থাপন করুন৷
  • ম্যানিফেস্ট ভিডিও ফাইলের পথ: " / "। ট্রান্সকোড করা লাইভ সিগন্যাল ফাইলগুলি সঞ্চয় করার জন্য আমরা live-streaming-storage-$LOGNAME বাকেট-এ এই পথটি ব্যবহার করেছি। পথটি এখানে মূল পথ: "/"।
  • ম্যানিফেস্ট ভিডিও ফাইলের নাম: HLS ম্যানিফেস্ট ফাইল, main.m3u8

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

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

28fc359b49d44ec2.png

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

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

17. মিডিয়া CDN মনিটরিং

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

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

d0821d84a88a928d.png

18. ল্যাব পরিবেশ পরিষ্কার করুন

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

FFmpeg সংকেত বন্ধ করুন:

ক্লাউড শেল টার্মিনালে <CTRL+C> টিপুন যেখানে FFmpeg চলছে।

লাইভ স্ট্রিমিং চ্যানেল বন্ধ করুন:

আদেশ

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