1. Введение
Сети доставки контента (CDN) повышают производительность для пользователей за счет кэширования часто используемого контента ближе к конечным пользователям, завершения соединений ближе к клиентам, повторного использования соединений с источником, а также за счет внедрения современных сетевых протоколов и настроек. Для пользователей (и наших клиентов) это означает меньшую задержку, большую надежность и снижение затрат, что приводит к увеличению продаж, улучшению работы веб-сайта и общему повышению качества обслуживания пользователей. Сегодня очень немногие современные сайты и платформы потокового видео работают без CDN.
Что вы узнаете
В этой лабораторной работе мы шаг за шагом развернем среду для потоковой передачи видео в реальном времени, используя Media CDN (CDN) + Cloud Media Live Streaming API (транскодирование видео в реальном времени) + Cloud Storage (хранение видео) + Video Player (VLC, Google Shaka Player и т. д. — плеер, поддерживающий HLS и MPEG-DASH).
Мы настроим компоненты API для потоковой передачи в реальном времени — Input и Channel — и запустим прямую трансляцию на Input/Channel с помощью FFmpeg (FFmpeg может генерировать тестовый сигнал в реальном времени). API для потоковой передачи в реальном времени выполнит транскодирование видеопотока. Транскодированный видеоманифест и сегменты будут храниться в хранилище Cloud Storage. Затем мы настроим Media CDN, используя хранилище Cloud Storage для воспроизведения видео в реальном времени в качестве источника. Наконец, для воспроизведения контента в реальном времени, кэшированного через Media CDN, будет использоваться VLC Player. Мы также настроим панель мониторинга Cloud Monitoring для визуализации активности Media CDN.
Что вы построите
В этой лабораторной работе мы настроим среду на основе следующей архитектуры:

В рамках лабораторной работы мы установим следующие компоненты и выполним следующие задачи:
- Создайте хранилище Google Cloud Storage (GCS) для хранения видео, преобразованных в режиме реального времени.
- Настройте API для потоковой передачи в реальном времени, чтобы преобразовывать видео в несколько форматов: HLS + MPEG DASH, SD и HD.
- Настройка компонентов прямой трансляции: Вход/Канал
- Создать канал прямой трансляции
- Настройте CDN для мультимедиа, используя GCS-корзину в качестве источника.
- Настройте FFmpeg для трансляции видео в прямой эфир.
- Смотрите транскодированную прямую трансляцию с помощью видеоплеера.
- Настройте панель мониторинга облачных сервисов для отслеживания активности CDN-сети мультимедиа (задержка, попадание в кэш, промах в кэше и т. д.).
Примечание : Для этой лабораторной работы мы предполагаем, что у пользователей есть доступ к консоли Google Cloud и уже настроен проект. Мы также предполагаем, что пользователи начинают с чистого листа и у них ничего не настроено для этой демонстрации.
Все действия по настройке будут выполняться через командную строку в Cloud Shell . Мы всегда можем проверить компоненты, настроенные через командную строку в консоли. На протяжении всего лабораторного занятия мы будем видеть указатели, ведущие к консоли Google Cloud.
2. Прежде чем начать
Доступ к Media CDN ограничен. Чтобы получить доступ к Media CDN, свяжитесь со своей командой по работе с клиентами. Они могут создать запрос на доступ от вашего имени. Если вы являетесь сотрудником Google и хотите протестировать прямую трансляцию с помощью Media CDN, свяжитесь с менеджером проекта Media CDN, чтобы запросить доступ к Media CDN.
3. Настройка и требования
Запустить Cloud Shell
Хотя Google Cloud можно управлять удаленно с ноутбука, в этом практическом занятии вы будете использовать Google Cloud Shell — среду командной строки, работающую в облаке.
В консоли Google Cloud нажмите на значок Cloud Shell на панели инструментов в правом верхнем углу:

Подготовка и подключение к среде займут всего несколько минут. После завершения вы должны увидеть что-то подобное:

Эта виртуальная машина содержит все необходимые инструменты разработки. Она предоставляет постоянный домашний каталог объемом 5 ГБ и работает в облаке Google, что значительно повышает производительность сети и аутентификацию. Вся работа в этом практическом задании может выполняться в браузере. Вам не нужно ничего устанавливать.
4. Версия Google Cloud SDK
На момент написания этой статьи последней версией Google Cloud SDK является 408.0.0 . Все команды в этом лабораторном задании были протестированы с использованием последней версии Google Cloud SDK. Прежде чем продолжить, убедитесь, что Cloud Shell использует последнюю версию SDK.
Проверка версии SDK
Для проверки версии SDK мы воспользуемся командой gcloud version .
Командование
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
- Идентификатор канала
Идентификатор проекта и имя пользователя
Эти переменные среды, как правило, предварительно настроены в Cloudshell. Для проверки мы воспользуемся командой env .
Командование
env | grep -E 'DEVSHELL_PROJECT_ID=|LOGNAME'
Пример выходных данных
DEVSHELL_PROJECT_ID=<YOUR_PROJECT_ID> LOGNAME=<YOUR_USERNAME>
Создайте файл env_variables .
Используйте команду cat для создания файла ` env_variables.txt . Приведенная ниже команда создаст файл ` env_variables.txt в домашнем каталоге пользователя.
Команды
cat > ~/env_variables.txt << EOF export PROJECT_NUMBER=$(gcloud projects describe $GOOGLE_CLOUD_PROJECT --format="value(projectNumber)") export LOCATION=us-west2 export INPUT_ID=lab-live-input export CHANNEL_ID=lab-live-channel EOF
Настройка переменных среды
Для установки переменных окружения мы воспользуемся командой source .
Командование
source ~/env_variables.txt
Убедитесь, что переменные установлены.
Давайте проверим, установлены ли все необходимые переменные окружения. В выводе должно отобразиться в общей сложности 6 переменных окружения.
Командование
env | grep -E 'DEVSHELL_PROJECT_ID=|LOGNAME|PROJECT_NUMBER|LOCATION|INPUT_ID|CHANNEL_ID'
Пример выходных данных
LOCATION=us-west2 DEVSHELL_PROJECT_ID=<YOUR_PROJECT_ID> LOGNAME=<YOUR_USERNAME> PROJECT_NUMBER=<YOUR_PROJECT_NUMBER> INPUT_ID=lab-live-input CHANNEL_ID=lab-live-channel
2. Включите необходимые API-интерфейсы сервисов.
Нам необходимо убедиться, что в нашем проекте включены следующие API.
- API сетевых служб
- API менеджера сертификатов
- API прямой трансляции
- API кэширования CDN Edge для медиаконтента
Включите API сетевых служб.
Чтобы включить API сетевых служб, выполните следующую команду:
Командование
gcloud services enable networkservices.googleapis.com
Включите API менеджера сертификатов.
Чтобы включить API диспетчера сертификатов, выполните следующую команду:
Командование
gcloud services enable certificatemanager.googleapis.com
Включите API для прямых трансляций.
Чтобы включить API для прямых трансляций, выполните следующую команду:
Командование
gcloud services enable livestream.googleapis.com
Включите API кэширования Media CDN Edge.
Чтобы включить API кэширования Media CDN Edge, выполните следующую команду:
Командование
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. Создайте корзину облачного хранилища.
В этом разделе мы выполним следующие действия:
- Создайте сегмент облачного хранилища.
- Сделайте ведро общедоступным.
Позже в лаборатории мы будем использовать этот бакет для хранения перекодированных видеофайлов. Этот бакет также будет служить исходным хранилищем для сервиса 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 для потоковой трансляции в реальном времени
Компоненты цепочки API для потоковой трансляции в реальном времени имеют следующую архитектуру:

В предыдущем разделе мы создали сегмент Cloud Storage live-streaming-storage-$LOGNAME . В следующих двух разделах мы создадим следующие ресурсы:
- Вход для потоковой передачи в реальном времени: Входная конечная точка — это конечная точка, на которую ваш кодировщик отправляет входной поток. Вы можете использовать входную конечную точку для указания параметров потока, таких как разрешение входного сигнала, тип входного сигнала и обрезка видео.
- Канал прямой трансляции: Канал — это ресурс, который принимает входной поток через входную точку, преобразует входной поток в несколько вариантов и публикует выходные потоки прямой трансляции в определенных форматах в указанном месте. В одном канале можно включить основной и резервный входные потоки.
Следующие материалы мы создадим позже в лаборатории:
- Кодировщик: Кодировщик — это программа, используемая для отправки входных потоков. В этой лабораторной работе мы будем использовать FFmpeg.
8. Создайте и настройте входную конечную точку.
Создайте файл input.json.
Мы создадим файл input.json для указания типа сигнала прямой трансляции. В этой лабораторной работе мы используем сигнал прямой трансляции RTMP.
Командование
cat > input.json << EOF
{
"type": "RTMP_PUSH"
}
EOF
Создайте входную конечную точку
На момент написания этой лабораторной работы поддержка 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
}
В результате анализа содержится много полезной информации, но на данный момент нам необходимо сосредоточиться на двух областях:
- Идентификатор операции: Скопируйте и запишите идентификатор операции из выходных данных. Ниже приведен пример идентификатора операции из выходных данных. Его можно найти в строке вывода, начинающейся с
"name"."operation-1661405972853-5e70a38d6f27f-79100d00-310671b4" - Статус: Нам нужно дождаться изменения статуса с
"done": falseна"done": true
Проверить статус
Прежде чем продолжить, необходимо убедиться, что входная конечная точка успешно создана и готова к использованию.
В приведенной ниже команде замените <OPERATION> на идентификатор операции, полученный выше. В этом примере это "operation-1661405972853-5e70a38d6f27f-79100d00-310671b4" .
Командование
export OPERATION_ID_1=<OPERATION>
Командование
curl -X GET \ -H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \ "https://livestream.googleapis.com/v1/projects/$PROJECT_NUMBER/locations/$LOCATION/operations/$OPERATION_ID_1"
Пример выходных данных
{
"name": "projects/PROJECT_NUMBER/locations/us-west2/operations/operation-1661408816982-5e70ae25cea49-617844f0-8fdcb4a1",
"metadata": {
"@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata",
"createTime": "2022-08-25T06:26:57.001530499Z",
"endTime": "2022-08-25T06:26:57.043623522Z",
"target": "projects/PROJECT_NUMBER/locations/us-west2/inputs/lab-live-input",
"verb": "create",
"requestedCancellation": false,
"apiVersion": "v1"
},
"done": true,
"response": {
"@type": "type.googleapis.com/google.cloud.video.livestream.v1.Input",
"name": "projects/PROJECT_ID/locations/us-west2/inputs/lab-live-input",
"createTime": "2022-08-25T06:26:56.997623672Z",
"updateTime": "2022-08-25T06:26:56.997623672Z",
"type": "RTMP_PUSH",
"uri": "rtmp://34.94.97.220/live/4b7846a1-4a67-44ed-bfd0-d98281b6464a",
"tier": "HD"
}
}
Повторяйте команду до тех пор, пока не увидите "done:true" , указывающее на то, что входная конечная точка создана и готова к работе.
Сохраните URI
Позже в лабораторной работе мы воспользуемся URI из предыдущего результата. А пока давайте установим переменную окружения для этого URI .
Командование
export URI=<uri>
Замените <uri> на указанный выше URI. При желании вы также можете использовать метод GET для получения URI.
Командование
curl -s -X GET -H "Authorization: Bearer "$(gcloud auth application-default print-access-token) "https://livestream.googleapis.com/v1/projects/$PROJECT_NUMBER/locations/$LOCATION/inputs/$INPUT_ID" | jq .uri
9. Создайте и настройте канал прямой трансляции.
Давайте создадим канал прямой трансляции, связанный с входной точкой, которую мы только что создали в предыдущем разделе. В следующем примере создается канал, генерирующий прямую трансляцию HLS, состоящую из одного изображения высокой четкости (1280x720). Канал будет связан с входной точкой и созданным ранее хранилищем.
Создайте файл channel.json.
В терминале Cloud Shell введите следующую команду для создания файла "channel.json" :
Командование
cat > channel.json << EOF
{
"inputAttachments": [
{
"key": "my-input",
"input": "projects/$PROJECT_NUMBER/locations/$LOCATION/inputs/$INPUT_ID"
}
],
"output": {
"uri": "gs://live-streaming-storage-$LOGNAME"
},
"elementaryStreams": [
{
"key": "es_video",
"videoStream": {
"h264": {
"profile": "high",
"widthPixels": 1280,
"heightPixels": 720,
"bitrateBps": 3000000,
"frameRate": 30
}
}
},
{
"key": "es_audio",
"audioStream": {
"codec": "aac",
"channelCount": 2,
"bitrateBps": 160000
}
}
],
"muxStreams": [
{
"key": "mux_video_ts",
"container": "ts",
"elementaryStreams": ["es_video", "es_audio"],
"segmentSettings": { "segmentDuration": "2s" }
}
],
"manifests": [
{
"fileName": "main.m3u8",
"type": "HLS",
"muxStreams": [
"mux_video_ts"
],
"maxSegmentCount": 5
}
]
}
EOF
Создать канал
Для создания канала выполните следующую команду curl :
Командование
curl -X POST \ -H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \ -H "Content-Type: application/json; charset=utf-8" \ -d @channel.json \ "https://livestream.googleapis.com/v1/projects/$PROJECT_NUMBER/locations/$LOCATION/channels?channelId=$CHANNEL_ID"
Пример выходных данных
{
"name": "projects/PROJECT_NUMBER/locations/us-west2/operations/operation-1661405972853-5e70a38d6f27f-79100d00-310671b4",
"metadata": {
"@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata",
"createTime": "2022-08-25T05:39:32.884030164Z",
"target": "projects/PROJECT_NUMBER/locations/us-west2/channels/lab-live-channel",
"verb": "create",
"requestedCancellation": false,
"apiVersion": "v1"
},
"done": false
}
Запишите и скопируйте идентификатор операции. Он понадобится нам на одном из следующих шагов. Его можно найти в строке вывода, начинающейся с "name" .
Проверить статус
Прежде чем продолжить, необходимо убедиться, что канал успешно создан и готов к работе.
В приведенной ниже команде замените <OPERATION> на идентификатор операции, полученный выше. В этом примере это operation-1661405972853-5e70a38d6f27f-79100d00-310671b4
Командование
export OPERATION_ID_2=<OPERATION>
Командование
curl -s -X GET \ -H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \ "https://livestream.googleapis.com/v1/projects/$PROJECT_NUMBER/locations/$LOCATION/operations/$OPERATION_ID_2"
Пример выходных данных
"name": "projects/PROJECT_NUMBER/locations/us-west2/operations/operation-1668666801461-5eda4c3f31852-a4d2229f-0efeef9e",
"metadata": {
"@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata",
"createTime": "2022-11-17T06:33:21.500841488Z",
"endTime": "2022-11-17T06:33:21.529311112Z",
"target": "projects/PROJECT_NUMBER/locations/us-west2/channels/lab-live-channel",
"verb": "create",
"requestedCancellation": false,
"apiVersion": "v1"
},
"done": true,
"response": {
"@type": "type.googleapis.com/google.cloud.video.livestream.v1.Channel",
"name": "projects/PROJECT_NAME/locations/us-west2/channels/lab-live-channel",
"createTime": "2022-11-17T06:33:21.497818033Z",
"updateTime": "2022-11-17T06:33:21.497818033Z",
"activeInput": "my-input",
"output": {
"uri": "gs://live-streaming-storage-LOGNAME"
},
"elementaryStreams": [
{
"videoStream": {
"h264": {
"widthPixels": 1280,
"heightPixels": 720,
"frameRate": 30,
"bitrateBps": 3000000,
"gopDuration": "2s",
"vbvSizeBits": 3000000,
"vbvFullnessBits": 2700000,
"entropyCoder": "cabac",
"profile": "high"
}
},
"key": "es_video"
},
{
"audioStream": {
"codec": "aac",
"bitrateBps": 160000,
"channelCount": 2,
"sampleRateHertz": 48000
},
"key": "es_audio"
}
],
"muxStreams": [
{
"key": "mux_video_ts",
"container": "ts",
"elementaryStreams": [
"es_video",
"es_audio"
],
"segmentSettings": {
"segmentDuration": "2s"
}
}
],
"manifests": [
{
"fileName": "main.m3u8",
"type": "HLS",
"muxStreams": [
"mux_video_ts"
],
"maxSegmentCount": 5,
"segmentKeepDuration": "60s"
}
],
"streamingState": "STOPPED",
"inputAttachments": [
{
"key": "my-input",
"input": "projects/PROJECT_NUMBER/locations/us-west2/inputs/lab-live-input"
}
],
"logConfig": {
"logSeverity": "OFF"
}
}
}
Повторяйте команду до тех пор, пока не увидите "done:true" , указывающее на то, что входная конечная точка создана и готова к работе.
Обратите внимание, что в данный момент состояние "streamingState" равно "STOPPED" ; мы запустим канал в следующем разделе.
10. Запустите канал прямой трансляции.
Теперь, когда мы создали наш канал для прямых трансляций, давайте запустим его. В этом разделе мы будем делать следующее:
- Запустить канал прямой трансляции
- Проверьте статус канала, необходимо убедиться, что
streamingStateнаходится в"AWAITING INPUT"
1. Создайте канал.
В Cloud Shell выполните следующую команду curl , чтобы запустить канал:
Командование
curl -X POST \ -H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \ -H "Content-Type: application/json; charset=utf-8" \ -d "" \ "https://livestream.googleapis.com/v1/projects/$PROJECT_NUMBER/locations/$LOCATION/channels/$CHANNEL_ID:start"
Пример выходных данных
{
"name": "projects/PROJECT_NUMBER/locations/LOCATION/operations/operation-1661405972853-5e70a38d6f27f-79100d00-310671b4",
"metadata": {
"@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata",
"createTime": "2022-08-25T05:39:32.884030164Z",
"target": "projects/PROJECT_NUMBER/locations/us-west2/channels/lab-live-channel",
"verb": "start",
"requestedCancellation": false,
"apiVersion": "v1"
},
"done": false
}
2. Проверьте статус канала.
Выполните следующую команду curl , чтобы получить статус канала:
Командование
curl -s -X GET -H "Authorization: Bearer "$(gcloud auth application-default print-access-token) "https://livestream.googleapis.com/v1/projects/$PROJECT_NUMBER/locations/$LOCATION/channels/$CHANNEL_ID" | grep "streamingState"
Пример выходных данных
"streamingState": "AWAITING_INPUT",
Повторяйте выполнение команды до тех пор, пока не увидите сообщение " AWAITING_INPUT ", указывающее на то, что канал запущен и готов к приему сигнала.
11. Настройка CDN для мультимедиа
В этом разделе мы развернем Media CDN — инфраструктуру CDN. Мы создадим следующие ресурсы:
- Источник кэша Edge
- Служба кэширования Edge
1. Создайте источник кэша на границе сети (Edge Cache Origin) .
Edge Cache Origin представляет собой местоположение контента, например, хранилище Cloud Storage, хранилище стороннего поставщика или балансировщик нагрузки. В терминах CDN, источник (или сервер-источник) — это место, где находится исходный контент, который мы хотим распространить, например, все CSS, JavaScript, HTML, изображения и т. д. В этой лабораторной работе мы создадим источник, который будет соответствовать хранилищу Cloud Storage, созданному нами в начале работы. Мы назовем Edge Cache Origin cme-origin . Источник CDN — это место, где хранится весь исходный контент перед его распространением на серверы кэширования Edge.
Для создания источника мы воспользуемся командой gcloud edge-cache origins create . Выполнение команды займет несколько минут.
Командование
gcloud edge-cache origins create cme-origin \ --origin-address="gs://live-streaming-storage-$LOGNAME"
Пример выходных данных
Create request issued for: cme-origin Waiting for operation [projects/my-project/locations/global/operations/operation-1612121774168-5ba3759af1919- 3fdcd7b1-99f59223] to complete...done Created origin cme-origin
2. Создайте службу кэширования на границе сети (Edge Cache Service) .
Теперь, когда у нас настроен источник кэширования Edge, мы можем создать саму службу кэширования Edge.
Создайте файл 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. Мы будем использовать его во время этой демонстрации. Мы будем использовать IP-адрес экземпляра Media CDN. -
Origin:это источник кэша Edge, который мы только что создали на предыдущем шаге. Установите для него значениеcme-origin— имя источника CDN для мультимедиа.
Для получения дополнительной информации о различных переменных, которые можно использовать в файле YAML, см. руководство по настройке службы кэширования Edge .
Создайте службу кэширования Edge.
Мы создадим службу кэширования Edge с именем cme-demo на источнике кэширования Edge cme-origin с хостом demo.cme.com . Для создания службы выполните следующую команду в Cloud Shell:
Командование
gcloud edge-cache services import cme-demo \
--source=cme-demo.yaml
Создание службы кэширования Edge может занять несколько минут.
Пример выходных данных
Request issued for: [cme-demo]
Waiting for operation [projects/PROJECT_ID/locations/global/operations/operation-1670476252264-5ef4a0f9f36ce-dd380af5-321be9a0] to complete...done.
createTime: '2022-12-07T18:08:54.403446942Z'
ipv4Addresses:
- 34.104.35.152
ipv6Addresses:
- '2600:1900:4110:d18::'
name: projects/PROJECT_ID/locations/global/edgeCacheServices/cme-demo
routing:
hostRules:
- hosts:
- demo.cme.com
- 34.104.35.152
pathMatcher: routes
pathMatchers:
- name: routes
routeRules:
- headerAction:
responseHeadersToAdd:
- headerName: x-cache-status
headerValue: '{cdn_cache_status}'
matchRules:
- prefixMatch: /
origin: projects/123456789/locations/global/edgeCacheOrigins/cme-origin
priority: '100'
routeAction:
cdnPolicy:
cacheKeyPolicy: {}
cacheMode: FORCE_CACHE_ALL
defaultTtl: 3600s
signedRequestMode: DISABLED
- headerAction:
responseHeadersToAdd:
- headerName: x-cache-status
headerValue: '{cdn_cache_status}'
matchRules:
- pathTemplateMatch: /**.m3u8
origin: projects/123456789/locations/global/edgeCacheOrigins/cme-origin
priority: '25'
routeAction:
cdnPolicy:
cacheKeyPolicy: {}
cacheMode: FORCE_CACHE_ALL
defaultTtl: 1s
signedRequestMode: DISABLED
- headerAction: {}
matchRules:
- pathTemplateMatch: /**.ts
origin: projects/123456789/locations/global/edgeCacheOrigins/cme-origin
priority: '50'
routeAction:
cdnPolicy:
cacheKeyPolicy: {}
cacheMode: FORCE_CACHE_ALL
defaultTtl: 2s
signedRequestMode: DISABLED
updateTime: '2022-12-08T05:11:31.598744308Z'
Запишите и скопируйте ipv4Addresses экземпляра службы кэширования Edge — здесь 34.104.36.157 . Мы будем использовать их для обновления файла cme-demo.yaml , а позже — для потоковой передачи транскодированного видео.
Обновите службу кэширования Edge.
На данном этапе целесообразно обновить конфигурацию службы кэширования Edge, чтобы в дальнейшем использовать IP-адрес службы для потоковой передачи видео. YAML-файл службы кэширования Edge позволяет перечислить все имена хостов/IP-адреса, с которых служба кэширования Edge будет принимать запросы. На данный момент мы указали только demo.cme.com в качестве хоста. Для обеспечения разрешения имен для этого домена можно настроить DNS-зону. Однако более простым решением будет добавить IP-адрес в список хостов в yaml файле. Отредактируйте YAML-файл еще раз и придайте ему следующий вид:
name: cme-demo
routing:
hostRules:
- hosts:
- demo.cme.com
- IPADDRESS
pathMatcher: routes
pathMatchers:
- name: routes
routeRules:
- headerAction:
responseHeadersToAdd:
- headerName: x-cache-status
headerValue: "{cdn_cache_status}"
matchRules:
- prefixMatch: /
origin: cme-origin
priority: 100
routeAction:
cdnPolicy:
cacheKeyPolicy: {}
cacheMode: FORCE_CACHE_ALL
defaultTtl: 3600s
signedRequestMode: DISABLED
- headerAction:
responseHeadersToAdd:
- headerName: x-cache-status
headerValue: "{cdn_cache_status}"
matchRules:
- pathTemplateMatch: /**.m3u8
origin: cme-origin
priority: 25
routeAction:
cdnPolicy:
cacheKeyPolicy: {}
cacheMode: FORCE_CACHE_ALL
defaultTtl: 1s
signedRequestMode: DISABLED
- headerAction: {}
matchRules:
- pathTemplateMatch: /**.ts
origin: cme-origin
priority: 50
routeAction:
cdnPolicy:
cacheKeyPolicy: {}
cacheMode: FORCE_CACHE_ALL
defaultTtl: 2s
signedRequestMode: DISABLED
Чтобы изменения вступили в силу, нам нужно просто повторно импортировать YAML-файл. В терминале Cloud Shell выполните следующую команду:
Командование
gcloud edge-cache services import cme-demo \
--source=cme-demo.yaml
Проверьте вывод команды и убедитесь, что IP-адрес отображается в списке хостов.
На данном этапе экземпляр Edge Cache Service будет принимать запросы, в которых в качестве хоста указано либо "demo.cme.com" , либо IP-адрес.
12. Сгенерируйте входной сигнал
Теперь, когда мы настроили все необходимые сервисы, давайте сгенерируем входной сигнал для прямой трансляции. В этом разделе мы выполним следующие действия:
- Установите FFmpeg, бесплатное программное обеспечение с открытым исходным кодом.
- Отправьте тестовый сигнал в реальном времени на вход/канал.
1. Установите FFmpeg.
FFmpeg — это бесплатный проект с открытым исходным кодом, представляющий собой набор библиотек и программ для обработки видео, аудио и других мультимедийных файлов и потоков. В терминале Cloud Shell используйте следующую команду для установки FFmpeg:
Командование
sudo apt install ffmpeg -y
После завершения установки давайте убедимся, что FFmpeg установлен правильно, проверив его версию:
Командование
ffmpeg -version
Пример выходных данных
ffmpeg version 4.3.4-0+deb11u1 Copyright (c) 2000-2021 the FFmpeg developers built with gcc 10 (Debian 10.2.1-6) ...
FFmpeg был установлен корректно.
2. Запустите потоковое вещание на входе/канале.
Теперь, когда FFmpeg установлен, мы отправим тестовый входной поток на входную точку для генерации потока в реальном времени.
В терминале Cloud Shell выполните следующую команду, используя переменную среды URI, которую мы создали в разделе «Создание и настройка входной конечной точки».
Командование
ffmpeg -re -f lavfi -i "testsrc=size=1280x720 [out0]; sine=frequency=500 [out1]" \ -acodec aac -vcodec h264 -f flv $URI
Вы должны увидеть, как FFmpeg отправляет тестовый сигнал в реальном времени. Команда не вернет приглашение командной строки. Сигнал будет генерироваться до тех пор, пока вы его не остановите. Для продолжения лабораторной работы вам потребуется открыть новое окно Cloud Shell.
13. Откройте новую облачную оболочку.
На этом этапе вам потребуется открыть новое окно Cloud Shell, чтобы продолжить лабораторную работу, поскольку FFmpeg будет работать постоянно, пока вы не нажмете <CTRL+C> команду на его остановку, тем самым прекратив генерацию сигнала в реальном времени.
Нажмите на знак «+» рядом с названием текущего терминала Cloud Shell. Откроется дополнительное окно Cloud Shell.

Запустите оставшуюся часть лабораторной работы в открывшемся окне Cloud Shell.
Настройка переменных среды
Поскольку это новая версия CloudShell, нам нужно снова установить переменные окружения. Для этого мы воспользуемся командой source .
Командование
source ~/env_variables.txt
Убедитесь, что переменные установлены.
Давайте проверим, установлены ли все необходимые переменные окружения. В выводе должно отобразиться в общей сложности 6 переменных окружения.
Командование
env | grep -E 'DEVSHELL_PROJECT_ID=|LOGNAME|PROJECT_NUMBER|LOCATION|INPUT_ID|CHANNEL_ID'
Пример выходных данных
LOCATION=us-west2 DEVSHELL_PROJECT_ID=<YOUR_PROJECT_ID> LOGNAME=<YOUR_USERNAME> PROJECT_NUMBER=<YOUR_PROJECT_NUMBER> INPUT_ID=lab-live-input CHANNEL_ID=lab-live-channel
14. Убедитесь, что сигнал в реальном времени перекодируется.
Мы выполним команду curl для описания канала. В выводе мы должны увидеть, что streamingState изменился с "AWAITING_INPUT" на "STREAMING"
Командование
curl -s -X GET -H "Authorization: Bearer "$(gcloud auth application-default print-access-token) "https://livestream.googleapis.com/v1/projects/$PROJECT_NUMBER/locations/$LOCATION/channels/$CHANNEL_ID" | grep "streamingState"
В выходном JSON-файле ответа вы должны увидеть "streamingState": "STREAMING" — это указывает на то, что канал ведет потоковую передачу и происходит транскодирование сигнала в реальном времени.
Давайте также проверим содержимое хранилища, где мы должны увидеть файл манифеста и несколько сегментов видео TS. Выполните следующую команду в Cloud Shell, чтобы вывести содержимое хранилища, которое мы создали в начале лабораторной работы и которое используется 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
На этом этапе мы завершаем следующее:
- API для потоковой передачи в реальном времени: сигнал в реальном времени генерируется и преобразуется в буфер с помощью API для потоковой передачи в реальном времени.
- Media CDN: настроено использование Media CDN с хранилищем данных для потокового вещания в качестве источника данных для Media CDN.
В следующих разделах мы проверим работу службы Edge Cache, а затем будем транслировать перекодированное видео, используя IP-адрес anycast медиа-CDN.
15. Убедитесь, что экземпляр службы кэширования Edge работает.
В этом разделе мы проверим, работает ли экземпляр службы кэширования Edge должным образом. Для этого мы попытаемся получить доступ к файлу из экземпляра службы кэширования Edge, используя IP-адрес этой службы. При первом обращении к объекту он еще не кэширован. Мы должны наблюдать ошибку MISS в кэше. При первом запросе объект считывается из источника и кэшируется на границе. Все последующие попытки доступа к тому же файлу будут возвращать ошибку HIT в кэше, поскольку объект теперь кэширован на границе. Давайте проверим это поведение:
Выполните следующую команду curl в Cloud Shell, чтобы получить доступ к файлу манифеста транскодированного видео, хранящемуся в Edge Cache Origin:
Командование
curl -svo /dev/null --resolve demo.cme.com:80:<Replace_With_Edge_Cache_IP> \ "http://demo.cme.com/main.m3u8"
Обратите внимание на оператор resolve, где мы используем IP-адрес экземпляра службы кэширования Edge для разрешения его имени. Убедитесь, что вы используете demo.cme.com:<IP> где IP — это IP-адрес только что созданного экземпляра службы кэширования Edge.
Найдите заголовок 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 Medie Edge работает как положено.
16. Трансляция видеосигнала в реальном времени с помощью VLC.
На этом этапе мы соединяем точки и связываем воедино все шаги, над которыми работали до сих пор:
- Мы создали хранилище под названием
live-streaming-storage-$LOGNAME, которое получает результат преобразования сигнала в реальном времени в контент HLS с помощью API потоковой передачи в реальном времени. - Мы настроили API для прямых трансляций.
- Мы запустили передачу RTMP-сигнала в реальном времени с помощью FFmpeg, который поступает на вход/канал Live Streaming API.
- Мы убедились, что прямой сигнал поступает на канал, и проверили, что канал находится в режиме
streaming. - Мы убедились, что полученные транскодированные файлы (манифест + сегменты TS) были сгенерированы и сохранены в хранилище
live-streaming-storage-$LOGNAME. - Был создан источник кэша Edge Cache Origin под названием
cme-originв качестве которого был указан сегмент GCSlive-streaming-storage-$LOGNAME. - Был создан экземпляр Edge Cache под названием
cme-demoв котором в качестве источника был указанcme-origin. - Мы проверили поведение (промах кэша, попадание в кэш) экземпляра службы Edge Cache Service.
Теперь мы можем использовать видеоплеер для потоковой передачи транскодированного сигнала в реальном времени через кэш Media CDN. Для этого мы воспользуемся VLC Player . VLC Player — это бесплатный кроссплатформенный мультимедийный плеер и фреймворк с открытым исходным кодом, который воспроизводит большинство мультимедийных файлов. Он воспроизводит адаптивные медиаформаты (такие как DASH и HLS). Он использует принцип адаптивной потоковой передачи — в зависимости от качества вашего сетевого соединения и доступной пропускной способности плеер будет адаптировать качество воспроизводимого видео. В только что выполненной нами транскодировке мы использовали предустановки по умолчанию и сгенерировали «только» два качества: SD и HD. Как только мы начнем воспроизведение видео в плеере, вы должны увидеть, как оно начнет воспроизводиться в формате SD и быстро переключится на формат HD, если ваше сетевое соединение достаточно хорошее.
Мы будем транслировать в прямом эфире сигнал, преобразованный в формат HLS (широко поддерживаемый формат видео Apple). Соответствующий файл называется main.m3u8 — это манифест HLS. Манифест указывает на видеосегменты TS.
Чтобы использовать VLC Player, перейдите по ссылке https://www.videolan.org/vlc/ и загрузите версию плеера для операционной системы вашего ноутбука — VLC доступен для Windows, MacOSX, Linux, Android и iOS.

Установите плеер на свой ноутбук и запустите его. Для следующих шагов мы будем использовать версию плеера для MacOSX.
Чтобы воспроизвести видео, перейдите в меню «Файл» / «Открыть сеть»:

Настройте это следующим образом:
- URL: http://<Replace_With_Edge_Cache_IP>/main.m3u8 . Это URL видео, которое мы хотим транслировать. Примечание:
- IP-адрес экземпляра Media CDN:
34.105.35.246. Замените на IP-адрес развернутой вами облачной медиа-службы. - Путь к файлу манифеста видео: "
/". Это путь, который мы использовали в хранилищеlive-streaming-storage-$LOGNAMEдля хранения файлов транскодированного сигнала в реальном времени. Здесь указан корневой путь: "/". - Название файла манифеста видео: файл манифеста HLS,
main.m3u8.
Затем нажмите «Открыть». Вы должны увидеть, как начинает воспроизводиться транскодированное видео в реальном времени. Видео будет выглядеть как на скриншоте ниже. Счетчик на экране будет увеличиваться на 1, и вы должны услышать непрерывный звуковой сигнал.
Это базовый тестовый сигнал RTMP в реальном времени, сгенерированный FFmpeg, преобразованный в HLS с помощью Live Streaming API и предоставляемый через кэш Media CDN:

При желании вы можете использовать любой другой HLS и MPEG DASH-плеер. Вот несколько вариантов, которые вы можете рассмотреть:
- Проигрыватель Quicktime — установлен по умолчанию на компьютерах Mac. То же самое: откройте сетевое соединение по адресу http://34.104.36.157/main.m3u8 — замените IP-адрес на адрес вашего экземпляра службы кэширования Edge.
17. Мониторинг CDN медиаресурсов
Шаблон панели управления Media CDN был создан командой экспертов в данной области — https://gist.github.com/elithrar/1c511d00f5cd3736fb2a3897867209c1 .
Для установки выполните следующие команды в окне Cloud Shell:
Скачайте YAML-файл:
curl https://gist.githubusercontent.com/elithrar/1c511d00f5cd3736fb2a3897867209c1/raw/3cb70855304f29e5c06b8d63063196354db0dec3/media-edge-20210208-dashboard --output media-edge-20210208-dashboard.yaml
Создайте панель мониторинга для облачного мониторинга:
gcloud monitoring dashboards create --config-from-file media-edge-20210208-dashboard.yaml
Настройка может занять несколько минут. Перейдите в консоль Google Cloud и нажмите на три полоски > Операции > Мониторинг > Панели мониторинга. Вы должны увидеть панель мониторинга под названием «Метрики Media Edge». Нажмите на неё, и вы увидите следующие метрики:

18. Приведите в порядок лабораторное помещение.
Поздравляем с завершением лабораторной работы! В этом разделе мы удалим все ресурсы, созданные нами в ходе работы.
Остановить сигнал FFmpeg:
Нажмите <CTRL+C> в терминале Cloud Shell, в котором запущен FFmpeg.
Остановите прямую трансляцию:
Командование
curl -X POST \ -H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \ -H "Content-Type: application/json; charset=utf-8" \ -d "" \ "https://livestream.googleapis.com/v1/projects/$PROJECT_NUMBER/locations/$LOCATION/channels/$CHANNEL_ID:stop"
Удалите канал прямой трансляции:
Командование
curl -X DELETE -H "Authorization: Bearer "$(gcloud auth application-default print-access-token) "https://livestream.googleapis.com/v1/projects/$PROJECT_NUMBER/locations/$LOCATION/channels/$CHANNEL_ID"
Удалите входной терминал для потоковой трансляции:
Командование
curl -X DELETE \ -H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \ "https://livestream.googleapis.com/v1/projects/$PROJECT_NUMBER/locations/$LOCATION/inputs/$INPUT_ID"
Удалите корзину GCS:
Командование
gsutil rm -r gs://live-streaming-storage-$LOGNAME
Удалите экземпляр службы кэширования Edge:
Командование
gcloud edge-cache services delete cme-demo
Подтвердите удаление, введя "Y" при появлении соответствующего запроса.
Удалите источник кэша Edge:
Командование
gcloud edge-cache origins delete cme-origin
Подтвердите удаление, введя "Y" при появлении соответствующего запроса.
Удалите пользовательскую панель управления.
Командование
gcloud monitoring dashboards delete $(gcloud monitoring dashboards list --filter="displayName:Media Edge Metrics" --format="value(name)")