สตรีมมิงแบบสดบน Google Cloud ด้วย Media CDN และ API สตรีมมิงแบบสด

1. บทนำ

เครือข่ายนำส่งข้อมูล (CDN) ช่วยปรับปรุงประสิทธิภาพของผู้ใช้ด้วยการแคชเนื้อหาที่มีการเข้าถึงบ่อยซึ่งอยู่ใกล้กับผู้ใช้ปลายทางมากขึ้น ปิดการเชื่อมต่อใกล้กับไคลเอ็นต์มากขึ้น ใช้การเชื่อมต่อกับต้นทางซ้ำ และการใช้โปรโตคอลและการปรับแต่งเครือข่ายสมัยใหม่ สําหรับผู้ใช้ (และลูกค้าของเรา) การเปลี่ยนแปลงนี้หมายความว่าเวลาในการตอบสนองจะลดลง มีความน่าเชื่อถือมากขึ้น และต้นทุนลดลง ซึ่งจะส่งผลให้ยอดขาย ประสบการณ์การใช้งานเว็บ และประสบการณ์โดยรวมของผู้ใช้เพิ่มขึ้น ปัจจุบันมีเว็บไซต์และแพลตฟอร์มสตรีมมิงวิดีโอสมัยใหม่เพียงไม่กี่แห่งที่ทำงานโดยไม่ใช้ CDN

สิ่งที่คุณจะได้เรียนรู้

ห้องทดลองนี้จะแนะนำขั้นตอนต่างๆ ในการติดตั้งใช้งานสภาพแวดล้อมเวิร์กโฟลว์สตรีมมิงแบบสดด้วย Media CDN (CDN) + Cloud Media Live Streaming API (การแปลงไฟล์วิดีโอสด) + Cloud Storage (พื้นที่เก็บข้อมูลสำหรับวิดีโอ) + Video Player (VLC, Google Shaka Player ฯลฯ - โปรแกรมเล่นที่พร้อมใช้งาน HLS + MPEG-DASH)

เราจะตั้งค่าคอมโพเนนต์ Live Streaming API - อินพุต ช่อง - และเริ่มฟีดสดไปยังอินพุต/ช่องด้วย FFmpeg (FFmpeg สร้างสัญญาณทดสอบแบบเรียลไทม์ได้) Live Streaming API จะเปลี่ยนรูปแบบฟีดการถ่ายทอดสด ระบบจะจัดเก็บไฟล์ Manifest และกลุ่มของวิดีโอที่แปลงไฟล์ไว้ในที่เก็บข้อมูล Cloud Storage จากนั้นเราจะตั้งค่า Media CDN โดยใช้ที่เก็บข้อมูล Cloud Storage ของวิดีโอสดเป็นแหล่งที่มา สุดท้าย ระบบจะใช้ VLC Player เพื่อเล่นเนื้อหาสดที่แคชไว้ผ่าน Media CDN นอกจากนี้ เราจะตั้งค่าแดชบอร์ดการตรวจสอบระบบคลาวด์เพื่อแสดงภาพกิจกรรมของ Media CDN ด้วย

สิ่งที่คุณจะสร้าง

ในบทแนะนำนี้ เราจะตั้งค่าสภาพแวดล้อมตามสถาปัตยกรรมต่อไปนี้

de33cb3e75d52549.png

เราจะตั้งค่าคอมโพเนนต์ต่อไปนี้และทํางานต่อไปนี้ในแล็บ

  • สร้างที่เก็บข้อมูล Google Cloud Storage (GCS) สำหรับจัดเก็บวิดีโอแบบสดที่เปลี่ยนรูปแบบแล้ว
  • กำหนดค่า Live Streaming API เพื่อแปลงวิดีโอเป็นหลายรูปแบบ ได้แก่ HLS + MPEG DASH, SD และ HD
  • ตั้งค่าคอมโพเนนต์สตรีมมิงแบบสด: อินพุต/ช่อง
  • เริ่มช่องสตรีมแบบสด
  • ตั้งค่า Media CDN โดยใช้ที่เก็บข้อมูล GCS เป็นต้นทาง
  • ตั้งค่า FFmpeg เพื่อส่งฟีดไปยังช่องถ่ายทอดสด
  • สตรีมฟีดสดที่แปลงรูปแบบแล้วด้วยวิดีโอเพลเยอร์
  • ตั้งค่าแดชบอร์ดการตรวจสอบ Cloud เพื่อตรวจสอบกิจกรรมของ Media CDN (เวลาในการตอบสนอง การตีข้อมูลแคช การไม่ตีข้อมูลแคช ฯลฯ)

หมายเหตุ: สําหรับห้องทดลองนี้ เราจะถือว่าผู้ใช้มีสิทธิ์เข้าถึงคอนโซล Google Cloud และตั้งค่าโปรเจ็กต์ไว้แล้ว นอกจากนี้ เรายังถือว่าผู้ใช้เริ่มต้นด้วยสภาพแวดล้อมใหม่และไม่ได้ตั้งค่าอะไรไว้สําหรับการสาธิตนี้

การดำเนินการกำหนดค่าทั้งหมดจะดำเนินการผ่านบรรทัดคำสั่งใน Cloud Shell เราตรวจสอบคอมโพเนนต์ที่กําหนดค่าผ่านบรรทัดคําสั่งในคอนโซลได้ทุกเมื่อ เราจะเห็นเคอร์เซอร์ทั่วทั้งห้องทดลองซึ่งจะชี้ไปยัง Google Cloud Console

2. ก่อนเริ่มต้น

การเข้าถึง CDN ของสื่อถูกจํากัด หากต้องการเข้าถึง Media CDN โปรดติดต่อทีมดูแลลูกค้า โดยบุคคลดังกล่าวจะสร้างคำขอเข้าถึงในนามของคุณได้ หากคุณเป็นสมาชิกของ Google และต้องการที่จะใช้การทดสอบสตรีมมิงแบบสดด้วย Media CDN โปรดติดต่อ PM ของ Media CDN เพื่อขอสิทธิ์เข้าถึง Media CDN

3. การตั้งค่าและข้อกําหนด

เริ่ม Cloud Shell

แม้ว่า Google Cloud จะทำงานจากระยะไกลจากแล็ปท็อปได้ แต่ในโค้ดแล็บนี้ คุณจะใช้ Google Cloud Shell ซึ่งเป็นสภาพแวดล้อมบรรทัดคำสั่งที่ทำงานในระบบคลาวด์

จากคอนโซล Google Cloud ให้คลิกไอคอน Cloud Shell ในแถบเครื่องมือด้านขวาบน

55efc1aaa7a4d3ad.png

การจัดสรรและเชื่อมต่อกับสภาพแวดล้อมจะใช้เวลาเพียงไม่กี่นาที เมื่อดำเนินการเสร็จแล้ว คุณควรเห็นข้อมูลดังต่อไปนี้

7ffe5cbb04455448.png

เครื่องเสมือนนี้โหลดเครื่องมือการพัฒนาทั้งหมดที่คุณต้องการ ซึ่งจะมีไดเรกทอรีหลักขนาด 5 GB ถาวรและทำงานบน Google Cloud ซึ่งจะช่วยเพิ่มประสิทธิภาพเครือข่ายและการรับรองได้อย่างมีประสิทธิภาพ คุณทํางานทั้งหมดในโค้ดแล็บนี้ได้ภายในเบราว์เซอร์ คุณไม่จำเป็นต้องติดตั้งอะไรเลย

4. เวอร์ชัน Google Cloud SDK

408.0.0 เป็นเวอร์ชันล่าสุดของ Google Cloud SDK ณ เวลาที่เขียน คำสั่งทั้งหมดในชั้นเรียนนี้ได้รับการทดสอบโดยใช้ Google Cloud SDK เวอร์ชันล่าสุด โปรดตรวจสอบว่า Cloud Shell ใช้ SDK เวอร์ชันล่าสุดก่อนที่จะดําเนินการต่อ

การตรวจสอบเวอร์ชัน SDK

เราจะใช้คําสั่ง gcloud version เพื่อตรวจสอบเวอร์ชัน SDK

คำสั่ง

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 ที่มีตัวแปร 2-3 ตัว เราต้องกําหนดค่าตัวแปรสภาพแวดล้อมต่อไปนี้

  • รหัสโปรเจ็กต์
  • หมายเลขโปรเจ็กต์
  • ชื่อผู้ใช้
  • ภูมิภาค
  • รหัสอินพุต
  • รหัสช่อง

รหัสโปรเจ็กต์และชื่อผู้ใช้

โดยทั่วไปแล้ว ตัวแปรสภาพแวดล้อมเหล่านี้จะได้รับการกําหนดค่าไว้ล่วงหน้าใน Cloudshell เราจะใช้คำสั่ง env เพื่อยืนยัน

คำสั่ง

env | grep -E 'DEVSHELL_PROJECT_ID=|LOGNAME'

ตัวอย่างเอาต์พุต

DEVSHELL_PROJECT_ID=<YOUR_PROJECT_ID>
LOGNAME=<YOUR_USERNAME>

สร้างไฟล์ env_variables

ใช้คําสั่ง cat เพื่อสร้างไฟล์ env_variables.txt คำสั่งด้านล่างจะสร้างไฟล์ 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 ต่อไปนี้ในโปรเจ็กต์แล้ว

  • Network Services API
  • Certificate Manager API
  • Livestream API
  • Media CDN Edge Cache API

เปิดใช้ Network Services API

หากต้องการเปิดใช้ Network Services API ให้เรียกใช้คําสั่งต่อไปนี้

คำสั่ง

gcloud services enable networkservices.googleapis.com

เปิดใช้ Certificate Manager API

หากต้องการเปิดใช้ Certificate Manager API ให้เรียกใช้คําสั่งต่อไปนี้

คำสั่ง

gcloud services enable certificatemanager.googleapis.com

เปิดใช้ Live Stream API

หากต้องการเปิดใช้ Live Stream API ให้เรียกใช้คําสั่งต่อไปนี้

คำสั่ง

gcloud services enable livestream.googleapis.com

เปิดใช้ Media CDN Edge Cache API

หากต้องการเปิดใช้ Media CDN Edge Cache API ให้เรียกใช้คําสั่งต่อไปนี้

คำสั่ง

gcloud services enable edgecache.googleapis.com

ยืนยันว่าเปิดใช้ API แล้ว

เรียกใช้คําสั่ง gcloud services list เพื่อแสดงรายการ API ที่เปิดใช้ทั้งหมด เราควรเห็น API 4 รายการในเอาต์พุต

คำสั่ง

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 เพื่อสร้างที่เก็บข้อมูล

คำสั่ง

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

2. ทำให้ที่เก็บข้อมูลเข้าถึงได้แบบสาธารณะ

เราจะใช้คำสั่ง gsutil iam เพื่อทำให้ไฟล์พร้อมใช้งานแบบสาธารณะ

คำสั่ง

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

7. การตั้งค่าสภาพแวดล้อมของ Live Streaming API

คอมโพเนนต์ของเชน Live Streaming API มีสถาปัตยกรรมดังนี้

96b5d26aedeb89a6.png

เราได้สร้างที่เก็บข้อมูล Cloud Storage live-streaming-storage-$LOGNAME ไว้ในส่วนก่อนหน้า ในส่วนถัดไป 2 ส่วน เราจะสร้างทรัพยากรต่อไปนี้

  • อินพุตสตรีมมิงแบบสด: ปลายทางอินพุตคือปลายทางที่โปรแกรมเปลี่ยนไฟล์ส่งสตรีมอินพุต คุณสามารถใช้ปลายทางอินพุตเพื่อระบุการกำหนดค่าสำหรับสตรีม เช่น ความละเอียดของอินพุต ประเภทอินพุต และการครอบตัดวิดีโอ
  • ช่องสตรีมมิงแบบสด: ช่องคือทรัพยากรที่ส่งผ่านข้อมูลสตรีมอินพุตผ่านปลายทางอินพุต แปลงสตรีมอินพุตเป็นเวอร์ชันต่างๆ และเผยแพร่สตรีมแบบสดเอาต์พุตในรูปแบบที่ระบุไว้ในตำแหน่งที่ระบุ คุณสามารถรวมสตรีมอินพุตหลักและสตรีมอินพุตสำรองไว้ในแชแนลเดียวกันได้

เราจะสร้างทรัพยากรต่อไปนี้ในภายหลังในห้องทดลอง

  • โปรแกรมเปลี่ยนไฟล์: โปรแกรมเปลี่ยนไฟล์คือโปรแกรมที่ใช้ส่งสตรีมอินพุต ในบทแนะนำนี้ เราจะใช้ FFmpeg

8. สร้างและกําหนดค่าปลายทางอินพุต

สร้างไฟล์ input.json

เราจะสร้างไฟล์ input.json เพื่อระบุประเภทสัญญาณสตรีมแบบสด ในแล็บนี้ เรากำลังใช้สัญญาณสด RTMP

คำสั่ง

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

สร้างปลายทางอินพุต

ขณะเขียนบทแนะนำนี้ gcloud ยังไม่รองรับ Live Stream API เราจะใช้คําสั่ง curl เพื่อเรียก API

คำสั่ง

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
}

เอาต์พุตมีข้อมูลที่เป็นประโยชน์มากมาย แต่ตอนนี้เราต้องมุ่งเน้นที่ 2 ช่องต่อไปนี้

  • รหัสการดำเนินการ: จากเอาต์พุต ให้คัดลอกและจดรหัสการดำเนินการไว้ ด้านล่างนี้คือรหัสการดำเนินการจากตัวอย่างเอาต์พุต ซึ่งจะอยู่ในบรรทัดเอาต์พุตที่ขึ้นต้นด้วย "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 ที่คุณเพิ่งจดไว้ด้านบน คุณยังใช้เมธอด GET เพื่อดึงข้อมูล URI ได้ด้วย

คำสั่ง

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

ในเทอร์มินัล Cloud Shell ให้พิมพ์คำสั่งต่อไปนี้เพื่อสร้างไฟล์ "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. เริ่มช่อง

ใน Cloud Shell ให้เรียกใช้คำสั่ง 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. กำหนดค่า Media CDN

ในส่วนนี้ เราจะติดตั้งใช้งาน Media CDN ซึ่งเป็นโครงสร้างพื้นฐาน CDN เราจะสร้างทรัพยากรต่อไปนี้

  1. ต้นทางแคช Edge
  2. บริการแคช Edge

1. สร้างต้นทางแคช Edge

ต้นทางแคช Edge แสดงตำแหน่งเนื้อหา เช่น ที่เก็บข้อมูล Cloud Storage, ตำแหน่งพื้นที่เก็บข้อมูลของบุคคลที่สาม หรือโหลดบาลานซ์ ในคําศัพท์ของ CDN ต้นทาง (หรือเซิร์ฟเวอร์ต้นทาง) คือตําแหน่งแหล่งที่มาของเนื้อหาที่เราต้องการเผยแพร่ เช่น CSS, JavaScript, HTML, รูปภาพ ฯลฯ ทั้งหมด สําหรับห้องทดลองนี้ เราจะสร้างต้นทางที่เชื่อมโยงกับที่เก็บข้อมูล Cloud Storage ที่เราสร้างขึ้นในช่วงต้นของห้องทดลอง เราจะเรียกต้นทางแคชไปยังเซิร์ฟเวอร์ปลายทางว่า 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. สร้างบริการแคช Edge

เมื่อตั้งค่าต้นทางแคช Edge แล้ว เราก็สร้างบริการแคช Edge ได้

สร้างไฟล์ 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 Cache Service ไว้ ในไฟล์ด้านบนมีค่าในช่อง 3 ค่าที่ผู้ใช้อาจต้องการอัปเดต ดังนี้

  • name: ชื่ออินสแตนซ์ Media CDN - ที่นี่: cme-demo
  • hosts: รายการชื่อโดเมนที่บริการ Media CDN นี้จะแก้ไขได้ ที่นี่: demo.cme.com เราจะใช้ข้อมูลนี้ระหว่างการสาธิต เราจะใช้ที่อยู่ IP ของอินสแตนซ์ Media CDN
  • Origin: คือต้นทางแคช Edge ที่เราเพิ่งสร้างในขั้นตอนก่อนหน้า ตั้งค่าเป็น cme-origin - ชื่อต้นทาง Media CDN

ดูข้อมูลเพิ่มเติมเกี่ยวกับตัวแปรต่างๆ ที่คุณใช้ในไฟล์ YAML ได้ที่คู่มือการกําหนดค่าบริการแคช Edge

สร้างบริการแคช Edge

เราจะสร้างบริการแคชที่ขอบชื่อ cme-demo ในต้นทางแคชที่ขอบ cme-origin ที่มีโฮสต์ demo.cme.com หากต้องการสร้างบริการ ให้เรียกใช้คําสั่งต่อไปนี้ใน Cloud Shell

คำสั่ง

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

การสร้างบริการแคช Edge อาจใช้เวลา 2-3 นาที

ตัวอย่างเอาต์พุต

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 ของอินสแตนซ์ Edge Cache Service ที่นี่ 34.104.36.157 เราจะใช้ไฟล์นี้เพื่ออัปเดตไฟล์ cme-demo.yaml และเพื่อสตรีมวิดีโอที่แปลงรูปแบบในภายหลัง

อัปเดตบริการแคช Edge

เมื่อถึงขั้นตอนนี้ คุณควรอัปเดตการกำหนดค่าบริการแคช Edge เพื่อให้ใช้ IP ของบริการเพื่อสตรีมวิดีโอในภายหลังได้ ไฟล์ YAML ของ Edge Cache Service ช่วยให้เราแสดงรายการชื่อโฮสต์/IP ทั้งหมดที่ Edge Cache Service จะยอมรับคำขอได้ ในตอนนี้ เราได้ระบุเพียง demo.cme.com ในฐานะโฮสต์ หากต้องการทำการแปลงชื่อสำหรับโดเมนนี้ คุณต้องกำหนดค่าโซน DNS อย่างไรก็ตาม วิธีที่ง่ายกว่านั้นคือการเพิ่มที่อยู่ IP ลงในรายการโฮสต์ในไฟล์ 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 ให้เรียกใช้คำสั่งต่อไปนี้

คำสั่ง

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

ตรวจสอบเอาต์พุตของคําสั่งและยืนยันว่า IP ปรากฏในรายการโฮสต์

เมื่อถึงจุดนี้ อินสแตนซ์ Edge Cache Service จะยอมรับคําขอที่มี "demo.cme.com" หรือที่อยู่ IP เป็นโฮสต์

12. สร้างสัญญาณอินพุต

เมื่อกำหนดค่าบริการที่จำเป็นทั้งหมดแล้ว มาสร้างสัญญาณอินพุตสตรีมแบบสดกัน ในส่วนนี้ เราจะทำสิ่งต่อไปนี้

  1. ติดตั้ง FFmpeg ซึ่งเป็นซอฟต์แวร์โอเพนซอร์สที่ใช้งานฟรี
  2. ส่งสัญญาณทดสอบแบบสดไปยังอินพุต/แชแนล

1. ติดตั้ง FFmpeg

FFmpeg เป็นโปรเจ็กต์ซอฟต์แวร์โอเพนซอร์สแบบไม่เสียค่าใช้จ่าย ซึ่งประกอบด้วยชุดไลบรารีและโปรแกรมสำหรับจัดการไฟล์และสตรีมวิดีโอ เสียง และมัลติมีเดียอื่นๆ ในเทอร์มินัล Cloud Shell ให้ใช้คำสั่งต่อไปนี้เพื่อติดตั้ง 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 แล้ว เราจะส่งสตรีมอินพุตทดสอบไปยังปลายทางอินพุตเพื่อสร้างสตรีมแบบสด

ในเทอร์มินัล Cloud Shell ให้เรียกใช้คําสั่งต่อไปนี้โดยใช้ตัวแปรสภาพแวดล้อม URI ที่เราสร้างไว้ในส่วน "สร้างและกําหนดค่าปลายทางอินพุต"

คำสั่ง

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 เพื่อตั้งค่าตัวแปรสภาพแวดล้อม

คำสั่ง

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 เพื่ออธิบายช่อง เราควรเห็นในเอาต์พุตว่า streamingState เปลี่ยนจาก "AWAITING_INPUT" เป็น "STREAMING"

คำสั่ง

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

ในการตอบกลับไฟล์ JSON ของเอาต์พุต คุณควรเห็น "streamingState": "STREAMING" ซึ่งบ่งบอกว่าช่องกำลังสตรีมอยู่และกำลังเปลี่ยนรหัสสัญญาณสด

ต่อไปมาตรวจสอบเนื้อหาของที่เก็บข้อมูลกัน ซึ่งเราควรจะเห็นไฟล์ Manifest และกลุ่มวิดีโอ TS หลายกลุ่ม เรียกใช้คําสั่งต่อไปนี้ใน Cloud Shell เพื่อแสดงรายการเนื้อหาของที่เก็บข้อมูลที่เราสร้างขึ้นในช่วงต้นของห้องทดลองและ Live Streaming API ใช้เพื่อแสดงผลไฟล์ Manifest ของสัญญาณสดและส่วนของวิดีโอ TS ที่เปลี่ยนรูปแบบแล้ว

คำสั่ง

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

ตัวอย่างเอาต์พุต

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

คุณควรเห็นข้อมูลต่อไปนี้

  • ไฟล์ Manifest ของ HLS: main.m3u8
  • ส่วนของวิดีโอ TS ที่เกี่ยวข้อง: ชุดไฟล์ที่มีหมายเลข segment-000000000X.ts

ขั้นตอนนี้เสร็จสมบูรณ์แล้ว

  • Live Streaming API: ระบบจะสร้างและเปลี่ยนรหัสสัญญาณสดลงในที่เก็บข้อมูลผ่าน Live Streaming API
  • Media CDN: Media CDN ที่กําหนดค่าไว้โดยใช้ที่เก็บข้อมูลสําหรับสตรีมมิงแบบสดเป็นต้นทางของ Media CDN

ในส่วนถัดไป เราจะตรวจสอบบริการแคช Edge จากนั้นจะสตรีมวิดีโอที่เปลี่ยนรูปแบบแล้วโดยใช้ที่อยู่ IP แบบ Anycast ของ Media CDN

15. ตรวจสอบว่าอินสแตนซ์ Edge Cache Service ทํางาน

ในส่วนนี้ เราจะยืนยันว่าอินสแตนซ์ Edge Cache Service ทํางานตามที่คาดไว้ โดยเราจะพยายามเข้าถึงไฟล์จากอินสแตนซ์ Edge Cache Service โดยใช้ที่อยู่ IP ของบริการ Edge Cache Service เมื่อเข้าถึงออบเจ็กต์เป็นครั้งแรก ระบบจะยังไม่แคชออบเจ็กต์นั้น เราควรสังเกตแคช MISS สําหรับคําขอแรก ระบบจะอ่านออบเจ็กต์จากต้นทางและแคชไว้ที่อุปกรณ์ขอบ การพยายามเข้าถึงไฟล์เดียวกันทั้งหมดต่อไปนี้จะแสดงผลแคช HIT เนื่องจากตอนนี้ระบบแคชออบเจ็กต์ไว้ที่อุปกรณ์ขอบแล้ว มายืนยันลักษณะการทำงานนี้กัน

เรียกใช้คำสั่ง curl ต่อไปนี้ใน Cloud Shell เพื่อเข้าถึงไฟล์ Manifest วิดีโอที่แปลงแล้วซึ่งจัดเก็บอยู่ในต้นทางแคช Edge

คำสั่ง

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

โปรดสังเกตการแก้ไขที่เราใช้ที่อยู่ IP ของอินสแตนซ์ Edge Cache Service เพื่อแก้ไขชื่อ โปรดทราบว่าคุณใช้ demo.cme.com:<IP> โดยที่ IP คือ 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 ควรเริ่มแสดงเนื้อหาจากแคช คำสั่งด้านล่างจะส่งคำขอ curl 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 ผสมกัน หากเห็นการ Hit แคชในเอาต์พุต แสดงว่า 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

สังเกตการ Hit แคช เนื่องจากตอนนี้ระบบแคชออบเจ็กต์ไว้ที่อุปกรณ์ขอบแล้ว บริการ Cloud Media Edge ทำงานได้ตามที่คาดไว้

16. สตรีมวิดีโอสัญญาณสดที่เปลี่ยนไฟล์ด้วย VLC

ในส่วนนี้เราจะเชื่อมโยงข้อมูลและขั้นตอนทั้งหมดที่เราได้ดำเนินการจนถึงตอนนี้

  • เราสร้างที่เก็บข้อมูลชื่อ live-streaming-storage-$LOGNAME ที่ได้รับผลลัพธ์ของสัญญาณสดที่เปลี่ยนรูปแบบเป็นเนื้อหา HLS โดย Live Streaming API
  • เราตั้งค่า Live Streaming API
  • เราเริ่มสัญญาณสด RTMP ด้วย FFmpeg ที่ส่งข้อมูลไปยังอินพุต/แชแนลของ Live Streaming API
  • เราตรวจสอบแล้วว่าช่องรับสัญญาณสดและอยู่ในโหมด streaming
  • เราตรวจสอบแล้วว่าระบบได้สร้างและจัดเก็บไฟล์ที่แปลงไฟล์ต้นฉบับแล้ว (ไฟล์ Manifest + TS) ไว้ในที่เก็บข้อมูล live-streaming-storage-$LOGNAME
  • ตั้งค่าต้นทางแคช Edge ชื่อ cme-origin โดยใช้ที่เก็บข้อมูล GCS live-streaming-storage-$LOGNAME เป็นต้นทาง
  • มีการสร้างอินสแตนซ์แคช Edge ชื่อ cme-demo ขึ้นโดยมี cme-origin เป็นต้นทาง
  • เราได้ยืนยันลักษณะการทํางาน (การไม่พบแคช การพบแคช) ของอินสแตนซ์ Edge Cache Service แล้ว

ตอนนี้เราสามารถใช้วิดีโอเพลเยอร์เพื่อสตรีมสัญญาณสดที่เปลี่ยนไฟล์แล้วผ่านแคช Media CDN โดยเราจะใช้ VLC Player VLC Player เป็นโปรแกรมเล่นและเฟรมเวิร์กมัลติมีเดียข้ามแพลตฟอร์มแบบโอเพนซอร์สที่ใช้งานได้ฟรี ซึ่งเปิดไฟล์มัลติมีเดียส่วนใหญ่ได้ โดยสามารถเล่นรูปแบบสื่อแบบปรับเปลี่ยนได้ (เช่น DASH และ HLS) โดยจะใช้หลักการของการสตรีมแบบปรับเปลี่ยนได้ ซึ่งโปรแกรมเล่นจะปรับคุณภาพของวิดีโอที่เล่นตามคุณภาพของการเชื่อมต่อเครือข่ายและแบนด์วิดท์ที่มีอยู่ สำหรับการแปลงที่เราเพิ่งดำเนินการ เราใช้ค่าที่กำหนดล่วงหน้าเริ่มต้นและสร้างคุณภาพ "เพียง" 2 ระดับ ได้แก่ SD และ HD เมื่อเราเริ่มเล่นวิดีโอในโปรแกรมเล่น คุณควรเห็นว่าวิดีโอเริ่มเล่นในรูปแบบ SD และเปลี่ยนเป็นรูปแบบ HD อย่างรวดเร็วหากการเชื่อมต่อเครือข่ายของคุณดีพอ

เราจะสตรีมสัญญาณสดที่แปลงไฟล์แล้วในรูปแบบ HLS (รูปแบบวิดีโอของ Apple ที่รองรับอย่างกว้างขวาง) ไฟล์ที่เกี่ยวข้องจะเรียกว่า main.m3u8 ซึ่งเป็นไฟล์ Manifest ของ HLS ไฟล์ Manifest จะชี้ไปยังกลุ่มวิดีโอ TS

หากต้องการใช้โปรแกรมเล่น VLC ให้ไปที่ https://www.videolan.org/vlc/ แล้วดาวน์โหลดโปรแกรมเล่นเวอร์ชันสำหรับระบบปฏิบัติการของแล็ปท็อป โดย VLC มีให้บริการสำหรับ Windows, MacOSX, Linux, Android และ iOS

2a2d19abe728d222.png

ติดตั้งโปรแกรมเล่นในแล็ปท็อปแล้วเปิดใช้งาน เราจะใช้โปรแกรมเล่นเวอร์ชัน MacOSX ในอีก 2-3 ขั้นตอนข้างหน้า

หากต้องการเล่นวิดีโอ ให้ไปที่ "ไฟล์" / "เปิดเครือข่าย"

f85565301f7c68dc.png

ตั้งค่าด้วยสิ่งต่อไปนี้

  • URL: http://<Replace_With_Edge_Cache_IP>/main.m3u8 นี่คือ URL ของวิดีโอที่เราต้องการสตรีม ประกาศ
  • IP ของอินสแตนซ์ Media CDN: 34.105.35.246 แทนที่ด้วย IP ของบริการสื่อในระบบคลาวด์ที่คุณติดตั้งใช้งาน
  • เส้นทางไปยังไฟล์วิดีโอไฟล์ Manifest: "/" ซึ่งเป็นเส้นทางที่เราใช้ในที่เก็บข้อมูล live-streaming-storage-$LOGNAME เพื่อจัดเก็บไฟล์สัญญาณสดที่แปลงรูปแบบแล้ว เส้นทางคือเส้นทางรูท "/"
  • ชื่อไฟล์วิดีโอ Manifest: ไฟล์ Manifest ของ HLS, main.m3u8

แล้วคลิก "เปิด" คุณควรเห็นวิดีโอสดที่เปลี่ยนรูปแบบแล้วเริ่มเล่น วิดีโอจะมีลักษณะเหมือนภาพหน้าจอด้านล่าง ตัวนับบนหน้าจอจะเพิ่มขึ้นทีละ 1 และคุณควรได้ยินเสียงบี๊ปต่อเนื่อง

ไฟล์นี้เป็นสัญญาณทดสอบ RTMP แบบสดพื้นฐานที่สร้างขึ้นโดย FFmpeg ซึ่ง Live Streaming API เปลี่ยนรูปแบบเป็น HLS และแสดงผ่านแคช CDN ของสื่อ

28fc359b49d44ec2.png

คุณใช้โปรแกรมเล่น HLS และ MPEG DASH อื่นๆ ก็ได้หากต้องการ ตัวอย่างโปรแกรมเล่นที่คุณอาจพิจารณามีดังนี้

  • Quicktime Player - ติดตั้งไว้โดยค่าเริ่มต้นใน Mac เหมือนกัน เปิดการเชื่อมต่อเครือข่ายไปยัง http://34.104.36.157/main.m3u8 - แทนที่ที่อยู่ IP ด้วยที่อยู่ของอินสแตนซ์ Edge Cache Service

17. การตรวจสอบ Media CDN

ทีม SME ได้สร้างเทมเพลตหน้าแดชบอร์ด 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 แล้วคลิกแถบ 3 แถบ > การดำเนินการ > การตรวจสอบ > แดชบอร์ด คุณควรเห็นหน้าแดชบอร์ดชื่อ "เมตริกขอบสื่อ" คลิกที่เมตริกดังกล่าวแล้วคุณจะเห็นเมตริกต่อไปนี้

d0821d84a88a928d.png

18. ล้างข้อมูลสภาพแวดล้อมห้องทดลอง

ยินดีด้วยที่ทําแล็บเสร็จ ในส่วนนี้ เราจะลบทรัพยากรทั้งหมดที่เราสร้างขึ้นตลอดทั้งห้องทดลอง

หยุดสัญญาณ FFmpeg:

กด <CTRL+C> ในเทอร์มินัล Cloud Shell ที่ 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

ลบอินสแตนซ์บริการแคช Edge:

คำสั่ง

gcloud edge-cache services delete cme-demo

ยืนยันการลบโดยป้อน "Y" เมื่อได้รับข้อความแจ้ง

ลบต้นทางแคช Edge:

คำสั่ง

gcloud edge-cache origins delete cme-origin

ยืนยันการลบโดยป้อน "Y" เมื่อได้รับข้อความแจ้ง

ลบหน้าแดชบอร์ดที่กำหนดเอง

คำสั่ง

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