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 ด้วย
สิ่งที่คุณจะสร้าง
ในห้องทดลองนี้ เราจะตั้งค่าสภาพแวดล้อมตามสถาปัตยกรรมต่อไปนี้
เราจะตั้งค่าคอมโพเนนต์ต่อไปนี้และทำงานต่อไปนี้โดยเป็นส่วนหนึ่งของห้องทดลอง
- สร้างที่เก็บข้อมูล 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 ในแถบเครื่องมือด้านขวาบน ดังนี้
การจัดสรรและเชื่อมต่อกับสภาพแวดล้อมนี้ควรใช้เวลาเพียงครู่เดียว เมื่อเสร็จแล้ว คุณจะเห็นข้อมูลต่อไปนี้
เครื่องเสมือนนี้เต็มไปด้วยเครื่องมือการพัฒนาทั้งหมดที่คุณต้องการ โดยมีไดเรกทอรีหลักขนาด 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
ขั้นตอนถัดไป
- หาก 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
- 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
ในส่วนนี้ เราจะดำเนินการต่อไปนี้
- สร้างที่เก็บข้อมูล Cloud Storage
- ทำให้ที่เก็บข้อมูลเข้าถึงได้แบบสาธารณะ
เราจะใช้ที่เก็บข้อมูลนี้เพื่อจัดเก็บไฟล์วิดีโอที่แปลงแล้วใน 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 สตรีมมิงแบบสดมีสถาปัตยกรรมดังนี้
เราได้สร้างที่เก็บข้อมูล 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. เริ่มช่องสตรีมมิงแบบสด
หลังจากสร้างช่องสตรีมแบบสดแล้ว มาเริ่มสร้างช่องกัน ในส่วนนี้ เราจะดำเนินการต่อไปนี้
- เริ่มช่องสตรีมมิงแบบสด
- ตรวจสอบสถานะช่อง เราต้องดูให้แน่ใจว่า
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 ใช้งานได้ในส่วนนี้ เราจะสร้างแหล่งข้อมูลต่อไปนี้
- ต้นทางของแคช Edge
- บริการ 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 CDNOrigin:
นี่คือต้นทางของแคช 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. สร้างสัญญาณอินพุต
เมื่อกำหนดค่าบริการที่จำเป็นทั้งหมดแล้ว เรามาสร้างสัญญาณอินพุตสตรีมแบบสดกัน ในส่วนนี้ เราจะดำเนินการต่อไปนี้
- ติดตั้ง 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 ใหม่สำหรับ Lab ที่เหลือ
13. เปิด Cloud Shell ใหม่
ที่จุดนี้คุณจะต้องเปิดหน้าต่าง Cloud Shell ใหม่เพื่อให้ใช้ห้องทดลองต่อเนื่องจาก FFmpeg จะทำงานถาวรจนกว่าคุณจะ <Ctrl+C> คำสั่งเพื่อหยุดและซึ่งจะเป็นการหยุดการสร้างสัญญาณแบบสด
คลิกที่ปุ่ม "+" ข้างชื่อของเทอร์มินัล Cloud Shell ปัจจุบัน ซึ่งจะเป็นการเปิดหน้าต่าง Cloud Shell เพิ่มเติม
เรียกใช้ 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
ได้รับการตั้งค่าโดยมีที่เก็บข้อมูล GCSlive-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
ติดตั้ง Player บนแล็ปท็อปและเปิดขึ้นมา เราจะใช้โปรแกรมเล่นเวอร์ชัน MacOSX ในขั้นตอนถัดไป
หากต้องการเล่นวิดีโอ ให้ไปที่ "ไฟล์" / "เครือข่ายแบบเปิด":
ตั้งค่าด้วย
- URL: http://<Replace_With_Edge_Cache_IP>/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 ดังนี้
แต่คุณสามารถใช้โปรแกรมเล่น 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" เมื่อคลิกแล้วคุณจะเห็นเมตริกต่อไปนี้
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)")