Media CDN और Live Streaming API की मदद से, Google Cloud पर लाइव स्ट्रीमिंग

1. परिचय

कॉन्टेंट डिलीवरी नेटवर्क (सीडीएन), उपयोगकर्ताओं की परफ़ॉर्मेंस को बेहतर बनाते हैं. इसके लिए, वे अक्सर ऐक्सेस किए जाने वाले कॉन्टेंट को असली उपयोगकर्ताओं के पास मौजूद कैश मेमोरी में सेव करते हैं. साथ ही, क्लाइंट के पास मौजूद कनेक्शन को बंद करते हैं, ऑरिजिन से कनेक्शन को फिर से इस्तेमाल करते हैं, और आधुनिक नेटवर्किंग प्रोटोकॉल और कस्टम सेटिंग का इस्तेमाल करते हैं. उपयोगकर्ताओं (और हमारे ग्राहकों) के लिए, इसका मतलब है कि उन्हें कम इंतज़ार करना पड़ेगा, वे ज़्यादा भरोसेमंद तरीके से काम कर पाएंगे, और उन्हें कम खर्च करना पड़ेगा. इससे बिक्री बढ़ेगी, वेब अनुभव बेहतर होगा, और उपयोगकर्ता अनुभव में कुल मिलाकर बढ़ोतरी होगी. आजकल, बहुत कम आधुनिक साइटें और वीडियो स्ट्रीमिंग प्लैटफ़ॉर्म, सीडीएन के बिना काम करते हैं.

आपको क्या सीखने को मिलेगा

इस लैब में, हम लाइव स्ट्रीमिंग वर्कफ़्लो एनवायरमेंट को डिप्लॉय करने के चरणों के बारे में जानेंगे. इसमें Media CDN (सीडीएन) + Cloud Media Live Streaming API (लाइव वीडियो ट्रांसकोडिंग) + Cloud Storage (वीडियो के लिए स्टोरेज) + Video Player (VLC, Google Shaka Player वगैरह - HLS + MPEG-DASH रेडी प्लेयर) शामिल हैं.

हम लाइव स्ट्रीमिंग एपीआई के कॉम्पोनेंट - इनपुट, चैनल - सेट अप करेंगे. इसके बाद, FFmpeg की मदद से इनपुट/चैनल पर लाइव फ़ीड शुरू करेंगे. FFmpeg, लाइव टेस्ट सिग्नल जनरेट कर सकता है. लाइव स्ट्रीमिंग एपीआई, लाइव फ़ीड को ट्रांसकोड करेगा. ट्रांसकोड किए गए वीडियो मेनिफ़ेस्ट और सेगमेंट, Cloud Storage बकेट में सेव किए जाएंगे. इसके बाद, हम Media CDN को सेट अप करेंगे. इसमें लाइव वीडियो के Cloud Storage बकेट को ओरिजन के तौर पर इस्तेमाल किया जाएगा. आखिर में, VLC Player का इस्तेमाल Media CDN के ज़रिए कैश किए गए लाइव कॉन्टेंट को चलाने के लिए किया जाएगा. हम Media CDN की गतिविधि को विज़ुअलाइज़ करने के लिए, Cloud Monitoring डैशबोर्ड भी सेट अप करेंगे.

आपको क्या बनाने को मिलेगा

इस लैब में, हम इस आर्किटेक्चर के आधार पर एनवायरमेंट सेट अप करेंगे:

de33cb3e75d52549.png

हम लैब के हिस्से के तौर पर, इन कॉम्पोनेंट को सेटअप करेंगे और ये टास्क पूरे करेंगे:

  • लाइव ट्रांसकोड किए गए वीडियो सेव करने के लिए, Google Cloud Storage (GCS) बकेट बनाएं
  • वीडियो को कई फ़ॉर्मैट में ट्रांसकोड करने के लिए, Live Streaming API को कॉन्फ़िगर करें: HLS + MPEG DASH, SD, और HD
  • लाइव स्ट्रीमिंग के कॉम्पोनेंट सेट अप करना: इनपुट/चैनल
  • लाइव स्ट्रीम चैनल शुरू करना
  • GCS बकेट को ओरिजन के तौर पर इस्तेमाल करके, Media CDN सेट अप करना
  • लाइव चैनल में फ़ीड करने के लिए FFmpeg सेट अप करना
  • वीडियो प्लेयर की मदद से, ट्रांसकोड किए गए लाइव फ़ीड को स्ट्रीम करना
  • Media CDN की गतिविधि (लेटेंसी, कैश हिट, कैश मिस वगैरह) को मॉनिटर करने के लिए, Cloud Monitoring डैशबोर्ड सेट अप करें

ध्यान दें: इस लैब के लिए, हम यह मानकर चल रहे हैं कि उपयोगकर्ताओं के पास Google Cloud Console का ऐक्सेस है और उन्होंने पहले से ही कोई प्रोजेक्ट सेट अप किया हुआ है. हम यह भी मानकर चलते हैं कि उपयोगकर्ता एक नए एनवायरमेंट से शुरुआत करते हैं और उन्होंने इस डेमो के लिए कुछ भी सेटअप नहीं किया है.

कॉन्फ़िगरेशन से जुड़ी सभी कार्रवाइयां, Cloud Shell में कमांड लाइन के ज़रिए की जाएंगी. हम कंसोल में कमांड लाइन के ज़रिए कॉन्फ़िगर किए गए कॉम्पोनेंट की जांच कभी भी कर सकते हैं. हमें पूरे लैब में ऐसे पॉइंटर दिखेंगे जो Google Cloud Console की ओर इशारा करेंगे.

2. शुरू करने से पहले

Media CDN को ऐक्सेस करने पर पाबंदी लगी है. Media CDN का ऐक्सेस पाने के लिए, अपनी खाता टीम से संपर्क करें. वे आपकी ओर से ऐक्सेस का अनुरोध कर सकते हैं. अगर आप Google के कर्मचारी हैं और आपको Media CDN की मदद से लाइव स्ट्रीमिंग की सुविधा आज़मानी है, तो Media CDN के पीएम से संपर्क करें. इससे आपको Media CDN को ऐक्सेस करने का अनुरोध करने में मदद मिलेगी.

3. सेटअप और ज़रूरी शर्तें

Cloud Shell शुरू करें

Google Cloud को अपने लैपटॉप से रिमोटली ऐक्सेस किया जा सकता है. हालांकि, इस कोडलैब में Google Cloud Shell का इस्तेमाल किया जाएगा. यह क्लाउड में चलने वाला कमांड लाइन एनवायरमेंट है.

Google Cloud Console में, सबसे ऊपर दाएं कोने में मौजूद टूलबार पर, Cloud Shell आइकॉन पर क्लिक करें:

55efc1aaa7a4d3ad.png

इसे चालू करने और एनवायरमेंट से कनेक्ट करने में सिर्फ़ कुछ सेकंड लगेंगे. यह प्रोसेस पूरी होने के बाद, आपको कुछ ऐसा दिखेगा:

7ffe5cbb04455448.png

इस वर्चुअल मशीन में, डेवलपमेंट के लिए ज़रूरी सभी टूल पहले से मौजूद हैं. यह 5 जीबी की होम डायरेक्ट्री उपलब्ध कराता है. साथ ही, यह Google Cloud पर काम करता है. इससे नेटवर्क की परफ़ॉर्मेंस और पुष्टि करने की प्रोसेस बेहतर होती है. इस कोडलैब में मौजूद सभी टास्क, ब्राउज़र में किए जा सकते हैं. आपको कुछ भी इंस्टॉल करने की ज़रूरत नहीं है.

4. Google Cloud SDK का वर्शन

यह लेख लिखते समय, 408.0.0, Google Cloud SDK का सबसे नया वर्शन है. इस लैब में मौजूद सभी कमांड को Google Cloud SDK के नए वर्शन का इस्तेमाल करके टेस्ट किया गया है. आगे बढ़ने से पहले, कृपया पक्का करें कि Cloud Shell में एसडीके का नया वर्शन इस्तेमाल किया जा रहा हो.

एसडीके टूल का वर्शन देखना

हम एसडीके के वर्शन की जांच करने के लिए, gcloud version कमांड का इस्तेमाल करेंगे.

Command

gcloud version | grep "Google Cloud SDK"

आउटपुट का उदाहरण

Google Cloud SDK 408.0.0

अगले चरण

  1. अगर एसडीके टूल का वर्शन 408.0.0 या इसके बाद का है, तो अगले सेक्शन पर जाएं.
  2. अगर एसडीके का वर्शन 408.0.0 से कम है, तो एसडीके को अपडेट करने के लिए यहां दी गई कमांड चलाएं.
sudo apt-get update && sudo apt-get install google-cloud-sdk

5. ज़रूरी शर्तें

GCP संसाधनों को कॉन्फ़िगर करने से पहले, हमें ये काम करने होंगे -

  1. एनवायरमेंट वैरिएबल सेट अप करना
  2. ज़रूरी सेवा वाले एपीआई चालू करें

1. एनवायरमेंट वैरिएबल सेट अप करना

इस लैब में, हम कुछ वैरिएबल के साथ gcloud और curl कमांड चलाएंगे. हमें इन एनवायरमेंट वैरिएबल को कॉन्फ़िगर करना होगा.

  • प्रोजेक्ट आईडी
  • प्रोजेक्ट नंबर
  • उपयोगकर्ता नाम
  • क्षेत्र
  • इनपुट आईडी
  • चैनल आईडी

प्रोजेक्ट आईडी और उपयोगकर्ता का नाम

ये एनवायरमेंट वैरिएबल, आम तौर पर Cloud Shell में पहले से कॉन्फ़िगर किए जाते हैं. हम पुष्टि करने के लिए, env कमांड का इस्तेमाल करेंगे.

Command

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 कमांड का इस्तेमाल करेंगे

Command

source ~/env_variables.txt

पुष्टि करें कि वैरिएबल सेट किए गए हैं

आइए, पुष्टि करें कि सभी ज़रूरी एनवायरमेंट वैरिएबल सेट किए गए हैं. हमें आउटपुट में कुल छह एनवायरमेंट वैरिएबल दिखने चाहिए.

Command

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

आउटपुट का उदाहरण

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

2. ज़रूरी सेवा वाले एपीआई चालू करना

हमें यह पक्का करना होगा कि हमारे प्रोजेक्ट में ये एपीआई चालू हों.

  • नेटवर्क सेवाओं का एपीआई
  • Certificate Manager API
  • Livestream API
  • Media CDN Edge Cache API

Network Services API चालू करना

Network Services API को चालू करने के लिए, यह कमांड चलाएं:

Command

gcloud services enable networkservices.googleapis.com

Certificate Manager API को चालू करना

Certificate Manager API को चालू करने के लिए, यह कमांड चलाएं:

Command

gcloud services enable certificatemanager.googleapis.com

Live Stream API को चालू करना

Live Stream API को चालू करने के लिए, यह कमांड चलाएं:

Command

gcloud services enable livestream.googleapis.com

Media CDN Edge Cache API को चालू करना

Media CDN Edge Cache API को चालू करने के लिए, यह कमांड चलाएं:

Command

gcloud services enable edgecache.googleapis.com

पुष्टि करें कि एपीआई चालू हैं

चालू किए गए सभी एपीआई की सूची देखने के लिए, gcloud services list निर्देश चलाएं. हमें आउटपुट में चार एपीआई दिखने चाहिए.

Command

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

आउटपुट का उदाहरण

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

6. Cloud Storage बकेट बनाना

इस सेक्शन में हम ये काम करेंगे:

  1. Cloud Storage बकेट बनाना
  2. बकेट को सार्वजनिक तौर पर ऐक्सेस करने लायक बनाएं

बाद में लैब में, हम इस बकेट का इस्तेमाल ट्रांसकोड की गई वीडियो फ़ाइलों को सेव करने के लिए करेंगे. यह बकेट, Media CDN सेवा के लिए ओरिजन स्टोरेज के तौर पर भी काम करेगी.

1. बकेट बनाना

बकेट बनाने के लिए, हम gsutil mb कमांड का इस्तेमाल करेंगे:

Command

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

2. बकेट को सार्वजनिक तौर पर ऐक्सेस करने लायक बनाना

हम फ़ाइलों को सार्वजनिक तौर पर उपलब्ध कराने के लिए, gsutil iam कमांड का इस्तेमाल करेंगे:

Command

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

7. Live Streaming API एनवायरमेंट सेट अप करना

लाइव स्ट्रीमिंग एपीआई चेन के कॉम्पोनेंट इस तरह से बनाए गए हैं:

96b5d26aedeb89a6.png

हमने पिछले सेक्शन में Cloud Storage बकेट live-streaming-storage-$LOGNAME बनाया था. अगले दो सेक्शन में, हम ये संसाधन बनाएंगे:

  • लाइव स्ट्रीमिंग का इनपुट: इनपुट एंडपॉइंट एक ऐसा एंडपॉइंट होता है जिस पर आपका एन्कोडर, इनपुट स्ट्रीम भेजता है. इनपुट एंडपॉइंट का इस्तेमाल करके, अपनी स्ट्रीम के लिए कॉन्फ़िगरेशन तय किए जा सकते हैं. जैसे, इनपुट रिज़ॉल्यूशन, इनपुट टाइप, और वीडियो काटना.
  • लाइव स्ट्रीमिंग चैनल: चैनल एक ऐसा संसाधन होता है जो इनपुट एंडपॉइंट के ज़रिए इनपुट स्ट्रीम को प्रोसेस करता है. साथ ही, इनपुट स्ट्रीम को कई रेंडिशन में ट्रांसकोड करता है. इसके बाद, तय की गई जगह पर आउटपुट लाइव स्ट्रीम को कुछ फ़ॉर्मैट में पब्लिश करता है. एक ही चैनल में प्राइमरी और बैकअप इनपुट स्ट्रीम शामिल की जा सकती है.

हम लैब में बाद में ये संसाधन बनाएंगे:

  • एन्कोडर: एन्कोडर एक ऐसा प्रोग्राम होता है जिसका इस्तेमाल इनपुट स्ट्रीम भेजने के लिए किया जाता है. इस लैब में, हम FFmpeg का इस्तेमाल करेंगे.

8. इनपुट एंडपॉइंट बनाना और उसे कॉन्फ़िगर करना

input.json फ़ाइल बनाना

हम लाइव स्ट्रीम के सिग्नल टाइप के बारे में बताने के लिए, input.json फ़ाइल बनाएंगे. इस लैब में, हम आरटीएमपी लाइव सिग्नल का इस्तेमाल कर रहे हैं.

Command

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

इनपुट एंडपॉइंट बनाना

इस लैब को लिखते समय, Live Stream API के लिए gcloud का इस्तेमाल नहीं किया जा सकता. एपीआई कॉल करने के लिए, हम curl कमांड का इस्तेमाल करेंगे.

Command

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

आउटपुट का उदाहरण

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

जवाब में कई काम की जानकारी दी गई है. हालांकि, फ़िलहाल हमें दो फ़ील्ड पर फ़ोकस करना है:

  • ऑपरेशन आईडी: आउटपुट से, ऑपरेशन आईडी को कॉपी करें और उसे नोट करें. यहां आउटपुट के उदाहरण से लिया गया ऑपरेशन आईडी दिया गया है. यह "name" से शुरू होने वाली आउटपुट लाइन में मौजूद होता है. "operation-1661405972853-5e70a38d6f27f-79100d00-310671b4"
  • स्थिति: हमें स्थिति के "done": false से "done": true में बदलने का इंतज़ार करना होगा

स्थिति देखना

आगे बढ़ने से पहले, हमें यह जांच करनी होगी कि इनपुट एंडपॉइंट सही तरीके से बन गया है और इस्तेमाल के लिए तैयार है.

यहां दिए गए कमांड में, <OPERATION> की जगह उस ऑपरेशन का आईडी डालें जो हमें अभी मिला है. इस उदाहरण में, यह "operation-1661405972853-5e70a38d6f27f-79100d00-310671b4" है.

Command

export OPERATION_ID_1=<OPERATION>

Command

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

आउटपुट का उदाहरण

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

जब तक आपको "done:true" न दिखे, तब तक कमांड को फिर से चलाएं. इससे पता चलता है कि इनपुट एंडपॉइंट बन गया है और इस्तेमाल के लिए तैयार है.

यूआरआई सेव करें

हम लैब में, पिछले आउटपुट से मिले URI का इस्तेमाल बाद में करेंगे. फ़िलहाल, URI के लिए एक एनवायरमेंट वैरिएबल सेट करते हैं.

Command

export URI=<uri>

<uri> की जगह, अभी-अभी नोट किया गया यूआरआई डालें. इसके अलावा, यूआरआई को वापस पाने के लिए GET तरीके का इस्तेमाल भी किया जा सकता है

Command

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

9. लाइव स्ट्रीमिंग चैनल बनाना और उसे कॉन्फ़िगर करना

आइए, लाइव स्ट्रीमिंग चैनल बनाएं. इसे उस इनपुट एंडपॉइंट से जोड़ें जिसे हमने अभी पिछले सेक्शन में बनाया था. यहां दिए गए उदाहरण में, एक ऐसा चैनल बनाया गया है जो एचएलएस लाइव स्ट्रीम जनरेट करता है. इसमें एक ही हाई-डेफ़िनिशन (1280x720) रेंडिशन होता है. चैनल को इनपुट एंडपॉइंट और उस स्टोरेज बकेट से जोड़ा जाएगा जिसे हमने पहले बनाया था.

channel.json फ़ाइल बनाना

Cloud Shell टर्मिनल में, "channel.json" फ़ाइल बनाने के लिए यह कमांड टाइप करें:

Command

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

चैनल बनाना

चैनल बनाने के लिए, यह curl कमांड चलाएं:

Command

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

आउटपुट का उदाहरण

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

ऑपरेशन आईडी को नोट करें और उसे कॉपी करें. हमें इसकी ज़रूरत आने वाले चरणों में पड़ेगी. यह "name" से शुरू होने वाली आउटपुट लाइन में मौजूद होता है.

स्थिति देखना

आगे बढ़ने से पहले, हमें यह जांच करनी होगी कि चैनल बन गया है और इस्तेमाल के लिए तैयार है.

यहां दिए गए कमांड में, <OPERATION> की जगह उस ऑपरेशन का आईडी डालें जो हमें अभी मिला है. इस उदाहरण में यह operation-1661405972853-5e70a38d6f27f-79100d00-310671b4 है

Command

export OPERATION_ID_2=<OPERATION>

Command

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

आउटपुट का उदाहरण

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

जब तक आपको "done:true" न दिखे, तब तक कमांड को फिर से चलाएं. इससे पता चलता है कि इनपुट एंडपॉइंट बन गया है और इस्तेमाल के लिए तैयार है.

ध्यान दें कि फ़िलहाल "streamingState" "STOPPED" है. हम अगले सेक्शन में चैनल शुरू करेंगे.

10. लाइव स्ट्रीमिंग चैनल शुरू करना

हमने लाइव स्ट्रीम चैनल बना लिया है. अब इसे शुरू करते हैं. इस सेक्शन में, हम ये काम करेंगे:

  1. लाइव स्ट्रीमिंग चैनल शुरू करना
  2. चैनल का स्टेटस देखें. हमें यह पक्का करना है कि streamingState "AWAITING INPUT" हो

1. चैनल शुरू करना

चैनल शुरू करने के लिए, Cloud Shell में यह curl कमांड चलाएं:

Command

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

आउटपुट का उदाहरण

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

2. चैनल का स्टेटस देखना

चैनल की स्थिति जानने के लिए, यह curl कमांड चलाएं:

Command

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

आउटपुट का उदाहरण

"streamingState": "AWAITING_INPUT",

जब तक आपको "AWAITING_INPUT" न दिखे, तब तक कमांड को फिर से चलाएं. इससे पता चलता है कि चैनल चल रहा है और सिग्नल पाने के लिए तैयार है.

11. Media CDN को कॉन्फ़िगर करना

इस सेक्शन में, हम सीडीएन इंफ़्रास्ट्रक्चर, Media CDN को डिप्लॉय करेंगे. हम ये संसाधन बनाएंगे:

  1. Edge Cache Origin
  2. Edge Cache Service

1. Edge Cache Origin बनाना

Edge Cache Origin, कॉन्टेंट की लोकेशन को दिखाता है. जैसे, Cloud Storage बकेट, तीसरे पक्ष की स्टोरेज लोकेशन या लोड बैलेंसर. सीडीएन की भाषा में, ओरिजिन (या ओरिजिन सर्वर) वह जगह होती है जहां हमें डिस्ट्रिब्यूट करना है.जैसे, सभी सीएसएस, JavaScript, एचटीएमएल, इमेज वगैरह. इस लैब के लिए, हम एक ऐसा ओरिजिन बनाएंगे जो Cloud Storage बकेट से मैप होता है. इस बकेट को हमने लैब की शुरुआत में बनाया था. हम Edge Cache Origin cme-origin को कॉल करेंगे. सीडीएन का ओरिजन वह जगह होती है जहां सोर्स कॉन्टेंट को एज कैश सर्वर पर डिस्ट्रिब्यूट करने से पहले सेव किया जाता है.

हम ऑरिजिन बनाने के लिए, gcloud edge-cache origins create कमांड का इस्तेमाल करेंगे. इस कमांड को पूरा होने में कुछ मिनट लगेंगे.

Command

gcloud edge-cache origins create cme-origin \
--origin-address="gs://live-streaming-storage-$LOGNAME"

आउटपुट का उदाहरण

Create request issued for: cme-origin
Waiting for operation [projects/my-project/locations/global/operations/operation-1612121774168-5ba3759af1919-
3fdcd7b1-99f59223] to complete...done
Created origin cme-origin

2. Edge Cache Service बनाना

अब जब हमने 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

हम Edge Cache Service के सभी कॉन्फ़िगरेशन डिफ़ॉल्ट पर छोड़ देंगे. ऊपर दी गई फ़ाइल में, तीन फ़ील्ड वैल्यू हैं जिन्हें उपयोगकर्ता अपडेट करना चाहें:

  • name: Media CDN इंस्टेंस का नाम - यहां: cme-demo
  • hosts: उन डोमेन नामों की सूची जिन्हें यह Media CDN सेवा रिज़ॉल्व करेगी - यहां: demo.cme.com. हम इस डेमो के दौरान इसका इस्तेमाल करेंगे. हम Media CDN इंस्टेंस के आईपी पते का इस्तेमाल करेंगे.
  • Origin: यह Edge Cache Origin है, जिसे हमने अभी पिछले चरण में बनाया है. इसे cme-origin पर सेट करें - Media CDN के ऑरिजिन का नाम.

YAML फ़ाइल में इस्तेमाल किए जा सकने वाले अलग-अलग वैरिएबल के बारे में ज़्यादा जानने के लिए, Edge Cache Service कॉन्फ़िगरेशन गाइड देखें.

Edge Cache Service बनाना

हम demo.cme.com होस्ट के साथ, Edge Cache Origin cme-origin पर cme-demo नाम की Edge Cache Service बनाएंगे. सेवा खाता बनाने के लिए, Cloud Shell में यह कमांड चलाएं:

Command

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

Edge Cache Service बनाने में कुछ मिनट लग सकते हैं.

आउटपुट का उदाहरण

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

Edge Cache Service इंस्टेंस का ipv4Addresses नोट करें और कॉपी करें. यह 34.104.36.157 है. हम इसका इस्तेमाल cme-demo.yaml फ़ाइल को अपडेट करने के लिए करेंगे. इसके बाद, ट्रांसकोड किए गए वीडियो को स्ट्रीम करने के लिए इसका इस्तेमाल किया जाएगा.

Edge Cache Service को अपडेट करना

इस समय, Edge Cache Service के कॉन्फ़िगरेशन को अपडेट करना एक अच्छा विकल्प है. इससे, बाद में वीडियो स्ट्रीम करने के लिए, सेवा के आईपी का इस्तेमाल किया जा सकेगा. Edge Cache Service की YAML फ़ाइल की मदद से, हम उन सभी होस्ट के नाम/आईपी पतों की सूची बना सकते हैं जिनसे Edge Cache Service अनुरोध स्वीकार करेगी. इस समय, हमने सिर्फ़ 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 फ़ाइल को फिर से इंपोर्ट करना होगा. Cloud Shell टर्मिनल में यह कमांड चलाएं:

Command

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

कमांड का आउटपुट देखें और पुष्टि करें कि आईपी, होस्ट की सूची में दिखता है.

इस समय, Edge Cache Service का इंस्टेंस, "demo.cme.com" या आईपी पते को होस्ट के तौर पर इस्तेमाल करके किए गए अनुरोधों को स्वीकार करेगा.

12. इनपुट सिग्नल जनरेट करना

अब हमने सभी ज़रूरी सेवाएं कॉन्फ़िगर कर ली हैं. इसलिए, चलिए लाइव स्ट्रीम का इनपुट सिग्नल जनरेट करते हैं. इस सेक्शन में, हम ये काम करेंगे:

  1. FFmpeg इंस्टॉल करें. यह मुफ़्त में उपलब्ध ओपन-सोर्स सॉफ़्टवेयर है
  2. इनपुट/चैनल पर टेस्ट के तौर पर लाइव सिग्नल भेजना

1. FFmpeg इंस्टॉल करना

FFmpeg, मुफ़्त में उपलब्ध एक ओपन-सोर्स सॉफ़्टवेयर प्रोजेक्ट है. इसमें वीडियो, ऑडियो, और अन्य मल्टीमीडिया फ़ाइलों और स्ट्रीम को मैनेज करने के लिए, लाइब्रेरी और प्रोग्राम का एक सुइट होता है. FFmpeg इंस्टॉल करने के लिए, Cloud Shell टर्मिनल में यह कमांड इस्तेमाल करें:

Command

sudo apt install ffmpeg -y

इंस्टॉल हो जाने के बाद, आइए हम यह पुष्टि करें कि FFmpeg सही तरीके से इंस्टॉल हुआ है या नहीं. इसके लिए, इसका वर्शन देखें:

Command

ffmpeg -version

आउटपुट का उदाहरण

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

FFmpeg को सही तरीके से इंस्टॉल किया गया हो.

2. इनपुट/चैनल पर लाइव स्ट्रीम सिग्नल शुरू करें

FFmpeg इंस्टॉल हो जाने के बाद, हम लाइव स्ट्रीम जनरेट करने के लिए, इनपुट एंडपॉइंट पर एक टेस्ट इनपुट स्ट्रीम भेजेंगे.

Cloud Shell टर्मिनल में, यह निर्देश चलाएं. इसके लिए, "इनपुट एंडपॉइंट बनाएं और कॉन्फ़िगर करें" सेक्शन में बनाए गए यूआरआई एनवायरमेंट वैरिएबल का इस्तेमाल करें.

Command

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

आपको FFmpeg में, टेस्ट लाइव सिग्नल भेजने का विकल्प दिखेगा. इस कमांड से प्रॉम्प्ट वापस नहीं आएगा. जब तक सिग्नल को रोका नहीं जाता, तब तक वह जनरेट होता रहेगा. लैब के बाकी हिस्से के लिए, आपको एक नई Cloud Shell विंडो खोलनी होगी.

13. नया Cloud Shell खोलें

इस समय, आपको एक नई Cloud Shell विंडो खोलनी होगी, ताकि लैब को जारी रखा जा सके. ऐसा इसलिए, क्योंकि FFmpeg तब तक चलता रहेगा, जब तक आप इसे रोकने के लिए <CTRL+C> कमांड नहीं देते. इससे लाइव सिग्नल जनरेट होना बंद हो जाएगा.

मौजूदा Cloud Shell टर्मिनल के नाम के बगल में मौजूद, "+" साइन पर क्लिक करें. इससे Cloud Shell की एक और विंडो खुलेगी.

b3c7b0be6276c194.png

लैब के बाकी चरणों को, Cloud Shell की नई विंडो में पूरा करें.

एनवायरमेंट वैरिएबल सेट अप करना

यह एक नया CloudShell है. इसलिए, हमें एनवायरमेंट वैरिएबल को फिर से सेट करना होगा. हम एनवायरमेंट वैरिएबल सेट करने के लिए, source कमांड का इस्तेमाल करेंगे.

Command

source ~/env_variables.txt

पुष्टि करें कि वैरिएबल सेट किए गए हैं

आइए, पुष्टि करें कि सभी ज़रूरी एनवायरमेंट वैरिएबल सेट किए गए हैं. हमें आउटपुट में कुल छह एनवायरमेंट वैरिएबल दिखने चाहिए.

Command

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

आउटपुट का उदाहरण

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

14. पुष्टि करें कि लाइव सिग्नल को ट्रांसकोड किया जा रहा है

हम चैनल के बारे में जानकारी देने के लिए, curl चलाएंगे. हमें आउटपुट में यह दिखना चाहिए कि streamingState, "AWAITING_INPUT" से बदलकर "STREAMING" हो गया है

Command

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

आउटपुट JSON फ़ाइल के जवाब में, आपको "streamingState": "STREAMING" दिखेगा. इसका मतलब है कि चैनल पर स्ट्रीमिंग हो रही है और लाइव सिग्नल को ट्रांसकोड किया जा रहा है.

आइए, उस बकेट के कॉन्टेंट की भी पुष्टि करें जिसमें हमें मेनिफ़ेस्ट फ़ाइल और कई टीएस वीडियो सेगमेंट दिखने चाहिए. लैब की शुरुआत में हमने जो बकेट बनाई थी उसका कॉन्टेंट देखने के लिए, Cloud Shell में यह कमांड चलाएं. इस बकेट का इस्तेमाल Live Streaming API करता है, ताकि ट्रांसकोड किए गए लाइव सिग्नल मेनिफ़ेस्ट और टीएस वीडियो सेगमेंट को आउटपुट किया जा सके:

Command

gcloud storage ls --recursive gs://live-streaming-storage-$LOGNAME/**

आउटपुट का उदाहरण

gs://live-streaming-storage-$LOGNAME/
gs://live-streaming-storage-$LOGNAME/main.m3u8
gs://live-streaming-storage-$LOGNAME/mux_video_ts/index-1.m3u8
gs://live-streaming-storage-$LOGNAME/mux_video_ts/segment-0000000016.ts
gs://live-streaming-storage-$LOGNAME/mux_video_ts/segment-0000000017.ts
gs://live-streaming-storage-$LOGNAME/mux_video_ts/segment-0000000018.ts
gs://live-streaming-storage-$LOGNAME/mux_video_ts/segment-0000000019.ts
gs://live-streaming-storage-$LOGNAME/mux_video_ts/segment-0000000020.ts
gs://live-streaming-storage-$LOGNAME/mux_video_ts/segment-0000000021.ts
gs://live-streaming-storage-$LOGNAME/mux_video_ts/segment-0000000022.ts
...

आपको यह दिखना चाहिए:

  • एचएलएस मेनिफ़ेस्ट फ़ाइल: main.m3u8
  • इससे जुड़े टीएस वीडियो सेगमेंट: नंबर वाली फ़ाइलों की सीरीज़ segment-000000000X.ts

इस समय, हमने ये काम पूरे कर लिए हैं:

  • Live Streaming API: लाइव सिग्नल जनरेट किया जाता है और Live Streaming API के ज़रिए बकेट में ट्रांसकोड किया जाता है
  • Media CDN: Media CDN को लाइव स्ट्रीमिंग के स्टोरेज बकेट के साथ कॉन्फ़िगर किया गया है. इसे Media CDN का ओरिजिन माना जाता है.

अगले सेक्शन में, हम Edge Cache Service की पुष्टि करेंगे. इसके बाद, हम Media CDN के एनीकास्ट आईपी पते का इस्तेमाल करके, ट्रांसकोड किए गए वीडियो को स्ट्रीम करेंगे.

15. पुष्टि करें कि Edge Cache Service का इंस्टेंस काम कर रहा है

इस सेक्शन में, हम पुष्टि करेंगे कि Edge Cache Service का इंस्टेंस उम्मीद के मुताबिक काम कर रहा है. इसके लिए, हम Edge Cache Service की सेवा के आईपी पते का इस्तेमाल करके, Edge Cache Service के इंस्टेंस से किसी फ़ाइल को ऐक्सेस करने की कोशिश करेंगे. जब किसी ऑब्जेक्ट को पहली बार ऐक्सेस किया जाता है, तब उसे कैश नहीं किया जाता. हमें कैश मेमोरी MISS को देखना चाहिए. पहले अनुरोध के लिए, ऑब्जेक्ट को ऑरिजिन से पढ़ा जाता है और एज पर कैश किया जाता है. इसके बाद, उसी फ़ाइल को ऐक्सेस करने की सभी कोशिशों के लिए, कैश मेमोरी HIT दिखेगी. ऐसा इसलिए, क्योंकि ऑब्जेक्ट अब एज पर कैश किया गया है. आइए, इस व्यवहार की पुष्टि करते हैं:

Edge Cache Origin में सेव की गई ट्रांसकोड किए गए वीडियो की मेनिफ़ेस्ट फ़ाइल को ऐक्सेस करने के लिए, Cloud Shell में यह curl कमांड चलाएं:

Command

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

ध्यान दें कि हम Edge Cache Service इंस्टेंस के नाम का पता लगाने के लिए, उसके आईपी पते का इस्तेमाल करते हैं. पक्का करें कि आपने demo.cme.com:<IP> का इस्तेमाल किया हो. यहां आईपी, Edge Cache Service के उस इंस्टेंस का आईपी है जिसे हमने अभी बनाया है.

आउटपुट में x-cache-status हेडर ढूंढें.

आउटपुट का उदाहरण

Added demo.cme.com:80:34.104.35.152 to DNS cache
* Hostname demo.cme.com was found in DNS cache
*   Trying 34.104.35.152:80...
* Connected to demo.cme.com (34.104.35.152) port 80 (#0)
> GET /main.m3u8 HTTP/1.1
> Host: demo.cme.com
> User-Agent: curl/7.74.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< x-guploader-uploadid: ADPycdtKtflWt4Kha5YxXNNRwO-Eu6fGSPs-T-XY4HJmNMo46VJyWlD4EAk-8a6SegxjWq3o1gTPqZbpkU_sjW__HPAdDw
< date: Wed, 07 Dec 2022 18:23:46 GMT
< last-modified: Wed, 07 Dec 2022 18:23:45 GMT
< etag: "6bff620ccca4a9849ba4e17fa7c521fb"
< x-goog-generation: 1670437425805400
< x-goog-metageneration: 1
< x-goog-stored-content-encoding: identity
< x-goog-stored-content-length: 193
< content-type: application/x-mpegURL
< x-goog-hash: crc32c=sPO3zw==
< x-goog-hash: md5=a/9iDMykqYSbpOF/p8Uh+w==
< x-goog-storage-class: STANDARD
< accept-ranges: bytes
< content-length: 193
< server: Google-Edge-Cache
< x-request-id: fd25285b-fc1a-4fd4-981a-c50ead2c85ed
< x-xss-protection: 0
< x-frame-options: SAMEORIGIN
< x-cache-status: den;miss
< cache-control: public,max-age=3600
<
{ [193 bytes data]
* Connection #0 to host demo.cme.com left intact

कैश मेमोरी मिस होने की वजह से, ऑब्जेक्ट को अभी तक कैश नहीं किया गया है. इसलिए, इसे ऑरिजिन से पढ़ा जाता है.

अब हम m3u8 फ़ाइल के लिए कई अनुरोध करेंगे. अगर सब कुछ सही तरीके से कॉन्फ़िगर किया गया है, तो Media CDN को अपनी कैश मेमोरी से कॉन्टेंट दिखाना शुरू कर देना चाहिए. नीचे दिए गए निर्देश से, 10 कर्ल अनुरोध किए जाएंगे और सिर्फ़ x-cache-status हेडर प्रिंट किया जाएगा.

Command

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

आउटपुट में कैश मेमोरी hit और miss का कॉम्बिनेशन होना चाहिए. अगर आपको आउटपुट में कैश हिट दिखते हैं, तो इसका मतलब है कि Media CDN उम्मीद के मुताबिक काम कर रहा है.

आउटपुट का उदाहरण

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

ध्यान दें कि ऑब्जेक्ट को अब एज पर कैश मेमोरी में सेव कर दिया गया है. इसलिए, कैश मेमोरी हिट हो गई है. Cloud Media Edge Service उम्मीद के मुताबिक काम कर रही है.

16. VLC की मदद से, ट्रांसकोड किए गए लाइव सिग्नल वीडियो को स्ट्रीम करना

इस सेक्शन में, हम उन सभी चरणों को एक साथ जोड़ते हैं जिन पर हमने अब तक काम किया है:

  • हमने live-streaming-storage-$LOGNAME नाम का एक बकेट बनाया है. इसमें, Live Streaming API से HLS कॉन्टेंट में ट्रांसकोड किए गए लाइव सिग्नल का नतीजा मिलता है.
  • हम Live Streaming API सेट अप करते हैं.
  • हमने FFmpeg की मदद से, आरटीएमपी लाइव सिग्नल शुरू किया है. यह Live Streaming API के इनपुट/चैनल को फ़ीड करता है.
  • हमने पुष्टि की है कि लाइव सिग्नल, चैनल को भेजा गया था. साथ ही, हमने यह भी पुष्टि की है कि चैनल streaming मोड में था.
  • हमने पुष्टि की है कि ट्रांसकोड की गई फ़ाइलें (मेनिफ़ेस्ट + टीएस सेगमेंट) जनरेट की गई हैं और इन्हें बकेट live-streaming-storage-$LOGNAME में सेव किया गया है.
  • cme-origin नाम का एक Edge Cache Origin सेट अप किया गया था. इसमें GCS बकेट live-streaming-storage-$LOGNAME को ओरिजिन के तौर पर इस्तेमाल किया गया था.
  • cme-demo नाम का एक Edge Cache इंस्टेंस सेट अप किया गया था. इसका ऑरिजिन cme-origin था.
  • हमने Edge Cache Service इंस्टेंस के व्यवहार (कैश मेमोरी में मौजूद नहीं है, कैश मेमोरी में मौजूद है) की पुष्टि की है.

अब हम इस स्थिति में हैं कि मीडिया सीडीएन कैश के ज़रिए, ट्रांसकोड किए गए लाइव सिग्नल को स्ट्रीम करने के लिए, वीडियो प्लेयर का इस्तेमाल किया जा सकता है. इसके लिए, हम VLC प्लेयर का इस्तेमाल करेंगे. VLC प्लेयर, एक मुफ़्त और ओपन सोर्स क्रॉस-प्लैटफ़ॉर्म मल्टीमीडिया प्लेयर और फ़्रेमवर्क है. यह ज़्यादातर मल्टीमीडिया फ़ाइलें चलाता है. यह अडैप्टिव मीडिया फ़ॉर्मैट (जैसे, DASH और HLS) चलाता है. यह अडैप्टिव स्ट्रीमिंग के सिद्धांत का इस्तेमाल करता है. आपके नेटवर्क कनेक्शन की क्वालिटी और उपलब्ध बैंडविड्थ के हिसाब से, प्लेयर वीडियो की क्वालिटी को अडजस्ट करेगा. हमने अभी-अभी ट्रांसकोडिंग का जो काम किया है उसमें डिफ़ॉल्ट प्रीसेट का इस्तेमाल किया गया है. साथ ही, हमने "सिर्फ़" दो क्वालिटी जनरेट की हैं: एसडी और एचडी. जैसे ही हम प्लेयर में वीडियो चलाना शुरू करते हैं, आपको वीडियो एसडी फ़ॉर्मैट में चलता हुआ दिखना चाहिए. अगर आपका नेटवर्क कनेक्शन अच्छा है, तो वीडियो तुरंत एचडी फ़ॉर्मैट में स्विच हो जाएगा.

हम एचएलएस (Apple का वीडियो फ़ॉर्मैट, जो ज़्यादातर डिवाइसों पर काम करता है) को ट्रांसकोड किए गए लाइव सिग्नल को स्ट्रीम करेंगे. इससे जुड़ी फ़ाइल को main.m3u8 कहा जाता है. यह एचएलएस मेनिफ़ेस्ट है. मेनिफ़ेस्ट, टीएस वीडियो सेगमेंट की ओर ले जाता है.

VLC Player का इस्तेमाल करने के लिए, https://www.videolan.org/vlc/ पर जाएं और अपने लैपटॉप के ऑपरेटिंग सिस्टम के लिए प्लेयर का कोई वर्शन डाउनलोड करें. VLC, Windows, MacOSX, Linux, Android, और iOS के लिए उपलब्ध है.

2a2d19abe728d222.png

अपने लैपटॉप पर Player इंस्टॉल करें और उसे लॉन्च करें. हम अगले कुछ चरणों के लिए, प्लेयर के MacOSX वर्शन का इस्तेमाल करेंगे.

वीडियो चलाने के लिए, "फ़ाइल" / "नेटवर्क खोलें" पर जाएं:

f85565301f7c68dc.png

इनका इस्तेमाल करके सेट अप करें:

  • यूआरएल: http://<Replace_With_Edge_Cache_IP>/main.m3u8. यह उस वीडियो का यूआरएल है जिसे हमें स्ट्रीम करना है. सूचना:
  • Media CDN इंस्टेंस का आईपी पता: 34.105.35.246. इसे उस Cloud Media Service के आईपी पते से बदलें जिसे आपने डिप्लॉय किया है.
  • मेनिफ़ेस्ट वीडियो फ़ाइल का पाथ: "/". यह वह पाथ है जिसका इस्तेमाल हमने live-streaming-storage-$LOGNAME बकेट में, ट्रांसकोड किए गए लाइव सिग्नल की फ़ाइलों को सेव करने के लिए किया था. यहां पाथ, रूट पाथ है: "/".
  • मेनिफ़ेस्ट वीडियो फ़ाइल का नाम: एचएलएस मेनिफ़ेस्ट फ़ाइल, main.m3u8.

इसके बाद, "खोलें" पर क्लिक करें. आपको ट्रांसकोड किया गया लाइव वीडियो चलने लगेगा. वीडियो, नीचे दिए गए स्क्रीनशॉट की तरह दिखेगा. स्क्रीन पर मौजूद काउंटर, एक-एक करके बढ़ता जाएगा. साथ ही, आपको लगातार बीप सुनाई देगी.

यह FFmpeg से जनरेट किया गया एक बुनियादी आरटीएमपी टेस्ट लाइव सिग्नल है. इसे Live Streaming API ने एचएलएस में ट्रांसकोड किया है और Media CDN कैश के ज़रिए दिखाया गया है:

28fc359b49d44ec2.png

अगर आपको किसी दूसरे HLS और MPEG DASH प्लेयर का इस्तेमाल करना है, तो आपके पास ऐसा करने का विकल्प है. यहां कुछ प्लेयर दिए गए हैं:

  • Quicktime player - यह Mac पर डिफ़ॉल्ट रूप से इंस्टॉल होता है. यहां भी ऐसा ही करें: http://34.104.36.157/main.m3u8 से नेटवर्क कनेक्शन खोलें. आईपी पते को अपने Edge Cache Service इंस्टेंस के आईपी पते से बदलें.

17. Media CDN को मॉनिटर करना

एसएमई टीम ने Media CDN डैशबोर्ड का टेंप्लेट बनाया है - https://gist.github.com/elithrar/1c511d00f5cd3736fb2a3897867209c1.

इसे इंस्टॉल करने के लिए, Cloud Shell विंडो में ये कमांड चलाएं:

YAML फ़ाइल डाउनलोड करें:

curl https://gist.githubusercontent.com/elithrar/1c511d00f5cd3736fb2a3897867209c1/raw/3cb70855304f29e5c06b8d63063196354db0dec3/media-edge-20210208-dashboard --output media-edge-20210208-dashboard.yaml

Cloud Monitoring के लिए डैशबोर्ड बनाएं:

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

इसे सेट अप करने में कुछ मिनट लग सकते हैं. Google Cloud Console पर जाएं और तीन बार > Operations > Monitoring > Dashboards पर क्लिक करें. आपको "मीडिया एज मेट्रिक" नाम का डैशबोर्ड दिखेगा. उस पर क्लिक करें. इसके बाद, आपको ये मेट्रिक दिखेंगी:

d0821d84a88a928d.png

18. लैब के माहौल को साफ़-सुथरा रखना

लैब पूरा करने के लिए बधाई. इस सेक्शन में, हम लैब में बनाए गए सभी संसाधनों को मिटा देंगे.

FFmpeg सिग्नल को बंद करें:

FFmpeg चलाने वाले Cloud Shell टर्मिनल पर, <CTRL+C> दबाएं.

लाइव स्ट्रीमिंग चैनल बंद करने के लिए:

Command

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

लाइव स्ट्रीमिंग चैनल मिटाने के लिए:

Command

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

लाइव स्ट्रीमिंग इनपुट एंडपॉइंट मिटाने के लिए:

Command

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

GCS बकेट मिटाएं:

Command

gsutil rm -r gs://live-streaming-storage-$LOGNAME

Edge Cache Service के इंस्टेंस को मिटाएं:

Command

gcloud edge-cache services delete cme-demo

जब आपसे कहा जाए, तब "Y" डालकर मिटाने की पुष्टि करें

Edge Cache Origin को मिटाएं:

Command

gcloud edge-cache origins delete cme-origin

जब आपसे कहा जाए, तब "Y" डालकर मिटाने की पुष्टि करें

कस्टम डैशबोर्ड मिटाना

Command

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