สตรีมมิงแบบสดบน 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)

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

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

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

de33cb3e75d52549.png

เราจะตั้งค่าคอมโพเนนต์ต่อไปนี้และทำงานต่อไปนี้โดยเป็นส่วนหนึ่งของห้องทดลอง

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

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

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

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

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

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

เริ่มต้น Cloud Shell

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

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

55efc1aaa7a4d3ad.png

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

7ffe5cbb04455448.png

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

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
  • API ของตัวจัดการใบรับรอง
  • API สตรีมแบบสด
  • API แคช Edge CDN ของสื่อ

เปิดใช้ 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. ทำให้ที่เก็บข้อมูลเข้าถึงได้แบบสาธารณะ

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

1. สร้างที่เก็บข้อมูล

เราจะใช้คำสั่ง gsutil mb เพื่อสร้างที่เก็บข้อมูลดังนี้

คำสั่ง

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

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

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

คำสั่ง

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

7. การตั้งค่าสภาพแวดล้อม API สตรีมมิงแบบสด

องค์ประกอบของห่วงโซ่ API สตรีมมิงแบบสดมีสถาปัตยกรรมดังนี้

96b5d26aedeb89a6.png

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

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

เราจะสร้างแหล่งข้อมูลต่อไปนี้ในห้องทดลองในภายหลัง

  • โปรแกรมเปลี่ยนไฟล์: โปรแกรมเปลี่ยนไฟล์เป็นโปรแกรมที่ใช้ส่งสตรีมอินพุต ใน Lab นี้ เราจะใช้ 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

พิมพ์คำสั่งต่อไปนี้เพื่อสร้างไฟล์ "channel.json" ในเทอร์มินัล Cloud Shell:

คำสั่ง

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

สร้างช่อง

เรียกใช้คำสั่ง curl ต่อไปนี้เพื่อสร้างช่อง

คำสั่ง

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

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

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

บันทึกและคัดลอกรหัสการดำเนินการ เราจะต้องใช้ข้อมูลในขั้นตอนถัดไป ซึ่งจะอยู่ในบรรทัดเอาต์พุตที่เริ่มต้นด้วย "name"

ตรวจสอบสถานะ

ก่อนดำเนินการต่อ เราต้องตรวจสอบว่าได้สร้างช่องเรียบร้อยแล้วและพร้อมใช้งาน

ในคำสั่งด้านล่าง ให้แทนที่ <OPERATION> ด้วยรหัสของการดำเนินการที่เราเพิ่งพูดถึงด้านบน ในตัวอย่างนี้คือ operation-1661405972853-5e70a38d6f27f-79100d00-310671b4

คำสั่ง

export OPERATION_ID_2=<OPERATION>

คำสั่ง

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

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

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

เรียกใช้คำสั่งอีกครั้งจนกว่าจะเห็น "done:true" ที่ระบุว่ามีการสร้างปลายทางอินพุตและพร้อมใช้งานแล้ว

โปรดทราบว่า "streamingState" ในขณะนี้คือ "STOPPED" เราจะเริ่มใช้ช่องในส่วนถัดไป

10. เริ่มช่องสตรีมมิงแบบสด

หลังจากสร้างช่องสตรีมแบบสดแล้ว มาเริ่มสร้างช่องกัน ในส่วนนี้ เราจะดำเนินการต่อไปนี้

  1. เริ่มช่องสตรีมมิงแบบสด
  2. ตรวจสอบสถานะช่อง เราต้องดูให้แน่ใจว่าstreamingStateมีสถานะเป็น"AWAITING INPUT"

1. เริ่มเปิดช่อง

เรียกใช้คำสั่ง curl ต่อไปนี้ใน Cloud Shell เพื่อเริ่มแชแนล:

คำสั่ง

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

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

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

2. ตรวจสอบสถานะช่อง

เรียกใช้คำสั่ง curl ต่อไปนี้เพื่อดูสถานะของช่อง

คำสั่ง

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

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

"streamingState": "AWAITING_INPUT",

เรียกใช้คำสั่งอีกครั้งจนกว่าคุณจะเห็น "AWAITING_INPUT" ซึ่งบ่งชี้ว่าช่องกำลังทำงานและพร้อมที่จะรับสัญญาณ

11. กำหนดค่า CDN สื่อ

ในส่วนนี้ เราจะทำให้ Media CDN ซึ่งเป็นโครงสร้างพื้นฐาน CDN ใช้งานได้ในส่วนนี้ เราจะสร้างแหล่งข้อมูลต่อไปนี้

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

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

ต้นทางของแคช Edge แสดงตำแหน่งเนื้อหา เช่น ที่เก็บข้อมูล Cloud Storage, ตำแหน่งพื้นที่เก็บข้อมูลของบุคคลที่สาม หรือตัวจัดสรรภาระงาน ในข้อกำหนดของ CDN ต้นทาง (หรือเซิร์ฟเวอร์ต้นทาง) คือตำแหน่งซึ่งแหล่งที่มาของเนื้อหาที่เราต้องการเผยแพร่ เช่น CSS, JavaScript, HTML, รูปภาพ ฯลฯ ทั้งหมด สำหรับ Lab นี้ เราจะสร้างต้นทางที่แมปกับที่เก็บข้อมูล Cloud Storage ที่เราสร้างไว้เมื่อเริ่มต้น Lab เราจะเรียก Edge Cache Origin cme-origin ต้นทางของ CDN เป็นที่ที่เก็บเนื้อหาแหล่งที่มาทั้งหมดก่อนที่จะเผยแพร่ไปยังเซิร์ฟเวอร์แคช EDGE

เราจะใช้คำสั่ง 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 Cache

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

สร้างไฟล์ cme-demo.yaml

การกำหนดค่าบริการ Edge Cache จะดำเนินการผ่านไฟล์ YAML สร้างไฟล์ในเครื่องชื่อ cme-demo.yaml ใน Cloud Shell ใช้ 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 ทั้งหมด ในไฟล์ด้านบนมีค่าในช่อง 3 ค่าที่ผู้ใช้อาจต้องการอัปเดต ดังนี้

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

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

สร้างบริการ Edge Cache

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

คำสั่ง

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

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

อัปเดตบริการ Edge Cache

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

13. เปิด Cloud Shell ใหม่

ที่จุดนี้คุณจะต้องเปิดหน้าต่าง Cloud Shell ใหม่เพื่อให้ใช้ห้องทดลองต่อเนื่องจาก FFmpeg จะทำงานถาวรจนกว่าคุณจะ <Ctrl+C> คำสั่งเพื่อหยุดและซึ่งจะเป็นการหยุดการสร้างสัญญาณแบบสด

คลิกที่ปุ่ม "+" ข้างชื่อของเทอร์มินัล Cloud Shell ปัจจุบัน ซึ่งจะเป็นการเปิดหน้าต่าง Cloud Shell เพิ่มเติม

b3c7b0be6276c194.png

เรียกใช้ Lab ที่เหลือในหน้าต่าง 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 เพื่อแสดงเนื้อหาของที่เก็บข้อมูลที่เราสร้างไว้เมื่อเริ่มต้นห้องทดลอง และใช้โดย 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

ณ จุดนี้ เราได้ดำเนินการต่อไปนี้เรียบร้อยแล้ว:

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

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

15. ยืนยันว่าอินสแตนซ์บริการ Edge Cache ทำงานได้

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

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

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

16. สตรีมวิดีโอสัญญาณสดที่แปลงรหัสแล้วด้วย VLC

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

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

ตอนนี้เรามาถึงจุดที่สามารถใช้โปรแกรมเล่นวิดีโอเพื่อสตรีมสัญญาณสดที่แปลงรหัสแล้วผ่านแคช Media CDN โดยเราจะใช้โปรแกรมเล่น VLC ดังต่อไปนี้ 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

ติดตั้ง Player บนแล็ปท็อปและเปิดขึ้นมา เราจะใช้โปรแกรมเล่นเวอร์ชัน MacOSX ในขั้นตอนถัดไป

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

f85565301f7c68dc.png

ตั้งค่าด้วย

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

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

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

28fc359b49d44ec2.png

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

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

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

เทมเพลตแดชบอร์ด Media CDN สร้างขึ้นโดยทีม SME - 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

การตั้งค่าอาจใช้เวลา 2-3 นาที ไปที่ Google Cloud Console แล้วคลิกแถบ 3 แถบ > การดำเนินการ > การตรวจสอบ > แดชบอร์ด คุณควรเห็นหน้าแดชบอร์ดชื่อ "เมตริก Media Edge" เมื่อคลิกแล้วคุณจะเห็นเมตริกต่อไปนี้

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 Cache ดังนี้

คำสั่ง

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