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 ด้วย
สิ่งที่คุณจะสร้าง
ในบทแนะนำนี้ เราจะตั้งค่าสภาพแวดล้อมตามสถาปัตยกรรมต่อไปนี้
เราจะตั้งค่าคอมโพเนนต์ต่อไปนี้และทํางานต่อไปนี้ในแล็บ
- สร้างที่เก็บข้อมูล 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 ในแถบเครื่องมือด้านขวาบน
การจัดสรรและเชื่อมต่อกับสภาพแวดล้อมจะใช้เวลาเพียงไม่กี่นาที เมื่อดำเนินการเสร็จแล้ว คุณควรเห็นข้อมูลดังต่อไปนี้
เครื่องเสมือนนี้โหลดเครื่องมือการพัฒนาทั้งหมดที่คุณต้องการ ซึ่งจะมีไดเรกทอรีหลักขนาด 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
ขั้นตอนถัดไป
- หากเวอร์ชัน SDK เป็น
408.0.0
ขึ้นไป ให้ข้ามไปยังส่วนถัดไป - หากเวอร์ชัน SDK ต่ำกว่า
408.0.0
ให้เรียกใช้คําสั่งที่ระบุไว้ด้านล่างเพื่ออัปเดต SDK
sudo apt-get update && sudo apt-get install google-cloud-sdk
5. ข้อกำหนดเบื้องต้น
ก่อนที่จะเริ่มกําหนดค่าทรัพยากร GCP เราต้องทําสิ่งต่อไปนี้
- ตั้งค่าตัวแปรสภาพแวดล้อม
- เปิดใช้ 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
ในส่วนนี้ เราจะทำสิ่งต่อไปนี้
- สร้างที่เก็บข้อมูล Cloud Storage
- ทำให้ที่เก็บข้อมูลเข้าถึงได้แบบสาธารณะ
เราจะใช้ที่เก็บข้อมูลนี้เพื่อจัดเก็บไฟล์วิดีโอที่แปลงในภายหลัง ที่เก็บข้อมูลนี้จะทำหน้าที่เป็นที่เก็บข้อมูลต้นทางสำหรับบริการ 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 มีสถาปัตยกรรมดังนี้
เราได้สร้างที่เก็บข้อมูล 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. เริ่มช่องสตรีมมิงแบบสด
ตอนนี้เราได้สร้างช่องสตรีมแบบสดแล้ว มาเริ่มใช้งานช่องกัน ในส่วนนี้ เราจะทําสิ่งต่อไปนี้
- เริ่มช่องสตรีมมิงแบบสด
- ตรวจสอบสถานะของช่อง เราต้องตรวจสอบว่า
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 เราจะสร้างทรัพยากรต่อไปนี้
- ต้นทางแคช Edge
- บริการแคช 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 CDNOrigin:
คือต้นทางแคช 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. สร้างสัญญาณอินพุต
เมื่อกำหนดค่าบริการที่จำเป็นทั้งหมดแล้ว มาสร้างสัญญาณอินพุตสตรีมแบบสดกัน ในส่วนนี้ เราจะทำสิ่งต่อไปนี้
- ติดตั้ง FFmpeg ซึ่งเป็นซอฟต์แวร์โอเพนซอร์สที่ใช้งานฟรี
- ส่งสัญญาณทดสอบแบบสดไปยังอินพุต/แชแนล
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 เพิ่มเติม
เรียกใช้ส่วนที่เหลือของห้องทดลองในหน้าต่าง 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
โดยใช้ที่เก็บข้อมูล GCSlive-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
ติดตั้งโปรแกรมเล่นในแล็ปท็อปแล้วเปิดใช้งาน เราจะใช้โปรแกรมเล่นเวอร์ชัน MacOSX ในอีก 2-3 ขั้นตอนข้างหน้า
หากต้องการเล่นวิดีโอ ให้ไปที่ "ไฟล์" / "เปิดเครือข่าย"
ตั้งค่าด้วยสิ่งต่อไปนี้
- 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 ของสื่อ
คุณใช้โปรแกรมเล่น 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 แถบ > การดำเนินการ > การตรวจสอบ > แดชบอร์ด คุณควรเห็นหน้าแดชบอร์ดชื่อ "เมตริกขอบสื่อ" คลิกที่เมตริกดังกล่าวแล้วคุณจะเห็นเมตริกต่อไปนี้
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)")