Phát trực tiếp trên Google Cloud với CDN của nội dung nghe nhìn và Live Streaming API

1. Giới thiệu

Mạng phân phối nội dung (CDN) cải thiện hiệu suất của người dùng bằng cách lưu vào bộ nhớ đệm nội dung thường xuyên được truy cập gần với người dùng cuối, chấm dứt các kết nối gần với máy khách, sử dụng lại các kết nối với nguồn và thông qua việc áp dụng các giao thức mạng hiện đại cũng như các chế độ tuỳ chỉnh. Đối với người dùng (và khách hàng của chúng tôi), điều này có nghĩa là độ trễ thấp hơn, độ tin cậy cao hơn và chi phí thấp hơn – dẫn đến doanh số bán hàng, trải nghiệm trên web được cải thiện và trải nghiệm người dùng tăng lên. Ngày nay, rất ít trang web hiện đại và nền tảng phát trực tuyến video hoạt động mà không có CDN.

Kiến thức bạn sẽ học được

Phòng thí nghiệm này sẽ hướng dẫn chúng ta thực hiện các bước triển khai môi trường quy trình phát trực tiếp bằng Media CDN (CDN) + Cloud Media Live Streaming API (chuyển mã video trực tiếp) + Cloud Storage (bộ nhớ cho video) + Trình phát video (VLC, Google Shaka Player, v.v. – trình phát sẵn sàng cho HLS + MPEG-DASH).

Chúng ta sẽ thiết lập các thành phần Live Streaming API (Đầu vào, Kênh) và bắt đầu một nguồn cấp dữ liệu trực tiếp cho Đầu vào/Kênh bằng FFmpeg (FFmpeg có thể tạo tín hiệu kiểm thử trực tiếp). API Phát trực tiếp sẽ chuyển mã nguồn cấp dữ liệu trực tiếp. Tệp kê khai và phân đoạn video được chuyển mã sẽ được lưu trữ trong một bộ chứa Cloud Storage. Sau đó, chúng ta sẽ thiết lập Media CDN với vùng Cloud Storage chứa video trực tiếp làm nguồn. Cuối cùng, VLC Player sẽ được dùng để phát nội dung trực tiếp được lưu vào bộ nhớ đệm thông qua Media CDN. Chúng ta cũng sẽ thiết lập một trang tổng quan Giám sát trên đám mây để hình dung hoạt động của Media CDN.

Sản phẩm bạn sẽ tạo ra

Trong lớp học lập trình này, chúng ta sẽ thiết lập môi trường dựa trên cấu trúc sau:

de33cb3e75d52549.png

Chúng ta sẽ thiết lập các thành phần sau và thực hiện các việc sau trong phòng thí nghiệm:

  • Tạo một bộ chứa Google Cloud Storage (GCS) để lưu trữ các video được chuyển mã trực tiếp
  • Định cấu hình Live Streaming API để chuyển mã video sang nhiều định dạng: HLS + MPEG DASH, SD và HD
  • Thiết lập các thành phần Phát trực tiếp: Đầu vào/Kênh
  • Bắt đầu kênh phát trực tiếp
  • Thiết lập Media CDN bằng vùng chứa GCS làm nguồn
  • Thiết lập FFmpeg để cung cấp dữ liệu cho kênh phát trực tiếp
  • Phát trực tiếp nguồn cấp dữ liệu trực tiếp đã chuyển mã bằng trình phát video
  • Thiết lập trang tổng quan Giám sát trên đám mây để theo dõi hoạt động của CDN nội dung nghe nhìn (độ trễ, kết quả tìm kiếm trong bộ nhớ cache, thiếu bộ nhớ đệm, v.v.)

Lưu ý: Trong bài thực hành này, chúng tôi giả định rằng người dùng có quyền truy cập vào Google Cloud Console và đã thiết lập một dự án. Chúng tôi cũng giả định rằng người dùng bắt đầu với một môi trường mới và chưa thiết lập gì cho bản minh hoạ này.

Tất cả các thao tác định cấu hình sẽ được thực hiện thông qua dòng lệnh trong Cloud Shell. Chúng ta luôn có thể kiểm tra các thành phần được định cấu hình thông qua dòng lệnh trong bảng điều khiển. Chúng ta sẽ thấy các con trỏ trong suốt phòng thí nghiệm, trỏ đến Google Cloud Console.

2. Trước khi bắt đầu

Quyền truy cập vào CDN nội dung nghe nhìn bị hạn chế. Để có quyền truy cập vào Media CDN, hãy liên hệ với nhóm quản lý tài khoản của bạn. Họ có thể thay mặt bạn tạo yêu cầu cấp quyền truy cập. Nếu bạn là nhân viên của Google và muốn kiểm thử tính năng Phát trực tiếp bằng Media CDN, hãy liên hệ với người quản lý sản phẩm của Media CDN để yêu cầu quyền truy cập vào Media CDN.

3. Thiết lập và yêu cầu

Khởi động Cloud Shell

Mặc dù có thể vận hành Google Cloud từ xa trên máy tính xách tay, nhưng trong lớp học lập trình này, bạn sẽ sử dụng Google Cloud Shell, một môi trường dòng lệnh chạy trên Cloud.

Trên Bảng điều khiển Google Cloud, hãy nhấp vào biểu tượng Cloud Shell trên thanh công cụ ở trên cùng bên phải:

55efc1aaa7a4d3ad.png

Quá trình này chỉ mất vài phút để cung cấp và kết nối với môi trường. Khi quá trình này kết thúc, bạn sẽ thấy như sau:

7ffe5cbb04455448.png

Máy ảo này được trang bị tất cả các công cụ phát triển mà bạn cần. Nó cung cấp một thư mục chính có dung lượng 5 GB và chạy trên Google Cloud, giúp tăng cường đáng kể hiệu suất mạng và hoạt động xác thực. Bạn có thể thực hiện mọi thao tác trong lớp học lập trình này trong trình duyệt. Bạn không cần cài đặt bất cứ thứ gì.

4. Phiên bản Google Cloud SDK

Tại thời điểm viết bài này, 408.0.0 là phiên bản Google Cloud SDK mới nhất. Tất cả các lệnh trong lớp học này đều được kiểm thử bằng phiên bản mới nhất của Google Cloud SDK. Trước khi tiếp tục, vui lòng đảm bảo rằng Cloud Shell đang sử dụng phiên bản SDK mới nhất.

Kiểm tra phiên bản SDK

Chúng ta sẽ dùng lệnh gcloud version để kiểm tra phiên bản SDK.

Lệnh

gcloud version | grep "Google Cloud SDK"

Ví dụ về kết quả đầu ra

Google Cloud SDK 408.0.0

Các bước tiếp theo

  1. Nếu phiên bản SDK là 408.0.0 trở lên, hãy chuyển sang phần tiếp theo.
  2. Nếu phiên bản SDK thấp hơn 408.0.0, hãy chạy lệnh được liệt kê bên dưới để cập nhật SDK.
sudo apt-get update && sudo apt-get install google-cloud-sdk

5. Điều kiện tiên quyết

Trước khi bắt đầu định cấu hình các tài nguyên GCP, chúng ta cần làm những việc sau:

  1. Thiết lập các biến môi trường
  2. Bật các API dịch vụ bắt buộc

1. Thiết lập các biến môi trường

Trong suốt lớp học lập trình này, chúng ta sẽ chạy các lệnh gcloudcurl với một số biến. Chúng ta cần định cấu hình các biến môi trường sau.

  • Mã dự án
  • Mã số dự án
  • Tên Người Dùng
  • Khu vực
  • Mã nhận dạng đầu vào
  • ID kênh

Mã dự án và tên người dùng

Các biến môi trường này thường được định cấu hình sẵn trong Cloud Shell. Chúng ta sẽ dùng lệnh env để xác minh.

Lệnh

env | grep -E 'DEVSHELL_PROJECT_ID=|LOGNAME'

Ví dụ về kết quả đầu ra

DEVSHELL_PROJECT_ID=<YOUR_PROJECT_ID>
LOGNAME=<YOUR_USERNAME>

Tạo tệp env_variables

Dùng lệnh cat để tạo tệp env_variables.txt. Lệnh bên dưới sẽ tạo tệp env_variables.txt trong thư mục gốc của người dùng.

Lệnh

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

Thiết lập các biến môi trường

Chúng ta sẽ dùng lệnh source để thiết lập các biến môi trường

Lệnh

source ~/env_variables.txt

Xác minh rằng các biến đã được đặt

Hãy xác minh rằng bạn đã đặt tất cả các biến môi trường bắt buộc. Chúng ta sẽ thấy tổng cộng 6 biến môi trường trong đầu ra.

Lệnh

env | grep -E 'DEVSHELL_PROJECT_ID=|LOGNAME|PROJECT_NUMBER|LOCATION|INPUT_ID|CHANNEL_ID'

Ví dụ về kết quả đầu ra

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. Bật các API dịch vụ bắt buộc

Chúng ta cần đảm bảo rằng các API sau được bật trong dự án của mình.

  • API Dịch vụ mạng
  • Certificate Manager API
  • Livestream API
  • Media CDN Edge Cache API

Bật Network Services API

Để bật Network Services API, hãy chạy lệnh sau:

Lệnh

gcloud services enable networkservices.googleapis.com

Bật Certificate Manager API

Để bật Certificate Manager API, hãy chạy lệnh sau:

Lệnh

gcloud services enable certificatemanager.googleapis.com

Bật Live Stream API

Để bật Live Stream API, hãy chạy lệnh sau:

Lệnh

gcloud services enable livestream.googleapis.com

Bật Media CDN Edge Cache API

Để bật Media CDN Edge Cache API, hãy chạy lệnh sau:

Lệnh

gcloud services enable edgecache.googleapis.com

Xác minh rằng bạn đã bật các API

Chạy lệnh gcloud services list để liệt kê tất cả các API đã bật. Chúng ta sẽ thấy 4 API trong đầu ra.

Lệnh

gcloud services list | grep -E 'networkservices|certificatemanager|livestream|edgecache'

Ví dụ về kết quả đầu ra

NAME: certificatemanager.googleapis.com
NAME: livestream.googleapis.com
NAME: networkservices.googleapis.com
NAME: edgecache.googleapis.com

6. Tạo bộ chứa Cloud Storage

Trong phần này, chúng ta sẽ làm những việc sau:

  1. Tạo bộ chứa Cloud Storage
  2. Cho phép truy cập công khai vào nhóm

Sau này trong phòng thí nghiệm, chúng ta sẽ dùng vùng lưu trữ này để lưu trữ các tệp video được chuyển mã. Nhóm này cũng sẽ đóng vai trò là bộ nhớ nguồn cho dịch vụ Media CDN.

1. Tạo vùng chứa

Chúng ta sẽ dùng lệnh gsutil mb để tạo nhóm:

Lệnh

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

2. Đặt thùng thành có thể truy cập công khai

Chúng ta sẽ dùng lệnh gsutil iam để cung cấp công khai các tệp:

Lệnh

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

7. Thiết lập môi trường Live Streaming API

Các thành phần của chuỗi Live Streaming API được thiết kế như sau:

96b5d26aedeb89a6.png

Chúng ta đã tạo bộ chứa Cloud Storage live-streaming-storage-$LOGNAME ở phần trước. Trong hai phần tiếp theo, chúng ta sẽ tạo các tài nguyên sau:

  • Đầu vào phát trực tiếp: Điểm cuối đầu vào là điểm cuối mà bộ mã hoá gửi luồng đầu vào đến. Bạn có thể sử dụng điểm cuối đầu vào để chỉ định cấu hình cho luồng phát, chẳng hạn như độ phân giải đầu vào, loại đầu vào và việc cắt video.
  • Kênh phát trực tiếp: Kênh là một tài nguyên truyền dẫn luồng đầu vào thông qua một điểm cuối đầu vào, chuyển mã luồng đầu vào thành nhiều phiên bản và xuất bản luồng phát trực tiếp đầu ra ở một số định dạng tại vị trí được chỉ định. Bạn có thể thêm một luồng đầu vào chính và một luồng đầu vào dự phòng vào cùng một kênh.

Chúng ta sẽ tạo các tài nguyên sau ở phần sau của phòng thí nghiệm:

  • Bộ mã hoá: Bộ mã hoá là một chương trình dùng để gửi luồng đầu vào. Trong phòng thí nghiệm này, chúng ta sẽ sử dụng FFmpeg.

8. Tạo và định cấu hình điểm cuối đầu vào

Tạo tệp input.json

Chúng tôi sẽ tạo một tệp input.json để chỉ định loại tín hiệu phát trực tiếp. Trong phòng thí nghiệm này, chúng ta sẽ sử dụng tín hiệu phát trực tiếp RTMP.

Lệnh

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

Tạo Điểm cuối đầu vào

Tại thời điểm viết hướng dẫn này, chưa có dịch vụ gcloud hỗ trợ Live Stream API. Chúng ta sẽ sử dụng lệnh curl để thực hiện các lệnh gọi API.

Lệnh

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"

Ví dụ về kết quả đầu ra

{
  "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
}

Đầu ra có nhiều thông tin hữu ích, nhưng tại thời điểm này, chúng ta cần tập trung vào 2 trường:

  • Mã thao tác: Sao chép và ghi lại mã thao tác từ đầu ra. Dưới đây là mã thao tác trong ví dụ về đầu ra. Bạn có thể thấy thông tin này trên dòng đầu ra bắt đầu bằng "name". "operation-1661405972853-5e70a38d6f27f-79100d00-310671b4"
  • Trạng thái: Chúng ta cần đợi trạng thái thay đổi từ "done": false thành "done": true

Kiểm tra trạng thái

Trước khi tiếp tục, chúng ta cần kiểm tra để đảm bảo rằng điểm cuối đầu vào đã được tạo thành công và sẵn sàng.

Trong lệnh bên dưới, hãy thay thế <OPERATION> bằng mã nhận dạng của Thao tác mà chúng ta vừa nhận được ở trên. Trong ví dụ này, đó là "operation-1661405972853-5e70a38d6f27f-79100d00-310671b4".

Lệnh

export OPERATION_ID_1=<OPERATION>

Lệnh

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"

Ví dụ về kết quả đầu ra

{
  "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"
  }
}

Chạy lại lệnh cho đến khi bạn thấy "done:true" cho biết Điểm cuối đầu vào đã được tạo và sẵn sàng.

Lưu URI

Chúng ta sẽ sử dụng URI từ đầu ra trước đó ở phần sau của lớp học. Lúc này, hãy đặt một biến môi trường cho URI.

Lệnh

export URI=<uri>

Thay thế <uri> bằng URI mà bạn vừa ghi lại ở trên. Nếu muốn, bạn cũng có thể sử dụng phương thức GET để truy xuất URI

Lệnh

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. Tạo và định cấu hình kênh phát trực tiếp

Hãy tạo Kênh phát trực tiếp, được liên kết với điểm cuối đầu vào mà chúng ta vừa tạo ở phần trước. Ví dụ sau đây tạo một kênh tạo luồng phát trực tiếp HLS bao gồm một bản kết xuất duy nhất có độ phân giải cao (1280x720). Kênh này sẽ được liên kết với điểm cuối đầu vào và vùng lưu trữ mà chúng ta đã tạo trước đó.

Tạo tệp channel.json

Trong cửa sổ dòng lệnh Cloud Shell, hãy nhập lệnh sau để tạo tệp "channel.json":

Lệnh

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

Tạo kênh

Chạy lệnh curl sau đây để tạo Kênh:

Lệnh

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"

Ví dụ về kết quả đầu ra

{
  "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
}

Ghi lại và sao chép mã thao tác. Chúng ta sẽ cần đến khoá này ở một trong các bước tiếp theo. Bạn có thể thấy thông tin này trên dòng đầu ra bắt đầu bằng "name".

Kiểm tra trạng thái

Trước khi tiếp tục, chúng tôi cần kiểm tra để đảm bảo kênh đã được tạo thành công và sẵn sàng hoạt động.

Trong lệnh bên dưới, hãy thay thế <OPERATION> bằng mã nhận dạng của Thao tác mà chúng ta vừa nhận được ở trên. Trong ví dụ này, đó là operation-1661405972853-5e70a38d6f27f-79100d00-310671b4

Lệnh

export OPERATION_ID_2=<OPERATION>

Lệnh

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"

Ví dụ về kết quả đầu ra

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

Chạy lại lệnh cho đến khi bạn thấy "done:true" cho biết Điểm cuối đầu vào đã được tạo và sẵn sàng.

Xin lưu ý rằng "streamingState" hiện là "STOPPED" ; chúng ta sẽ bắt đầu kênh trong phần tiếp theo.

10. Bắt đầu kênh phát trực tiếp

Giờ đây, sau khi tạo kênh phát trực tiếp, hãy bắt đầu kênh đó. Trong phần này, chúng ta sẽ làm những việc sau:

  1. Bắt đầu kênh Phát trực tiếp
  2. Kiểm tra trạng thái của kênh, chúng ta cần đảm bảo rằng streamingState"AWAITING INPUT"

1. Bắt đầu kênh

Trong Cloud Shell, hãy chạy lệnh curl sau đây để bắt đầu kênh:

Lệnh

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"

Ví dụ về kết quả đầu ra

{
  "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. Kiểm tra trạng thái của kênh

Chạy lệnh curl sau đây để xem trạng thái của Kênh:

Lệnh

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"

Ví dụ về kết quả đầu ra

"streamingState": "AWAITING_INPUT",

Chạy lại lệnh cho đến khi bạn thấy "AWAITING_INPUT" cho biết Kênh đang chạy và sẵn sàng nhận tín hiệu.

11. Định cấu hình Media CDN

Trong phần này, chúng ta sẽ triển khai Media CDN – cơ sở hạ tầng CDN. Chúng ta sẽ tạo các tài nguyên sau:

  1. Nguồn gốc của bộ nhớ đệm biên
  2. Dịch vụ bộ nhớ đệm biên

1. Tạo Edge Cache Origin

Nguồn gốc của bộ nhớ đệm biên đại diện cho một vị trí nội dung, chẳng hạn như bộ chứa Cloud Storage, vị trí lưu trữ của bên thứ ba hoặc bộ cân bằng tải. Theo thuật ngữ CDN, nguồn (hoặc máy chủ gốc) là vị trí chứa nguồn nội dung mà chúng ta muốn phân phối – ví dụ: tất cả CSS, Javascript, HTML, hình ảnh, v.v. Trong phòng thí nghiệm này, chúng ta sẽ tạo một nguồn ánh xạ đến vùng chứa Cloud Storage mà chúng ta đã tạo ở phần đầu của phòng thí nghiệm. Chúng ta sẽ gọi đó là Nguồn bộ nhớ đệm biên cme-origin. Nguồn gốc của CDN là nơi lưu trữ tất cả nội dung nguồn trước khi được phân phối đến các máy chủ bộ nhớ đệm biên.

Chúng ta sẽ dùng lệnh gcloud edge-cache origins create để tạo nguồn gốc. Lệnh này sẽ mất vài phút để hoàn tất.

Lệnh

gcloud edge-cache origins create cme-origin \
--origin-address="gs://live-streaming-storage-$LOGNAME"

Ví dụ về kết quả

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. Tạo một Dịch vụ lưu vào bộ nhớ đệm biên

Giờ đây, khi đã thiết lập Nguồn bộ nhớ đệm biên, chúng ta có thể tạo chính Dịch vụ bộ nhớ đệm biên.

Tạo tệp cme-demo.yaml

Bạn có thể định cấu hình Dịch vụ lưu vào bộ nhớ đệm biên thông qua tệp YAML. Trong Cloud Shell, hãy tạo một tệp cục bộ có tên là cme-demo.yaml. Sử dụng vi, nano hoặc bất kỳ trình chỉnh sửa nào khác và dán các dòng sau vào tệp 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

Chúng ta sẽ giữ nguyên tất cả các chế độ cài đặt mặc định cho cấu hình Edge Cache Service. Trong tệp ở trên, có 3 giá trị trường mà người dùng có thể muốn cập nhật:

  • name: tên của phiên bản Media CDN – ở đây là: cme-demo
  • hosts: danh sách tên miền sẽ được Dịch vụ CDN Media này phân giải – tại đây: demo.cme.com. Chúng ta sẽ sử dụng tính năng này trong bản minh hoạ này. Chúng tôi sẽ sử dụng địa chỉ IP của phiên bản Media CDN.
  • Origin: đây là Edge Cache Origin mà chúng ta vừa tạo ở bước trước. Đặt giá trị này thành cme-origin – tên của Nguồn CDN cho nội dung nghe nhìn.

Để biết thêm thông tin về các biến số mà bạn có thể sử dụng trong tệp YAML, hãy xem hướng dẫn định cấu hình Dịch vụ bộ nhớ đệm biên.

Tạo Dịch vụ bộ nhớ đệm biên

Chúng ta sẽ tạo một Edge Cache Service có tên là cme-demo, trên Edge Cache Origin cme-origin, với máy chủ lưu trữ demo.cme.com. Để tạo dịch vụ, hãy chạy lệnh sau trong Cloud Shell:

Lệnh

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

Có thể mất vài phút để tạo Edge Cache Service.

Ví dụ về kết quả đầu ra

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'

Ghi lại và sao chép ipv4Addresses của phiên bản Edge Cache Service – ở đây là 34.104.36.157. Chúng ta sẽ dùng tệp này để cập nhật tệp cme-demo.yaml và sau đó để phát trực tuyến video đã chuyển mã.

Cập nhật Dịch vụ bộ nhớ đệm biên

Tại thời điểm này, bạn nên cập nhật cấu hình Edge Cache Service để có thể sử dụng IP của dịch vụ này để phát trực tuyến video sau này. Tệp YAML của Dịch vụ lưu vào bộ nhớ đệm biên cho phép chúng tôi liệt kê tất cả tên/địa chỉ IP của máy chủ lưu trữ mà Dịch vụ lưu vào bộ nhớ đệm biên sẽ chấp nhận yêu cầu. Tại thời điểm này, chúng ta chỉ định demo.cme.com làm máy chủ lưu trữ. Để cung cấp tính năng phân giải tên cho miền này, bạn có thể định cấu hình một vùng DNS. Tuy nhiên, giải pháp dễ dàng hơn là thêm địa chỉ IP vào danh sách máy chủ lưu trữ trong tệp yaml. Chỉnh sửa lại tệp YAML sao cho giống như tệp bên dưới:

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

Để các thay đổi có hiệu lực, chúng ta chỉ cần nhập lại tệp YAML. Trong thiết bị đầu cuối Cloud Shell, hãy chạy lệnh sau:

Lệnh

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

Kiểm tra đầu ra của lệnh và xác minh rằng IP xuất hiện trong danh sách máy chủ lưu trữ.

Tại thời điểm này, phiên bản Edge Cache Service sẽ chấp nhận các yêu cầu có "demo.cme.com" hoặc địa chỉ IP làm máy chủ lưu trữ.

12. Tạo tín hiệu đầu vào

Giờ đây, chúng ta đã định cấu hình tất cả các dịch vụ cần thiết, hãy tạo tín hiệu đầu vào của sự kiện phát trực tiếp. Trong phần này, chúng ta sẽ làm những việc sau:

  1. Cài đặt FFmpeg, một phần mềm mã nguồn mở miễn phí
  2. Gửi tín hiệu kiểm thử trực tiếp đến Đầu vào/Kênh

1. Cài đặt FFmpeg

FFmpeg là một dự án phần mềm mã nguồn mở và miễn phí, bao gồm một bộ thư viện và chương trình để xử lý video, âm thanh và các tệp cũng như luồng đa phương tiện khác. Trong cửa sổ dòng lệnh Cloud Shell, hãy dùng lệnh sau để cài đặt FFmpeg:

Lệnh

sudo apt install ffmpeg -y

Khi quá trình cài đặt hoàn tất, hãy xác minh xem FFmpeg đã được cài đặt đúng cách hay chưa bằng cách kiểm tra phiên bản của FFmpeg:

Lệnh

ffmpeg -version

Ví dụ về kết quả đầu ra

ffmpeg version 4.3.4-0+deb11u1 Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 10 (Debian 10.2.1-6)
...

FFmpeg đã được cài đặt đúng cách.

2. Bắt đầu Tín hiệu phát trực tiếp đến đầu vào/kênh

Sau khi cài đặt FFmpeg, chúng ta sẽ gửi một luồng đầu vào thử nghiệm đến điểm cuối đầu vào để tạo sự kiện phát trực tiếp.

Trong thiết bị đầu cuối Cloud Shell, hãy chạy lệnh sau bằng cách sử dụng biến môi trường URI mà chúng ta đã tạo trong phần "Tạo và định cấu hình điểm cuối đầu vào".

Lệnh

ffmpeg -re -f lavfi -i "testsrc=size=1280x720 [out0]; sine=frequency=500 [out1]" \
  -acodec aac -vcodec h264 -f flv $URI

Bạn sẽ thấy FFmpeg gửi tín hiệu kiểm thử trực tiếp. Lệnh này sẽ không trả về lời nhắc. Tín hiệu sẽ được tạo cho đến khi bạn dừng. Bạn sẽ cần mở một cửa sổ Cloud Shell mới cho phần còn lại của bài thực hành.

13. Mở Cloud Shell mới

Tại thời điểm này, bạn sẽ cần mở một cửa sổ Cloud Shell mới để tiếp tục thực hành vì FFmpeg sẽ chạy vĩnh viễn cho đến khi bạn nhấn tổ hợp phím <CTRL+C> để dừng lệnh này và do đó dừng quá trình tạo tín hiệu trực tiếp.

Nhấp vào dấu "+" bên cạnh tên của thiết bị đầu cuối Cloud Shell hiện tại. Thao tác này sẽ mở một cửa sổ Cloud Shell khác.

b3c7b0be6276c194.png

Chạy phần còn lại của bài thực hành trong cửa sổ Cloud Shell vừa mở.

Thiết lập các biến môi trường

Vì đây là một Cloud Shell mới, nên chúng ta cần thiết lập lại các biến môi trường. Chúng ta sẽ dùng lệnh source để thiết lập các biến môi trường.

Lệnh

source ~/env_variables.txt

Xác minh rằng các biến đã được đặt

Hãy xác minh rằng bạn đã đặt tất cả các biến môi trường bắt buộc. Chúng ta sẽ thấy tổng cộng 6 biến môi trường trong đầu ra.

Lệnh

env | grep -E 'DEVSHELL_PROJECT_ID=|LOGNAME|PROJECT_NUMBER|LOCATION|INPUT_ID|CHANNEL_ID'

Ví dụ về kết quả đầu ra

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. Xác minh rằng tín hiệu phát trực tiếp đang được chuyển mã

Chúng tôi sẽ chạy curl để mô tả kênh. Trong đầu ra, chúng ta sẽ thấy streamingState thay đổi từ "AWAITING_INPUT" thành "STREAMING"

Lệnh

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"

Trong phản hồi của tệp JSON đầu ra, bạn sẽ thấy "streamingState": "STREAMING" – cho biết Kênh đang phát trực tiếp và tín hiệu trực tiếp đang được chuyển mã.

Hãy xác minh nội dung của nhóm mà chúng ta sẽ thấy một tệp kê khai và một số phân đoạn video TS. Chạy lệnh sau trong Cloud Shell để liệt kê nội dung của vùng chứa mà chúng ta đã tạo ở đầu phòng thí nghiệm và được Live Streaming API dùng để xuất tệp kê khai tín hiệu trực tiếp được chuyển mã và các phân đoạn video TS:

Lệnh

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

Ví dụ về kết quả đầu ra

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
...

Bạn sẽ thấy:

  • tệp kê khai HLS: main.m3u8
  • Các đoạn video TS tương ứng: một loạt tệp được đánh số segment-000000000X.ts

Đến đây, chúng ta đã hoàn thành những việc sau:

  • API Phát trực tiếp: tín hiệu trực tiếp được tạo và chuyển mã thành một nhóm thông qua API Phát trực tiếp
  • Media CDN: Media CDN được định cấu hình với vùng lưu trữ Phát trực tiếp làm nguồn của Media CDN.

Trong các phần tiếp theo, chúng ta sẽ xác thực Dịch vụ lưu vào bộ nhớ đệm biên, sau đó phát trực tuyến video được chuyển mã bằng địa chỉ IP truyền tin đơn đến nhiều của Media CDN.

15. Xác minh rằng phiên bản Edge Cache Service hoạt động

Trong phần này, chúng ta sẽ xác minh rằng phiên bản Dịch vụ lưu vào bộ nhớ đệm biên hoạt động như mong đợi. Để làm việc này, chúng ta sẽ cố gắng truy cập vào một tệp từ thực thể Edge Cache Service bằng địa chỉ IP của Edge Cache Service. Lần đầu tiên một đối tượng được truy cập, đối tượng đó chưa được lưu vào bộ nhớ đệm. Chúng ta nên quan sát một bộ nhớ đệm MISS. Đối với yêu cầu đầu tiên, đối tượng sẽ được đọc từ nguồn và lưu vào bộ nhớ đệm ở rìa. Tất cả các lần truy cập vào cùng một tệp sau đây sẽ trả về một HIT trong bộ nhớ đệm vì đối tượng hiện được lưu vào bộ nhớ đệm ở rìa. Hãy xác minh hành vi này:

Chạy lệnh curl sau đây trong Cloud Shell để truy cập vào tệp kê khai video được chuyển mã và lưu trữ trong Nguồn bộ nhớ đệm biên:

Lệnh

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

Lưu ý đến quá trình phân giải nơi chúng ta sử dụng địa chỉ IP của phiên bản Dịch vụ lưu vào bộ nhớ đệm biên để phân giải tên của phiên bản đó. Hãy nhớ sử dụng demo.cme.com:<IP>, trong đó IP là IP của phiên bản Dịch vụ bộ nhớ đệm biên mà chúng ta vừa tạo.

Tìm tiêu đề x-cache-status trong đầu ra.

Ví dụ về kết quả đầu ra

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

Lưu ý rằng không tìm thấy trong bộ nhớ đệm vì đối tượng chưa được lưu vào bộ nhớ đệm và được đọc từ nguồn.

Giờ đây, chúng ta sẽ thực hiện nhiều yêu cầu cho tệp m3u8 và nếu mọi thứ được định cấu hình chính xác, thì CDN đa phương tiện sẽ bắt đầu phân phát nội dung từ bộ nhớ đệm của CDN. Lệnh dưới đây sẽ tạo 10 yêu cầu curl và chỉ in tiêu đề x-cache-status.

Lệnh

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

Kết quả đầu ra phải là sự kết hợp giữa bộ nhớ đệm hitmiss. Nếu bạn thấy lượt truy cập vào bộ nhớ đệm trong kết quả đầu ra, thì tức là Media CDN đang hoạt động như dự kiến.

Ví dụ về kết quả đầu ra

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

Lưu ý lượt truy cập vào bộ nhớ đệm vì đối tượng hiện được lưu vào bộ nhớ đệm ở rìa. Cloud Media Edge Service đang hoạt động như dự kiến.

16. Phát trực tuyến video tín hiệu trực tiếp được chuyển mã bằng VLC

Đây là phần mà chúng ta sẽ kết nối các điểm và liên kết tất cả các bước mà chúng ta đã thực hiện cho đến nay:

  • Chúng tôi đã tạo một vùng lưu trữ có tên là live-streaming-storage-$LOGNAME. Vùng lưu trữ này nhận kết quả của tín hiệu trực tiếp được chuyển mã thành nội dung HLS bằng Live Streaming API.
  • Chúng tôi thiết lập Live Streaming API.
  • Chúng tôi đã bắt đầu một tín hiệu phát trực tiếp RTMP bằng FFmpeg để cung cấp dữ liệu đầu vào cho API Phát trực tiếp/Kênh.
  • Chúng tôi đã xác minh rằng tín hiệu phát trực tiếp được truyền đến Kênh và xác minh rằng Kênh đang ở chế độ streaming.
  • Chúng tôi đã xác minh rằng các tệp được chuyển mã (tệp kê khai + phân đoạn TS) đã được tạo và lưu trữ trong nhóm live-streaming-storage-$LOGNAME.
  • Một Nguồn bộ nhớ đệm biên có tên là cme-origin được thiết lập với bộ chứa GCS live-streaming-storage-$LOGNAME làm nguồn.
  • Một phiên bản Bộ nhớ đệm biên có tên là cme-demo được thiết lập với cme-origin làm nguồn gốc.
  • Chúng tôi đã xác minh hành vi (thiếu bộ nhớ đệm, kết quả tìm kiếm trong bộ nhớ cache) của phiên bản Edge Cache Service.

Giờ đây, chúng ta có thể sử dụng trình phát video để phát trực tuyến tín hiệu trực tiếp đã chuyển mã thông qua bộ nhớ đệm Media CDN. Để làm việc này, chúng ta sẽ dùng Trình phát VLC. VLC Player là một trình phát và khung đa phương tiện nguồn mở và miễn phí, có thể phát hầu hết các tệp đa phương tiện. Trình phát này phát các định dạng nội dung đa phương tiện thích ứng (chẳng hạn như DASH và HLS). Trình phát này sử dụng nguyên tắc Phát trực tuyến thích ứng – tuỳ theo chất lượng kết nối mạng và băng thông có sẵn, trình phát sẽ điều chỉnh chất lượng của video được phát. Với công việc chuyển mã mà chúng ta vừa thực hiện, chúng ta đã sử dụng các chế độ đặt sẵn mặc định và "chỉ" tạo ra 2 chất lượng: SD và HD. Khi chúng ta bắt đầu phát video trong trình phát, bạn sẽ thấy video bắt đầu phát ở định dạng SD và nhanh chóng chuyển sang định dạng HD nếu kết nối mạng của bạn đủ tốt.

Chúng tôi sẽ phát trực tuyến tín hiệu trực tiếp đã chuyển mã HLS (định dạng video của Apple được hỗ trợ rộng rãi). Tệp tương ứng có tên là main.m3u8 – đây là tệp kê khai HLS. Tệp kê khai trỏ đến các phân đoạn video TS.

Để sử dụng VLC Player, hãy truy cập vào https://www.videolan.org/vlc/ rồi tải một phiên bản của trình phát này xuống cho hệ điều hành của máy tính xách tay. VLC có sẵn cho Windows, MacOSX, Linux, Android và iOS.

2a2d19abe728d222.png

Cài đặt Trình phát trên máy tính xách tay rồi khởi chạy. Chúng ta sẽ sử dụng phiên bản MacOSX của trình phát cho một vài bước tiếp theo.

Để phát video, hãy chuyển đến "File" (Tệp) / "Open Network" (Mở mạng):

f85565301f7c68dc.png

Thiết lập bằng:

  • URL: http://<Replace_With_Edge_Cache_IP>/main.m3u8. Đây là URL của video mà chúng ta muốn phát trực tuyến. Lưu ý:
  • IP của phiên bản Media CDN: 34.105.35.246. Thay thế bằng IP của Dịch vụ nội dung nghe nhìn trên đám mây mà bạn đã triển khai.
  • Đường dẫn đến tệp video kê khai: "/". Đây là đường dẫn mà chúng tôi đã dùng trong nhóm live-streaming-storage-$LOGNAME để lưu trữ các tệp tín hiệu trực tiếp đã chuyển mã. Đường dẫn là đường dẫn gốc ở đây: "/".
  • Tên của tệp video kê khai: tệp kê khai HLS, main.m3u8.

Sau đó, nhấp vào "Mở". Bạn sẽ thấy video trực tiếp đã chuyển mã bắt đầu phát. Video sẽ có dạng như ảnh chụp màn hình dưới đây. Bộ đếm trên màn hình sẽ tăng lên 1 đơn vị mỗi lần và bạn sẽ nghe thấy tiếng bíp liên tục.

Đây là tín hiệu phát trực tiếp cơ bản theo giao thức RTMP do FFmpeg tạo, được API Phát trực tiếp chuyển mã sang HLS và phân phát thông qua bộ nhớ đệm CDN nội dung nghe nhìn:

28fc359b49d44ec2.png

Bạn có thể sử dụng bất kỳ trình phát HLS và MPEG DASH nào khác nếu muốn. Dưới đây là một số trình phát mà bạn có thể cân nhắc:

  • Trình phát Quicktime – được cài đặt theo mặc định trên máy Mac. Tương tự: mở một kết nối mạng đến http://34.104.36.157/main.m3u8 – thay thế địa chỉ IP bằng địa chỉ IP của phiên bản Edge Cache Service.

17. Giám sát Media CDN

Nhóm SME đã tạo một mẫu trang tổng quan về Media CDN – https://gist.github.com/elithrar/1c511d00f5cd3736fb2a3897867209c1.

Để cài đặt, hãy chạy các lệnh sau trong cửa sổ Cloud Shell:

Tải tệp YAML xuống:

curl https://gist.githubusercontent.com/elithrar/1c511d00f5cd3736fb2a3897867209c1/raw/3cb70855304f29e5c06b8d63063196354db0dec3/media-edge-20210208-dashboard --output media-edge-20210208-dashboard.yaml

Tạo trang tổng quan cho Cloud Monitoring:

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

Quá trình thiết lập có thể mất vài phút. Chuyển đến Bảng điều khiển Google Cloud rồi nhấp vào biểu tượng 3 thanh > Operations (Hoạt động) > Monitoring (Giám sát) > Dashboards (Trang tổng quan). Bạn sẽ thấy một trang tổng quan có tên là "Media Edge Metrics" (Các chỉ số về Edge của nội dung nghe nhìn). Nhấp vào đó để xem các chỉ số:

d0821d84a88a928d.png

18. Dọn dẹp môi trường phòng thí nghiệm

Chúc mừng bạn đã hoàn thành bài thực hành. Trong phần này, chúng ta sẽ xoá tất cả các tài nguyên mà chúng ta đã tạo trong suốt lớp học.

Dừng tín hiệu FFmpeg:

Nhấn <CTRL+C> trên dòng lệnh Cloud Shell mà FFmpeg đang chạy.

Ngừng phát trực tiếp trên kênh:

Lệnh

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"

Xoá kênh phát trực tiếp:

Lệnh

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"

Xoá điểm cuối đầu vào của sự kiện phát trực tiếp:

Lệnh

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"

Xoá bộ chứa GCS:

Lệnh

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

Xoá phiên bản dịch vụ bộ nhớ đệm biên:

Lệnh

gcloud edge-cache services delete cme-demo

Xác nhận xoá bằng cách nhập "Y" khi được nhắc

Xoá Nguồn bộ nhớ đệm Edge:

Lệnh

gcloud edge-cache origins delete cme-origin

Xác nhận xoá bằng cách nhập "Y" khi được nhắc

Xoá Trang tổng quan tuỳ chỉnh

Lệnh

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