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 はライブ テスト信号を生成できます)。Live Streaming API はライブフィードをコード変換します。トランスコードされた動画のマニフェストとセグメントは、Cloud Storage バケットに保存されます。次に、ライブ動画の Cloud Storage バケットを送信元として Media CDN を設定します。最後に、VLC Player を使用して、Media CDN 経由でキャッシュに保存されたライブ コンテンツを再生します。また、Cloud Monitoring ダッシュボードを設定して、Media CDN のアクティビティを可視化します。
作成するアプリの概要
このラボでは、次のアーキテクチャに基づいて環境を設定します。

このラボでは、次のコンポーネントを設定し、次のタスクを実行します。
- ライブ トランスコードされた動画を保存するための Google Cloud Storage(GCS)バケットを作成する
- 動画を複数の形式(HLS + MPEG DASH、SD、HD)にコード変換するように Live Streaming API を構成する
- ライブ配信コンポーネントを設定する: 入力/チャンネル
- ライブ ストリーム チャネルを開始する
- GCS バケットを送信元として Media CDN を設定する
- ライブ チャンネルにフィードするよう FFmpeg を設定する
- コード変換されたライブフィードを動画プレーヤーでストリーミングする
- Cloud Monitoring ダッシュボードを設定して、Media CDN アクティビティ(レイテンシ、キャッシュ ヒット、キャッシュミスなど)をモニタリングする
注: このラボでは、ユーザーが Google Cloud コンソールにアクセスでき、プロジェクトがすでに設定されていることを前提としています。また、ユーザーは新しい環境から開始し、このデモ用に何も設定していないことを前提としています。
すべての構成アクションは、Cloud Shell のコマンドラインから行います。コマンドラインで構成されたコンポーネントは、コンソールでいつでも確認できます。このラボでは、Google Cloud コンソールを指すポインタが表示されます。
2. 始める前に
Media CDN へのアクセスは制限されています。Media CDN を利用するには、アカウント チームにお問い合わせください。お客様に代わってアクセス リクエストを作成できます。Google の社員で、Media CDN を使用してライブ ストリーミングをテストする場合は、Media CDN の PM に連絡して Media CDN へのアクセスをリクエストしてください。
3. 設定と要件
Cloud Shell の起動
Google Cloud はノートパソコンからリモートで操作できますが、この Codelab では、Google Cloud Shell(Cloud 上で動作するコマンドライン環境)を使用します。
Google Cloud Console で、右上のツールバーにある 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 リソースの構成を開始する前に、次の操作を行う必要があります。
- 環境変数を設定する
- 必要なサービス API を有効にする
1. 環境変数を設定する
このラボでは、いくつかの変数を使用して gcloud コマンドと curl コマンドを実行します。次の環境変数を構成する必要があります。
- プロジェクト ID
- プロジェクト番号
- ユーザー名
- 地域
- 入力 ID
- チャンネル ID
プロジェクト ID とユーザー名
これらの環境変数は通常、Cloud Shell で事前構成されています。env コマンドを使用して確認します。
コマンド
env | grep -E 'DEVSHELL_PROJECT_ID=|LOGNAME'
出力例
DEVSHELL_PROJECT_ID=<YOUR_PROJECT_ID> LOGNAME=<YOUR_USERNAME>
env_variables ファイルを作成する
cat コマンドを使用して env_variables.txt ファイルを作成します。次のコマンドを実行すると、ユーザーのホーム ディレクトリに env_variables.txt ファイルが作成されます。
コマンド
cat > ~/env_variables.txt << EOF export PROJECT_NUMBER=$(gcloud projects describe $GOOGLE_CLOUD_PROJECT --format="value(projectNumber)") export LOCATION=us-west2 export INPUT_ID=lab-live-input export CHANNEL_ID=lab-live-channel EOF
環境変数を設定する
source コマンドを使用して環境変数を設定します。
コマンド
source ~/env_variables.txt
変数が設定されていることを確認する
必要な環境変数がすべて設定されていることを確認しましょう。出力には合計 6 個の環境変数が表示されます。
コマンド
env | grep -E 'DEVSHELL_PROJECT_ID=|LOGNAME|PROJECT_NUMBER|LOCATION|INPUT_ID|CHANNEL_ID'
出力例
LOCATION=us-west2 DEVSHELL_PROJECT_ID=<YOUR_PROJECT_ID> LOGNAME=<YOUR_USERNAME> PROJECT_NUMBER=<YOUR_PROJECT_NUMBER> INPUT_ID=lab-live-input CHANNEL_ID=lab-live-channel
2. 必要なサービス API を有効にする
プロジェクトで次の API が有効になっていることを確認する必要があります。
- Network Services API
- Certificate Manager API
- Livestream API
- Media CDN エッジ キャッシュ API
Network Services API を有効にする
Network Services API を有効にするには、次のコマンドを実行します。
コマンド
gcloud services enable networkservices.googleapis.com
Certificate Manager API を有効にする
Certificate Manager API を有効にするには、次のコマンドを実行します。
コマンド
gcloud services enable certificatemanager.googleapis.com
Live Stream API を有効にする
Live Stream API を有効にするには、次のコマンドを実行します。
コマンド
gcloud services enable livestream.googleapis.com
Media CDN Edge Cache API を有効にする
Media CDN Edge Cache API を有効にするには、次のコマンドを実行します。
コマンド
gcloud services enable edgecache.googleapis.com
API が有効になっていることを確認する
gcloud services list コマンドを実行して、有効になっているすべての API を一覧表示します。出力に 4 つの API が表示されます。
コマンド
gcloud services list | grep -E 'networkservices|certificatemanager|livestream|edgecache'
出力例
NAME: certificatemanager.googleapis.com NAME: livestream.googleapis.com NAME: networkservices.googleapis.com NAME: edgecache.googleapis.com
6. Cloud Storage バケットを作成する
このセクションでは、次のことを行います。
- Cloud Storage バケットを作成する
- バケットを一般公開にする
このラボの後半では、このバケットを使用して、コード変換された動画ファイルを保存します。このバケットは、Media CDN サービスの元のストレージとしても機能します。
1. バケットを作成する
gsutil mb コマンドを使用してバケットを作成します。
コマンド
gsutil mb gs://live-streaming-storage-$LOGNAME
2. バケットを一般公開にする
gsutil iam コマンドを使用して、ファイルを一般公開します。
コマンド
gsutil iam ch allUsers:objectViewer gs://live-streaming-storage-$LOGNAME
7. ライブ ストリーミング API 環境の設定
Live Streaming API チェーンのコンポーネントは、次のように設計されています。

前のセクションで Cloud Storage バケット live-streaming-storage-$LOGNAME を作成しました。次の 2 つのセクションでは、次のリソースを作成します。
- ライブ配信入力: 入力エンドポイントは、エンコーダが入力ストリームを送信するエンドポイントです。入力エンドポイントを使用すると、入力の解像度、入力タイプ、動画の切り抜きなど、ストリーミングの構成を指定できます。
- ライブ ストリーミング チャネル: チャネルは、入力エンドポイントを通じて入力ストリームを取り込み、入力ストリームを複数のコード変換し、特定の場所にある出力形式で特定のライブ ストリームをパブリッシュするリソースです。同じチャンネルにプライマリ入力ストリームとバックアップ入力ストリームを含めることができます。
このラボでは、次のリソースを作成します。
- エンコーダ: エンコーダは、入力ストリームの送信に使用するプログラムです。このラボでは、FFmpeg を使用します。
8. 入力エンドポイントを作成して構成する
input.json ファイルを作成する
input.json ファイルを作成して、ライブ ストリームの信号タイプを指定します。このラボでは、RTMP ライブ信号を使用します。
コマンド
cat > input.json << EOF
{
"type": "RTMP_PUSH"
}
EOF
入力エンドポイントを作成する
このラボの作成時点では、Live Stream API の gcloud サポートはありません。API 呼び出しには curl コマンドを使用します。
コマンド
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 つのフィールドに注目します。
- オペレーション ID: 出力からオペレーション ID をコピーしてメモします。出力例のオペレーション ID を次に示します。これは、
"name"で始まる出力行にあります。"operation-1661405972853-5e70a38d6f27f-79100d00-310671b4" - ステータス: ステータスが
"done": falseから"done": trueに変わるまで待つ必要があります。
ステータスを確認する
続行する前に、入力エンドポイントが正常に作成され、準備ができていることを確認する必要があります。
次のコマンドで、<OPERATION> は上記で取得したオペレーションの ID に置き換えます。この例では、"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. ライブ ストリーミング チャンネルを作成して設定する
前のセクションで作成した入力エンドポイントに関連付けられたライブ ストリーミング チャンネルを作成しましょう。次の例では、単独の高解像度(1280x720)のレンディションで構成される HLS ライブ ストリームを生成するチャネルを作成しています。チャネルは、入力エンドポイントと、先ほど作成したストレージ バケットに関連付けられます。
channel.json ファイルを作成する
Cloud Shell ターミナルで次のコマンドを入力して、"channel.json" ファイルを作成します。
コマンド
cat > channel.json << EOF
{
"inputAttachments": [
{
"key": "my-input",
"input": "projects/$PROJECT_NUMBER/locations/$LOCATION/inputs/$INPUT_ID"
}
],
"output": {
"uri": "gs://live-streaming-storage-$LOGNAME"
},
"elementaryStreams": [
{
"key": "es_video",
"videoStream": {
"h264": {
"profile": "high",
"widthPixels": 1280,
"heightPixels": 720,
"bitrateBps": 3000000,
"frameRate": 30
}
}
},
{
"key": "es_audio",
"audioStream": {
"codec": "aac",
"channelCount": 2,
"bitrateBps": 160000
}
}
],
"muxStreams": [
{
"key": "mux_video_ts",
"container": "ts",
"elementaryStreams": ["es_video", "es_audio"],
"segmentSettings": { "segmentDuration": "2s" }
}
],
"manifests": [
{
"fileName": "main.m3u8",
"type": "HLS",
"muxStreams": [
"mux_video_ts"
],
"maxSegmentCount": 5
}
]
}
EOF
チャネルを作成する
次の curl コマンドを実行して、Channel を作成します。
コマンド
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
}
オペレーション ID をメモしてコピーします。これは、今後のステップで使用します。これは、"name" で始まる出力行で確認できます。
ステータスを確認する
先に進む前に、チャンネルが正常に作成され、準備が整っていることを確認する必要があります。
次のコマンドで、<OPERATION> は上記で取得したオペレーションの ID に置き換えます。この例では、operation-1661405972853-5e70a38d6f27f-79100d00-310671b4 です。
コマンド
export OPERATION_ID_2=<OPERATION>
コマンド
curl -s -X GET \ -H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \ "https://livestream.googleapis.com/v1/projects/$PROJECT_NUMBER/locations/$LOCATION/operations/$OPERATION_ID_2"
出力例
"name": "projects/PROJECT_NUMBER/locations/us-west2/operations/operation-1668666801461-5eda4c3f31852-a4d2229f-0efeef9e",
"metadata": {
"@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata",
"createTime": "2022-11-17T06:33:21.500841488Z",
"endTime": "2022-11-17T06:33:21.529311112Z",
"target": "projects/PROJECT_NUMBER/locations/us-west2/channels/lab-live-channel",
"verb": "create",
"requestedCancellation": false,
"apiVersion": "v1"
},
"done": true,
"response": {
"@type": "type.googleapis.com/google.cloud.video.livestream.v1.Channel",
"name": "projects/PROJECT_NAME/locations/us-west2/channels/lab-live-channel",
"createTime": "2022-11-17T06:33:21.497818033Z",
"updateTime": "2022-11-17T06:33:21.497818033Z",
"activeInput": "my-input",
"output": {
"uri": "gs://live-streaming-storage-LOGNAME"
},
"elementaryStreams": [
{
"videoStream": {
"h264": {
"widthPixels": 1280,
"heightPixels": 720,
"frameRate": 30,
"bitrateBps": 3000000,
"gopDuration": "2s",
"vbvSizeBits": 3000000,
"vbvFullnessBits": 2700000,
"entropyCoder": "cabac",
"profile": "high"
}
},
"key": "es_video"
},
{
"audioStream": {
"codec": "aac",
"bitrateBps": 160000,
"channelCount": 2,
"sampleRateHertz": 48000
},
"key": "es_audio"
}
],
"muxStreams": [
{
"key": "mux_video_ts",
"container": "ts",
"elementaryStreams": [
"es_video",
"es_audio"
],
"segmentSettings": {
"segmentDuration": "2s"
}
}
],
"manifests": [
{
"fileName": "main.m3u8",
"type": "HLS",
"muxStreams": [
"mux_video_ts"
],
"maxSegmentCount": 5,
"segmentKeepDuration": "60s"
}
],
"streamingState": "STOPPED",
"inputAttachments": [
{
"key": "my-input",
"input": "projects/PROJECT_NUMBER/locations/us-west2/inputs/lab-live-input"
}
],
"logConfig": {
"logSeverity": "OFF"
}
}
}
"done:true" が表示され、入力エンドポイントが作成されて準備が整うまで、コマンドを再実行します。
現時点での "streamingState" は "STOPPED" です。次のセクションでチャネルを開始します。
10. ライブ ストリーミング チャネルを開始します。
ライブ配信チャンネルを作成したので、チャンネルを開始しましょう。このセクションでは、次のことを行います。
- ライブ配信チャンネルを開始する
- チャンネルのステータスを確認します。
streamingStateが"AWAITING INPUT"であることを確認する必要があります。
1. チャンネルを開始する
Cloud Shell で、次の curl コマンドを実行してチャネルを開始します。
コマンド
curl -X POST \ -H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \ -H "Content-Type: application/json; charset=utf-8" \ -d "" \ "https://livestream.googleapis.com/v1/projects/$PROJECT_NUMBER/locations/$LOCATION/channels/$CHANNEL_ID:start"
出力例
{
"name": "projects/PROJECT_NUMBER/locations/LOCATION/operations/operation-1661405972853-5e70a38d6f27f-79100d00-310671b4",
"metadata": {
"@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata",
"createTime": "2022-08-25T05:39:32.884030164Z",
"target": "projects/PROJECT_NUMBER/locations/us-west2/channels/lab-live-channel",
"verb": "start",
"requestedCancellation": false,
"apiVersion": "v1"
},
"done": false
}
2. チャンネルのステータスを確認する
次の curl コマンドを実行して、チャネルのステータスを取得します。
コマンド
curl -s -X GET -H "Authorization: Bearer "$(gcloud auth application-default print-access-token) "https://livestream.googleapis.com/v1/projects/$PROJECT_NUMBER/locations/$LOCATION/channels/$CHANNEL_ID" | grep "streamingState"
出力例
"streamingState": "AWAITING_INPUT",
チャンネルが実行中で、信号を受信する準備ができていることを示す「AWAITING_INPUT」が表示されるまで、コマンドを再実行します。
11. Media CDN を構成する
このセクションでは、CDN インフラストラクチャである Media CDN をデプロイします。次のリソースを作成します。
- エッジ キャッシュ オリジン
- エッジ キャッシュ サービス
1. Edge Cache Origin を作成する
Edge Cache オリジンは、Cloud Storage バケット、サードパーティのストレージ ロケーション、ロードバランサなどのコンテンツ ロケーションを表します。CDN の用語では、オリジン(またはオリジン サーバー)は、配布するコンテンツのソース(すべての CSS、JavaScript、HTML、画像など)が配置されている場所です。このラボでは、ラボの最初に作成した Cloud Storage バケットにマッピングされるオリジンを作成します。Edge Cache Origin を cme-origin とします。CDN のオリジンは、すべてのソース コンテンツがエッジ キャッシュ サーバーに配信される前に保存される場所です。
gcloud edge-cache origins create コマンドを使用して、オリジンを作成します。このコマンドが完了するまでに数分かかります。
コマンド
gcloud edge-cache origins create cme-origin \ --origin-address="gs://live-streaming-storage-$LOGNAME"
出力例
Create request issued for: cme-origin Waiting for operation [projects/my-project/locations/global/operations/operation-1612121774168-5ba3759af1919- 3fdcd7b1-99f59223] to complete...done Created origin cme-origin
2. Edge Cache Service を作成する
Edge Cache Origin を設定したので、Edge Cache Service 自体を作成できます。
cme-demo.yaml ファイルを作成する
Edge Cache Service の構成は、YAML ファイルを使用して行います。Cloud Shell で、cme-demo.yaml という名前のローカル ファイルを作成します。vi、nano などのエディタを使用して、YAML ファイルに次の行を貼り付けます。
name: cme-demo
routing:
hostRules:
- hosts:
- demo.cme.com
pathMatcher: routes
pathMatchers:
- name: routes
routeRules:
- headerAction:
responseHeadersToAdd:
- headerName: x-cache-status
headerValue: "{cdn_cache_status}"
matchRules:
- prefixMatch: /
origin: cme-origin
priority: 100
routeAction:
cdnPolicy:
cacheKeyPolicy: {}
cacheMode: FORCE_CACHE_ALL
defaultTtl: 3600s
signedRequestMode: DISABLED
- headerAction:
responseHeadersToAdd:
- headerName: x-cache-status
headerValue: "{cdn_cache_status}"
matchRules:
- pathTemplateMatch: /**.m3u8
origin: cme-origin
priority: 25
routeAction:
cdnPolicy:
cacheKeyPolicy: {}
cacheMode: FORCE_CACHE_ALL
defaultTtl: 1s
signedRequestMode: DISABLED
- headerAction: {}
matchRules:
- pathTemplateMatch: /**.ts
origin: cme-origin
priority: 50
routeAction:
cdnPolicy:
cacheKeyPolicy: {}
cacheMode: FORCE_CACHE_ALL
defaultTtl: 2s
signedRequestMode: DISABLED
Edge Cache Service の構成はすべてデフォルトのままにします。上記のファイルには、ユーザーが更新する可能性のある 3 つのフィールド値があります。
name: Media CDN インスタンスの名前(ここではcme-demo)hosts:: この Media CDN サービスによって解決されるドメイン名のリスト(ここではdemo.cme.com)。このデモでは、これを使用します。Media CDN インスタンスの IP アドレスを使用します。Origin:: 前の手順で作成した Edge Cache Origin です。cme-origin- Media CDN オリジンの名前に設定します。
YAML ファイルで使用できるさまざまな変数については、Edge Cache Service 構成ガイドをご覧ください。
Edge Cache Service を作成する
Edge Cache Origin cme-origin に、ホスト demo.cme.com を使用して cme-demo という名前の Edge Cache Service を作成します。サービスを作成するには、Cloud Shell で次のコマンドを実行します。
コマンド
gcloud edge-cache services import cme-demo \
--source=cme-demo.yaml
Edge Cache Service の作成には数分かかることがあります。
出力例
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'
Edge Cache Service インスタンスの ipv4Addresses(ここでは 34.104.36.157)をメモしてコピーします。この ID は、cme-demo.yaml ファイルの更新と、後でコード変換された動画のストリーミングに使用します。
Edge Cache Service を更新する
この時点で、後でサービスの IP を使用して動画をストリーミングできるように、Edge Cache Service の構成を更新することをおすすめします。Edge Cache Service YAML ファイルを使用すると、Edge Cache Service がリクエストを受け入れるすべてのホスト名/IP を一覧表示できます。この時点では、demo.cme.com をホストとして指定しただけです。このドメインの名前解決を行うには、DNS ゾーンを構成します。ただし、より簡単な解決策は、yaml ファイルのホストリストに IP アドレスを追加することです。YAML ファイルを再度編集し、次のように編集します。
name: cme-demo
routing:
hostRules:
- hosts:
- demo.cme.com
- IPADDRESS
pathMatcher: routes
pathMatchers:
- name: routes
routeRules:
- headerAction:
responseHeadersToAdd:
- headerName: x-cache-status
headerValue: "{cdn_cache_status}"
matchRules:
- prefixMatch: /
origin: cme-origin
priority: 100
routeAction:
cdnPolicy:
cacheKeyPolicy: {}
cacheMode: FORCE_CACHE_ALL
defaultTtl: 3600s
signedRequestMode: DISABLED
- headerAction:
responseHeadersToAdd:
- headerName: x-cache-status
headerValue: "{cdn_cache_status}"
matchRules:
- pathTemplateMatch: /**.m3u8
origin: cme-origin
priority: 25
routeAction:
cdnPolicy:
cacheKeyPolicy: {}
cacheMode: FORCE_CACHE_ALL
defaultTtl: 1s
signedRequestMode: DISABLED
- headerAction: {}
matchRules:
- pathTemplateMatch: /**.ts
origin: cme-origin
priority: 50
routeAction:
cdnPolicy:
cacheKeyPolicy: {}
cacheMode: FORCE_CACHE_ALL
defaultTtl: 2s
signedRequestMode: DISABLED
変更を反映するには、YAML ファイルを再インポートするだけです。Cloud Shell ターミナルで次のコマンドを実行します。
コマンド
gcloud edge-cache services import cme-demo \
--source=cme-demo.yaml
コマンドの出力を確認し、IP がホストのリストに表示されていることを確認します。
この時点で、Edge Cache Service インスタンスは、ホストとして "demo.cme.com" または IP アドレスのいずれかを含むリクエストを受け入れます。
12. 入力信号を生成する
必要なサービスをすべて構成したので、ライブ ストリーム入力信号を生成しましょう。このセクションでは、次のことを行います。
- 無料のオープンソース ソフトウェアである FFmpeg をインストールする
- テストライブ信号を入力/チャンネルに送信する
1. FFmpeg をインストールする
FFmpeg は、動画、音声、その他のマルチメディア ファイルとストリームを処理するためのライブラリとプログラムのスイートで構成される、無料のオープンソース ソフトウェア プロジェクトです。Cloud Shell ターミナルで、次のコマンドを使用して FFmpeg をインストールします。
コマンド
sudo apt install ffmpeg -y
インストールが完了したら、バージョンを確認して FFmpeg が正しくインストールされたことを確認します。
コマンド
ffmpeg -version
出力例
ffmpeg version 4.3.4-0+deb11u1 Copyright (c) 2000-2021 the FFmpeg developers built with gcc 10 (Debian 10.2.1-6) ...
FFmpeg が正しくインストールされている。
2. [Live Stream Signal to the Input/Channel] を開始します。
FFmpeg がインストールされたので、入力エンドポイントにテスト入力ストリームを送信してライブ ストリームを生成します。
Cloud Shell ターミナルで、次のコマンドを実行します。このとき、「入力エンドポイントを作成して構成する」セクションで作成した URI 環境変数を使用します。
コマンド
ffmpeg -re -f lavfi -i "testsrc=size=1280x720 [out0]; sine=frequency=500 [out1]" \ -acodec aac -vcodec h264 -f flv $URI
FFmpeg がテストライブ信号を送信していることがわかります。コマンドはプロンプトを返しません。シグナルは停止するまで生成されます。ラボの残りの部分では、新しい Cloud Shell ウィンドウを開く必要があります。
13. 新しい Cloud Shell を開く
この時点で、新しい Cloud Shell ウィンドウを開く必要があります。FFmpeg は、コマンドを <CTRL+C> で停止してライブ信号の生成を停止するまで永続的に実行されるため、ラボを続行するには新しい Cloud Shell ウィンドウを開く必要があります。
現在の Cloud Shell ターミナルの名前の横にある [+] 記号をクリックします。追加の Cloud Shell ウィンドウが開きます。

新しく開いた Cloud Shell ウィンドウで、残りのラボを実行します。
環境変数を設定する
これは新しい Cloud Shell であるため、環境変数を再度設定する必要があります。source コマンドを使用して環境変数を設定します。
コマンド
source ~/env_variables.txt
変数が設定されていることを確認する
必要な環境変数がすべて設定されていることを確認しましょう。出力には合計 6 個の環境変数が表示されます。
コマンド
env | grep -E 'DEVSHELL_PROJECT_ID=|LOGNAME|PROJECT_NUMBER|LOCATION|INPUT_ID|CHANNEL_ID'
出力例
LOCATION=us-west2 DEVSHELL_PROJECT_ID=<YOUR_PROJECT_ID> LOGNAME=<YOUR_USERNAME> PROJECT_NUMBER=<YOUR_PROJECT_NUMBER> INPUT_ID=lab-live-input CHANNEL_ID=lab-live-channel
14. ライブ信号がトランスコードされていることを確認する
curl を実行してチャネルを記述します。出力で、streamingState が "AWAITING_INPUT" から "STREAMING" に変更されたことを確認します。
コマンド
curl -s -X GET -H "Authorization: Bearer "$(gcloud auth application-default print-access-token) "https://livestream.googleapis.com/v1/projects/$PROJECT_NUMBER/locations/$LOCATION/channels/$CHANNEL_ID" | grep "streamingState"
出力 JSON ファイルのレスポンスに "streamingState": "STREAMING" が表示されます。これは、チャンネルがストリーミング中で、ライブ信号がトランスコードされていることを示します。
マニフェスト ファイルと複数の TS 動画セグメントが表示されるはずのバケットの内容も確認しましょう。Cloud Shell で次のコマンドを実行して、ラボの開始時に作成し、Live Streaming API がトランスコードされたライブ信号マニフェストと 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 ...
以下のように表示されます。
- HLS マニフェスト ファイル:
main.m3u8 - 対応する TS 動画セグメント: 番号付きファイル
segment-000000000X.tsのシリーズ
この時点で、次の処理が完了しています。
- Live Streaming API: ライブ信号が生成され、Live Streaming API を介してバケットにコード変換されます。
- Media CDN: Media CDN の送信元としてライブ ストリーミング ストレージ バケットを使用して Media CDN を構成しました。
次のセクションでは、Edge Cache Service を検証し、Media CDN エニーキャスト IP アドレスを使用してトランスコードされた動画をストリーミングします。
15. Edge Cache Service インスタンスが動作していることを確認する
このセクションでは、Edge Cache Service インスタンスが想定どおりに動作することを確認します。これを行うには、Edge Cache Service Service の IP アドレスを使用して、Edge Cache Service インスタンスからファイルにアクセスします。オブジェクトに初めてアクセスしたときは、まだキャッシュに保存されていません。キャッシュ MISS が表示されます。最初のリクエストでは、オブジェクトはオリジンから読み取られ、エッジでキャッシュに保存されます。同じファイルにアクセスしようとする後続の試行では、オブジェクトがエッジでキャッシュに保存されているため、キャッシュ HIT が返されます。この動作を確認してみましょう。
Cloud Shell で次の curl コマンドを実行して、Edge Cache Origin に保存されているトランスコードされた動画マニフェスト ファイルにアクセスします。
コマンド
curl -svo /dev/null --resolve demo.cme.com:80:<Replace_With_Edge_Cache_IP> \ "http://demo.cme.com/main.m3u8"
Edge Cache Service インスタンスの IP アドレスを使用して名前を解決する解決に注目してください。demo.cme.com:<IP> を使用してください。ここで、IP は作成した Edge Cache Service インスタンスの IP です。
出力で 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 はキャッシュからコンテンツの配信を開始します。次のコマンドは、10 個の curl リクエストを行い、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
オブジェクトがエッジでキャッシュに保存されたため、キャッシュ ヒットが発生していることに注目してください。Cloud Media Edge Service は想定どおりに動作しています。
16. VLC でコード変換されたライブ信号動画をストリーミングする
ここでは、これまでの手順をすべてつなぎ合わせます。
- Live Streaming API によって HLS コンテンツにコード変換されたライブ信号の結果を受け取る
live-streaming-storage-$LOGNAMEというバケットを作成しました。 - ライブ ストリーミング API を設定します。
- FFmpeg で RTMP ライブ信号を開始し、Live Streaming API の入力/チャネルにフィードしました。
- ライブ信号がチャンネルに送信されていることと、チャンネルが
streamingモードであることを確認しました。 - 変換後のファイル(マニフェスト + TS セグメント)が生成され、バケット
live-streaming-storage-$LOGNAMEに保存されていることを確認しました。 cme-originという Edge Cache Origin が、送信元として GCS バケットlive-streaming-storage-$LOGNAMEを使用して設定されました。cme-originを送信元として、cme-demoという名前の Edge Cache インスタンスが設定されました。- Edge キャッシュ サービス インスタンスの動作(キャッシュミス、キャッシュヒット)を確認しました。
これで、動画プレーヤーを使用して、Media CDN キャッシュ経由でトランスコードされたライブ信号をストリーミングできるようになりました。これを行うには、VLC Player を使用します。VLC プレーヤーは、無料でオープンソースのクロスプラットフォーム マルチメディア プレーヤーおよびフレームワークです。ほとんどのマルチメディア ファイルを再生できます。アダプティブ メディア形式(DASH や HLS など)を再生します。これは、アダプティブ ストリーミングの原理に基づいています。ネットワーク接続の品質と利用可能な帯域幅に応じて、プレーヤーは再生する動画の品質を調整します。先ほど行ったコード変換ジョブでは、デフォルトのプリセットを使用して、SD と HD の 2 つの品質のみを生成しました。プレーヤーで動画の再生を開始すると、ネットワーク接続が十分な場合は SD 形式での再生が開始され、すぐに HD 形式に切り替わります。
HLS(広くサポートされている Apple の動画形式)にトランスコードされたライブ信号を配信します。対応するファイルは main.m3u8(HLS マニフェスト)と呼ばれます。マニフェストは 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 です。注意:
- Media CDN インスタンスの IP:
34.105.35.246。デプロイした Cloud Media Service の IP に置き換えます。 - マニフェスト動画ファイルのパス: 「
/」。これは、live-streaming-storage-$LOGNAMEバケットでトランスコードされたライブ信号ファイルを保存するために使用したパスです。パスはルートパス「/」です。 - マニフェスト動画ファイルの名前: HLS マニフェスト ファイル
main.m3u8。
[開く] をクリックします。トランスコードされたライブ動画の再生が開始されます。動画は次のスクリーンショットのようになります。画面上のカウンターが 1 ずつ増えていき、連続したビープ音が聞こえるはずです。
これは、FFmpeg によって生成され、Live Streaming API によって HLS にコード変換され、Media CDN キャッシュ経由で配信される基本的な RTMP テスト ライブ信号です。

必要に応じて、他の HLS プレーヤーや MPEG DASH プレーヤーを使用することもできます。以下に、おすすめのプレーヤーをいくつかご紹介します。
- Quicktime プレーヤー - Mac にデフォルトでインストールされています。ここでも同様に、http://34.104.36.157/main.m3u8 へのネットワーク接続を開きます。IP アドレスは、Edge Cache Service インスタンスの IP アドレスに置き換えます。
17. Media CDN のモニタリング
SME チームが Media CDN ダッシュボード テンプレートを作成しました - https://gist.github.com/elithrar/1c511d00f5cd3736fb2a3897867209c1。
インストールするには、Cloud Shell ウィンドウで次のコマンドを実行します。
YAML ファイルをダウンロードします。
curl https://gist.githubusercontent.com/elithrar/1c511d00f5cd3736fb2a3897867209c1/raw/3cb70855304f29e5c06b8d63063196354db0dec3/media-edge-20210208-dashboard --output media-edge-20210208-dashboard.yaml
Cloud Monitoring のダッシュボードを作成します。
gcloud monitoring dashboards create --config-from-file media-edge-20210208-dashboard.yaml
設定には数分かかることがあります。Google Cloud コンソールに移動し、3 本のバー > [オペレーション] > [モニタリング] > [ダッシュボード] をクリックします。[Media Edge Metrics] というダッシュボードが表示されます。それをクリックすると、指標が表示されます。

18. ラボ環境をクリーンアップする
これでラボは完了です。このセクションでは、ラボ全体で作成したすべてのリソースを削除します。
FFmpeg シグナルを停止します。
FFmpeg が実行されている Cloud Shell ターミナルで <CTRL+C> キーを押します。
ライブ ストリーミング チャンネルを停止します。
コマンド
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
エッジ キャッシング サービス インスタンスを削除します。
コマンド
gcloud edge-cache services delete cme-demo
プロンプトが表示されたら「Y」と入力して削除を確定します。
Edge Cache Origin を削除します。
コマンド
gcloud edge-cache origins delete cme-origin
プロンプトが表示されたら「Y」と入力して削除を確定します。
カスタム ダッシュボードを削除する
コマンド
gcloud monitoring dashboards delete $(gcloud monitoring dashboards list --filter="displayName:Media Edge Metrics" --format="value(name)")