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

1. परिचय

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

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

इस लैब में, मीडिया सीडीएन (सीडीएन) + क्लाउड मीडिया लाइव स्ट्रीमिंग एपीआई (लाइव वीडियो ट्रांसकोडिंग) + क्लाउड स्टोरेज (वीडियो का स्टोरेज) + वीडियो प्लेयर (वीएलसी, Google Shaka Player वगैरह - एचएलएस + एमपीईजी-डीएश के लिए तैयार प्लेयर) के साथ लाइव स्ट्रीमिंग वर्कफ़्लो एनवायरमेंट को डिप्लॉय करने का तरीका बताया गया है.

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

आपको क्या बनाना है

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

de33cb3e75d52549.png

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

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

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

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

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

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

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

Cloud Shell शुरू करना

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

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 में SDK टूल का नया वर्शन इस्तेमाल किया जा रहा हो.

SDK टूल का वर्शन देखना

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

Command

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. ज़रूरी Service API चालू करना

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

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

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

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

आम तौर पर, ये एनवायरमेंट वैरिएबल Cloudshell में पहले से कॉन्फ़िगर होते हैं. हम पुष्टि करने के लिए 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 चालू करना

नेटवर्क सेवाओं के एपीआई को चालू करने के लिए, यह कमांड चलाएं:

Command

gcloud services enable networkservices.googleapis.com

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. बकेट को सार्वजनिक तौर पर ऐक्सेस करने लायक बनाना

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

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 फ़ाइल बनाना

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

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 कॉन्फ़िगर करना

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

  1. एज कैश मेमोरी का ऑरिजिन
  2. एज कैश सेवा

1. एज कैश मेमोरी का ऑरिजिन बनाना

एज कैश ऑरिजिन, कॉन्टेंट की जगह की जानकारी देता है. जैसे, 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 Origin सेट अप है, इसलिए हम Edge Cache Service खुद बना सकते हैं.

cme-demo.yaml फ़ाइल बनाना

Edge कैश सेवा का कॉन्फ़िगरेशन, 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 कैश सेवा के सभी कॉन्फ़िगरेशन को डिफ़ॉल्ट के तौर पर सेट कर देंगे. ऊपर दी गई फ़ाइल में तीन फ़ील्ड वैल्यू हैं, जिन्हें उपयोगकर्ता अपडेट कर सकते हैं:

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

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

Edge कैश सेवा बनाना

हम cme-demo नाम की एक एज कैश सेवा बनाएंगे. यह सेवा, एज कैश ऑरिजिन cme-origin पर होस्ट demo.cme.com के साथ काम करेगी. सेवा बनाने के लिए, Cloud Shell में यह कमांड चलाएं:

Command

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

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

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

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 कैश सेवा को अपडेट करना

इस समय, एज कैश सेवा के कॉन्फ़िगरेशन को अपडेट करना अच्छा रहेगा. इससे, बाद में वीडियो स्ट्रीम करने के लिए, सेवा के आईपी का इस्तेमाल किया जा सकेगा. 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 एक मुफ़्त और ओपन-सोर्स सॉफ़्टवेयर प्रोजेक्ट है. इसमें वीडियो, ऑडियो, और अन्य मल्टीमीडिया फ़ाइलों और स्ट्रीम को मैनेज करने के लिए, लाइब्रेरी और प्रोग्राम का एक सुइट शामिल है. Cloud Shell टर्मिनल में, FFmpeg इंस्टॉल करने के लिए, इस कमांड का इस्तेमाल करें:

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

फ़िलहाल, हमने ये काम कर लिए हैं:

  • लाइव स्ट्रीमिंग एपीआई: लाइव सिग्नल जनरेट किया जाता है और लाइव स्ट्रीमिंग एपीआई की मदद से, बकेट में ट्रांसकोड किया जाता है
  • मीडिया सीडीएन: मीडिया सीडीएन को कॉन्फ़िगर किया गया है, जिसमें लाइव स्ट्रीमिंग स्टोरेज बकेट को मीडिया सीडीएन के ऑरिजिन के तौर पर इस्तेमाल किया गया है.

अगले सेक्शन में, हम एज कैश सेवा की पुष्टि करेंगे. इसके बाद, हम मीडिया सीडीएन के किसी भी आइपी पते का इस्तेमाल करके, ट्रांसकोड किए गए वीडियो को स्ट्रीम करेंगे.

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

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

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

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

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

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

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

VLC प्लेयर का इस्तेमाल करने के लिए, 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 की मदद से एचएलएस में ट्रांसकोड किया जाता है और मीडिया सीडीएन कैश मेमोरी के ज़रिए दिखाया जाता है:

28fc359b49d44ec2.png

अगर आप चाहें, तो किसी भी दूसरे एचएलएस और एमपीईजी डीएएस प्लेयर का इस्तेमाल किया जा सकता है. यहां कुछ ऐसे प्लेयर दिए गए हैं जिनका इस्तेमाल किया जा सकता है:

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

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

क्लाउड मॉनिटरिंग के लिए डैशबोर्ड बनाना:

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

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

d0821d84a88a928d.png

18. लैब एनवायरमेंट को साफ़ करना

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

FFmpeg सिग्नल को रोकना:

उस Cloud Shell टर्मिनल पर <CTRL+C> दबाएं जिस पर FFmpeg चल रहा है.

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

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 कैश सेवा इंस्टेंस मिटाना:

Command

gcloud edge-cache services delete cme-demo

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

Edge कैश मेमोरी का ओरिजिन मिटाना:

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