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 nội dung thường được truy cập vào bộ nhớ đệm gần người dùng cuối hơn, chấm dứt các kết nối gần máy khách hơn, sử dụng lại các kết nối đến nguồn gốc và thông qua việc sử dụng các giao thức kết nối mạng hiện đại và 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í giảm đi – dẫn đến doanh số bán hàng, trải nghiệm web và trải nghiệm người dùng tăng lên. Hiện nay, rất ít trang web 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

Lớp học 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 làm việc 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) + Video Player (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 API phát trực tiếp – Đầu vào, Kênh – và bắt đầu nguồn cấp dữ liệu trực tiếp đến Đầ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ủa sự kiện phát trực tiếp. Tệp kê khai và các phân đoạn video được chuyển mã sẽ được lưu trữ trong một bộ chứa trên Cloud Storage. Sau đó, chúng ta sẽ thiết lập Media CDN với bộ chứa video phát trực tiếp trên Cloud Storage làm nguồn gốc. Cuối cùng, VLC Player sẽ được dùng để phát nội dung phát 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 về Giám sát trên đám mây để trực quan hoá 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

Trong lớp học này, chúng ta sẽ thiết lập các thành phần sau và thực hiện các nhiệm vụ sau:

  • Tạo một bộ chứa Google Cloud Storage (GCS) để lưu trữ video phát trực tiếp đã chuyển mã
  • Định cấu hình API Phát trực tiếp để 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 với bộ chứa GCS làm nguồn gốc
  • Thiết lập FFmpeg để truyền dữ liệu đến kênh phát trực tiếp
  • Phát trực tuyến nguồn cấp dữ liệu phát trực tiếp đã chuyển mã bằng trình phát video
  • Thiết lập trang tổng quan Cloud Monitoring để giám sát hoạt động của CDN nội dung nghe nhìn (độ trễ, số lần truy cập vào bộ nhớ đệm, số lần không truy cập được vào bộ nhớ đệm, v.v.)

Lưu ý: Đối với lớp học 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ả 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 lớp học này 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 tài khoản của bạn. Họ có thể thay mặt bạn để tạo yêu cầu truy cập. Nếu bạn là nhân viên của Google và muốn thử nghiệm tính năng Phát trực tiếp bằng Media CDN, hãy liên hệ với Nhà quản lý sản phẩm phụ trách Media CDN để yêu cầu quyền truy cập vào Media CDN.

3. Cách thiết lập và các yêu cầu

Khởi động Cloud Shell

Mặc dù có thể điều khiển 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 đám mây.

Trong 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 cấp phép và kết nối với môi trường sẽ chỉ mất vài phút. Khi hoàn tất, bạn sẽ thấy như sau:

7ffe5cbb04455448.png

Máy ảo này được tải sẵn tất cả các công cụ phát triển mà bạn cần. Ứng dụng này cung cấp một thư mục gốc 5 GB ổn định và chạy trên Google Cloud, giúp nâng cao đáng kể hiệu suất mạng và 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 một trình duyệt. Bạn không cần cài đặt gì cả.

4. Phiên bản SDK Google Cloud

Tại thời điểm viết bài, 408.0.0 là phiên bản SDK Google Cloud 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 SDK Google Cloud. Trước khi tiếp tục, hãy đả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ẽ 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ả

Google Cloud SDK 408.0.0

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 tài nguyên GCP, chúng ta cần làm như sau:

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

1. Thiết lập 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 vài 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 Cloudshell. Chúng ta sẽ sử dụng lệnh env để xác minh.

Lệnh

env | grep -E 'DEVSHELL_PROJECT_ID=|LOGNAME'

Ví dụ về kết quả

DEVSHELL_PROJECT_ID=<YOUR_PROJECT_ID>
LOGNAME=<YOUR_USERNAME>

Tạo tệp env_variables

Sử 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 biến môi trường

Chúng ta sẽ 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 đã thiết lập 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 kết quả.

Lệnh

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

Ví dụ về kết quả

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

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

  • API Dịch vụ mạng
  • Certificate Manager API
  • API phát trực tiếp
  • Media CDN Edge Cache API

Bật API Dịch vụ mạng

Để bật API Dịch vụ mạng, hãy chạy lệnh sau:

Lệnh

gcloud services enable networkservices.googleapis.com

Bật API Trình quản lý chứng chỉ

Để bật API Trình quản lý chứng chỉ, hãy chạy lệnh sau:

Lệnh

gcloud services enable certificatemanager.googleapis.com

Bật API Luồng phát trực tiếp

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

Lệnh

gcloud services enable livestream.googleapis.com

Bật API bộ nhớ đệm Media CDN Edge

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

Lệnh

gcloud services enable edgecache.googleapis.com

Xác minh rằng các API đã được Bật

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

Lệnh

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

Ví dụ về kết quả

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. Đặt bộ chứa ở chế độ công khai

Trong phần sau của lớp học lập trình, chúng ta sẽ sử dụng bộ chứa này để lưu trữ các tệp video đã chuyển mã. Bộ chứa này cũng sẽ đóng vai trò là bộ nhớ gốc cho dịch vụ CDN nội dung nghe nhìn.

1. Tạo bộ chứa

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

Lệnh

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

2. Cho phép mọi người truy cập vào bộ chứa

Chúng ta sẽ sử dụng lệnh gsutil iam để cung cấp các tệp ở chế độ công khai:

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 API Phát trực tiếp được cấu trúc như sau:

96b5d26aedeb89a6.png

Chúng ta đã tạo bộ chứa Cloud Storage live-streaming-storage-$LOGNAME trong 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. Bạn có thể sử dụng điểm cuối đầu vào để chỉ định cấu hình cho luồng, chẳng hạn như độ phân giải đầu vào, loại đầu vào và 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 bản trình bày và phát hành sự kiện phát trực tiếp đầu ra ở một số định dạng nhất định tại vị trí đã chỉ định. Bạn có thể thêm luồng đầu vào chính và dự phòng trong cùng một kênh.

Chúng ta sẽ tạo các tài nguyên sau trong phần sau của lớp học lập trình:

  • Bộ mã hoá: Bộ mã hoá là một chương trình dùng để gửi luồng đầu vào. Trong lớp học lập trình 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 ta sẽ tạo một tệp input.json để chỉ định loại tín hiệu phát trực tiếp. Trong lớp học lập trình 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 bài này, gcloud không hỗ trợ API Luồng phát trực tiếp. Chúng ta sẽ sử dụng lệnh curl để thực hiện 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ả

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

Kết quả có rất 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 hai trường:

  • Mã thao tác: Trong kết quả, hãy sao chép và ghi lại mã thao tác. Dưới đây là mã thao tác trong ví dụ về kết quả. Bạn có thể tìm 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 chờ 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ả

{
  "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ừ kết quả trước đó trong phần sau của lớp học lập trình. Tại thời điểm 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 chú ở 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, 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 sự kiện phát trực tiếp HLS bao gồm một bản trình bày có độ phân giải cao (1280x720). Kênh sẽ được liên kết với điểm cuối đầu vào và bộ chứa bộ nhớ mà chúng ta đã tạo trước đó.

Tạo tệp channel.json

Trong 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 để 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ả

{
  "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ã hoạt động. Chúng ta sẽ cần đến nó trong một trong các bước sắp tới. Bạn có thể tìm 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 ta cần kiểm tra để đảm bảo kênh đã đượ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_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ả

  "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 tại 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ờ thì chúng ta đã tạo xong kênh Phát trực tiếp, hãy bắt đầu sử dụng kênh này. 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 để 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ả

{
  "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 để biết 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ả

"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 bộ nhớ đệm Edge
  2. Dịch vụ bộ nhớ đệm Edge

1. Tạo nguồn gốc bộ nhớ đệm Edge

Nguồn bộ nhớ đệm Edge đại diện cho một vị trí nội dung, chẳng hạn như bộ chứa trên 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 gốc (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. Đối với lớp học lập trình này, chúng ta sẽ tạo một nguồn gốc liên kết đến bộ chứa trên Cloud Storage mà chúng ta đã tạo ở đầu lớp học lập trình. Chúng ta sẽ gọi Edge Cache Origin là 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ẽ sử dụng lệnh gcloud edge-cache origins create để tạo nguồn gốc. Quá trình thực thi lệnh này sẽ mất vài phút.

Lệnh

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

Kết quả mẫu

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 Dịch vụ bộ nhớ đệm cạnh

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

Tạo tệp cme-demo.yaml

Bạn có thể định cấu hình Dịch vụ bộ nhớ đệm Edge 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 rồi 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ấu hình mặc định của Dịch vụ bộ nhớ đệm Edge. 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 thực thể Media CDN – ở đây là cme-demo
  • hosts: danh sách tên miền sẽ được Dịch vụ CDN nội dung nghe nhìn này phân giải – tại đây: demo.cme.com. Chúng ta sẽ sử dụng trong phần minh hoạ này. Chúng ta sẽ sử dụng địa chỉ IP của thực thể CDN nội dung nghe nhìn.
  • Origin: đây là Edge Cache Origin (Nguồn bộ nhớ đệm Edge) 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 Media CDN Origin.

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

Tạo Dịch vụ bộ nhớ đệm cạnh

Chúng ta sẽ tạo một Dịch vụ bộ nhớ đệm Edge có tên là cme-demo, trên Nguồn bộ nhớ đệm Edge 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 Dịch vụ bộ nhớ đệm Edge.

Ví dụ về kết quả

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'

Lưu ý và sao chép ipv4Addresses của thực thể Dịch vụ bộ nhớ đệm Edge – tại đây là 34.104.36.157. Chúng ta sẽ sử dụng tệp này để cập nhật tệp cme-demo.yaml và sau đó để truyền trực tuyến video đã chuyển mã.

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

Tại thời điểm này, bạn nên cập nhật cấu hình Dịch vụ bộ nhớ đệm Edge để 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ụ bộ nhớ đệm Edge cho phép chúng ta liệt kê tất cả tên/IP máy chủ lưu trữ mà Dịch vụ bộ nhớ đệm Edge sẽ chấp nhận yêu cầu. Tại thời điểm này, chúng ta chỉ chỉ định demo.cme.com làm máy chủ lưu trữ. Để cung cấp dịch vụ phân giải tên cho miền này, bạn có thể định cấu hình 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 và chỉnh sửa tệp đó 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

Để phản ánh các thay đổi, chúng ta chỉ cần nhập lại tệp YAML. Trong dòng lệnh 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 kết quả 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, thực thể Dịch vụ bộ nhớ đệm Edge 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, khi đã đị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 luồng 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 nguồn mở miễn phí
  2. Gửi tín hiệu phát trực tiếp thử nghiệm đến Đầu vào/Kênh

1. Cài đặt FFmpeg

FFmpeg là một dự án phần 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 cũng như các tệp và luồng đa phương tiện khác. Trong cửa sổ dòng lệnh Cloud Shell, hãy sử 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 FFmpeg đã được cài đặt đúng cách bằng cách kiểm tra phiên bản của FFmpeg:

Lệnh

ffmpeg -version

Ví dụ về kết quả

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

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

Trong dòng lệnh Cloud Shell, hãy chạy lệnh sau, 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 thử nghiệm 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 lớp học.

13. Mở Cloud Shell mới

Tại thời điểm này, bạn cần mở một cửa sổ Cloud Shell mới để tiếp tục lớp học này 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 FFmpeg và do đó dừng việc 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ở thêm một cửa sổ Cloud Shell.

b3c7b0be6276c194.png

Chạy phần còn lại của lớp học trong cửa sổ Cloud Shell mới mở.

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

Vì đây là một CloudShell 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ẽ sử dụng lệnh source để đặt 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 đã thiết lập 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 kết quả.

Lệnh

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

Ví dụ về kết quả

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

Chúng ta sẽ chạy curl để mô tả kênh. Chúng ta sẽ thấy trong kết quả rằng 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 tệp JSON đầu ra, bạn sẽ thấy "streamingState": "STREAMING" – cho biết rằng Kênh đang phát trực tuyến và tín hiệu phát trực tiếp đang được chuyển mã.

Hãy xác minh nội dung của bộ chứa, trong đó 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 bộ chứa mà chúng ta đã tạo ở đầu lớp học và được API Phát trực tiếp sử dụng để xuất tệp kê khai tín hiệu phát trực tiếp đã chuyển mã và các đoạn video TS:

Lệnh

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

Ví dụ về kết quả

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 phân đ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 tất các bước sau:

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

Trong các phần tiếp theo, chúng ta sẽ xác thực Dịch vụ bộ nhớ đệm cạnh, sau đó phát trực tuyến video đã chuyển mã bằng địa chỉ IP anycast của Media CDN.

15. Xác minh rằng thực thể Dịch vụ bộ nhớ đệm Edge hoạt động

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

Chạy lệnh curl sau trong Cloud Shell để truy cập vào tệp kê khai video được chuyển mã được lưu trữ trong Edge Cache Origin:

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 việc phân giải mà chúng ta sử dụng địa chỉ IP của thực thể Dịch vụ bộ nhớ đệm Edge để phân giải tên của thực thể đó. Hãy nhớ sử dụng demo.cme.com:<IP>, trong đó IP là IP của thực thể Dịch vụ bộ nhớ đệm Edge mà chúng ta vừa tạo.

Tìm tiêu đề x-cache-status trong kết quả.

Ví dụ về kết quả

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 bộ nhớ đệm bị thiếu vì đối tượng chưa được lưu vào bộ nhớ đệm và được đọc từ nguồn gốc.

Bây giờ, 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ì Media CDN sẽ bắt đầu phân phát nội dung từ bộ nhớ đệm. Lệnh bên dưới 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ả sẽ là kết hợp của bộ nhớ đệm hitmiss. Nếu bạn thấy các lượt truy cập vào bộ nhớ đệm trong kết quả, thì Media CDN đang hoạt động như dự kiến.

Ví dụ về kết quả

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 ở cạnh. Dịch vụ Cloud Media Edge đang hoạt động như dự kiến.

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

Đây là phần kết nối các dấu chấ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 bộ chứa có tên là live-streaming-storage-$LOGNAME để nhận kết quả của tín hiệu phát trực tiếp được chuyển mã sang nội dung HLS bằng API Phát trực tiếp.
  • Chúng ta 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/Kênh cho API Phát trực tiếp.
  • 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 + các phân đoạn TS) đã được tạo và lưu trữ trong bộ chứa live-streaming-storage-$LOGNAME.
  • Thiết lập một Điểm gốc bộ nhớ đệm Edge có tên là cme-origin với bộ chứa GCS live-streaming-storage-$LOGNAME làm điểm gốc.
  • Một thực thể Edge Cache 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 (bỏ lỡ bộ nhớ đệm, truy cập bộ nhớ đệm) của thực thể Dịch vụ bộ nhớ đệm Edge.

Bây giờ, chúng ta có thể sử dụng trình phát video để truyền trực tuyến tín hiệu phát trực tiếp đã chuyển mã qua bộ nhớ đệm Media CDN. Để làm việc này, chúng ta sẽ sử dụng VLC Player. Trình phát VLC là một trình phát và khung đa phương tiện nguồn mở và miễn phí trên nhiều nền tảng, 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 – 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 giá trị đặt trước mặc định và "chỉ" tạo ra hai 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ẽ truyền trực tuyến tín hiệu phát trực tiếp đã chuyển mã HLS (định dạng video được Apple 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 Trình phát VLC, hãy truy cập vào https://www.videolan.org/vlc/ và tải phiên bản trình phát 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 chạy trình phát. Chúng ta sẽ sử dụng phiên bản MacOSX của trình phát trong vài bước tiếp theo.

Để phát video, hãy chuyển đến mục "Tệp" / "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 chúng tôi sử dụng trong bộ chứa live-streaming-storage-$LOGNAME để lưu trữ các tệp tín hiệu phát trực tiếp đã chuyển mã. Đường dẫn ở đây là đường dẫn gốc: "/".
  • 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 phát trực tiếp đã được 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ẽ chạy theo từng bước 1 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 kiểm thử RTMP cơ bản do FFmpeg tạo, được Live Streaming API chuyển mã sang HLS và phân phát qua bộ nhớ đệm Media CDN:

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 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ở kết nối mạng đến http://34.104.36.157/main.m3u8 – thay thế địa chỉ IP bằng một trong các phiên bản Dịch vụ bộ nhớ đệm Edge.

17. Giám sát Media CDN

Nhóm SME đã tạo một mẫu trang tổng quan về CDN nội dung nghe nhìn – 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 Google Cloud Console rồi nhấp vào biểu tượng 3 thanh > Hoạt động > Giám sát > Trang tổng quan. Bạn sẽ thấy một trang tổng quan có tên "Chỉ số về cạnh 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 thử nghiệm

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

Dừng tín hiệu FFmpeg:

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

Dừ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 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á thực thể Dịch vụ bộ nhớ đệm Edge:

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