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

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

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

de33cb3e75d52549.png

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

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

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

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

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

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

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

เริ่มต้น Cloud Shell

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

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

55efc1aaa7a4d3ad.png

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

7ffe5cbb04455448.png

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

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

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

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

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

โดยทั่วไปแล้ว ตัวแปรสภาพแวดล้อมเหล่านี้จะได้รับการกำหนดค่าล่วงหน้าใน Cloud Shell เราจะใช้คำสั่ง 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. สร้าง Bucket ของ Cloud Storage

ในส่วนนี้ เราจะทำสิ่งต่อไปนี้

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

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

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

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

คำสั่ง

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

2. ทำให้ Bucket เข้าถึงได้แบบสาธารณะ

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

คำสั่ง

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

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

คอมโพเนนต์ของเชน Live Streaming API ได้รับการออกแบบมาดังนี้

96b5d26aedeb89a6.png

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

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

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

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

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

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

เราจะสร้างไฟล์ input.json เพื่อระบุประเภทสัญญาณไลฟ์สด ใน Lab นี้ เราจะใช้สัญญาณสด 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" ซึ่งแสดงว่าสร้าง Input Endpoint แล้วและพร้อมใช้งาน

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

สร้างไฟล์ 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" ซึ่งแสดงว่าสร้าง Input Endpoint แล้วและพร้อมใช้งาน

โปรดทราบว่าขณะนี้ "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 Cache
  2. บริการแคชที่ Edge

1. สร้างต้นทางของ Edge Cache

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

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

สร้างไฟล์ 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 Cache ที่เราเพิ่งสร้างในขั้นตอนก่อนหน้า ตั้งค่าเป็น cme-origin - ชื่อของต้นทาง Media CDN

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

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

เราจะสร้างบริการ Edge Cache ชื่อ cme-demo ในต้นทาง Edge Cache 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 Cache

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

ณ จุดนี้ อินสแตนซ์บริการแคชที่ขอบจะยอมรับคำขอที่มี "demo.cme.com" หรือที่อยู่ IP เป็นโฮสต์

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

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

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

1. ติดตั้ง FFmpeg

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

คำสั่ง

sudo apt install ffmpeg -y

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

ตั้งค่าตัวแปรสภาพแวดล้อม

เนื่องจากเป็น Cloud Shell ใหม่ เราจึงต้องตั้งค่าตัวแปรสภาพแวดล้อมอีกครั้ง เราจะใช้คำสั่ง 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 Cache จากนั้นจะสตรีมวิดีโอที่แปลงรหัสโดยใช้ที่อยู่ IP แบบ Anycast ของ Media CDN

15. ตรวจสอบว่าอินสแตนซ์บริการแคชที่ Edge ทำงานอยู่

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

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

คำสั่ง

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

สังเกตการเข้าถึงแคชเนื่องจากตอนนี้ระบบแคชออบเจ็กต์ที่ Edge แล้ว Cloud Media Edge Service ทำงานเป็นปกติ

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

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

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

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

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

หากต้องการใช้ VLC Player ให้ไปที่ 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 ซึ่งแปลงรหัสเป็น HLS โดย Live Streaming API และแสดงผ่านแคช Media CDN

28fc359b49d44ec2.png

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

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

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

สร้างแดชบอร์ดสำหรับ Cloud Monitoring โดยทำดังนี้

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

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

d0821d84a88a928d.png

18. ทำความสะอาดสภาพแวดล้อมของ Lab

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

หยุดสัญญาณ 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"

ลบ Bucket ของ GCS:

คำสั่ง

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

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

คำสั่ง

gcloud edge-cache services delete cme-demo

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

ลบต้นทางของ Edge Cache:

คำสั่ง

gcloud edge-cache origins delete cme-origin

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

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

คำสั่ง

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