Прямая трансляция в Google Cloud с помощью Media CDN и API прямой трансляции

1. Введение

Сети доставки контента (CDN) повышают производительность пользователей за счет кэширования часто используемого контента ближе к конечным пользователям, разрыва соединений ближе к клиентам, повторного использования соединений с источником, а также за счет внедрения современных сетевых протоколов и настроек. Для пользователей (и наших клиентов) это означает меньшую задержку, большую надежность и снижение затрат, что приведет к улучшению продаж, улучшению качества работы в Интернете и чистому увеличению удобства пользователей. В настоящее время очень немногие современные сайты и платформы потокового видео работают без CDN.

Что вы узнаете

Эта лабораторная работа проведет нас через шаги по развертыванию среды рабочего процесса потоковой передачи в реальном времени с помощью Media CDN (CDN) + Cloud Media Live Streaming API (транскодирование видео в реальном времени) + Cloud Storage (хранилище для видео) + Видеоплеер (VLC, Google Shaka Player). и т. д. — HLS + готовый плеер MPEG-DASH).

Мы настроим компоненты API прямой трансляции — Вход, Канал — и запустим прямую трансляцию на Вход/Канал с помощью FFmpeg (FFmpeg может генерировать тестовый сигнал в реальном времени). API прямой трансляции перекодирует прямую трансляцию. Перекодированный видеоманифест и его сегменты будут храниться в сегменте Cloud Storage. Затем мы настроим Media CDN, используя в качестве источника корзину Cloud Storage для живого видео. Наконец, VLC Player будет использоваться для воспроизведения живого контента, кэшированного через Media CDN. Мы также настроим панель мониторинга облака для визуализации активности Media CDN.

Что ты построишь

В этой лабораторной работе мы настроим среду на основе следующей архитектуры:

de33cb3e75d52549.png

В рамках лабораторной работы мы настроим следующие компоненты и выполним следующие задачи:

  • Создайте корзину Google Cloud Storage (GCS) для хранения транскодированных видео в реальном времени.
  • Настройте Live Streaming API для перекодирования видео в несколько форматов: HLS + MPEG DASH, SD и HD.
  • Настройте компоненты прямой трансляции: Вход/Канал.
  • Запустить канал прямой трансляции
  • Настройте Media CDN, используя корзину GCS в качестве источника.
  • Настройте FFmpeg для трансляции живого канала
  • Потоковая транскодированная прямая трансляция с помощью видеоплеера
  • Настройте панель облачного мониторинга для мониторинга активности Media CDN (задержка, попадание в кеш, промах в кеше и т. д.)

Примечание . В ходе этой лабораторной работы мы предполагаем, что пользователи имеют доступ к Google Cloud Console и уже настроили проект. Мы также предполагаем, что пользователи начинают с новой среды и ничего не настраивают для этой демонстрации.

Все действия по настройке будут выполняться через командную строку в Cloud Shell . Мы всегда можем проверить настроенные компоненты через командную строку в консоли. По всей лаборатории мы увидим указатели, указывающие на Google Cloud Console.

2. Прежде чем начать

Доступ к медиа-CDN ограничен. Чтобы получить доступ к Media CDN, свяжитесь со своей командой по работе с клиентами. Они могут создать запрос на доступ от вашего имени. Если вы являетесь сотрудником Google и хотите протестировать прямую трансляцию с помощью Media CDN, обратитесь к менеджеру по медиа CDN, чтобы запросить доступ к Media CDN.

3. Настройка и требования

Запустить Cloud Shell

Хотя Google Cloud можно управлять удаленно с вашего ноутбука, в этой лаборатории вы будете использовать Google Cloud Shell , среду командной строки, работающую в облаке.

В Google Cloud Console щелкните значок Cloud Shell на верхней правой панели инструментов:

55efc1aaa7a4d3ad.png

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

7ffe5cbb04455448.png

Эта виртуальная машина оснащена всеми необходимыми инструментами разработки. Он предлагает постоянный домашний каталог объемом 5 ГБ и работает в Google Cloud, что значительно повышает производительность сети и аутентификацию. Всю работу в этой лаборатории кода можно выполнять в браузере. Вам не нужно ничего устанавливать.

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

Следующие шаги

  1. Если версия SDK 408.0.0 или выше, перейдите к следующему разделу.
  2. Если версия SDK ниже 408.0.0 , выполните команду, указанную ниже, чтобы обновить SDK.
sudo apt-get update && sudo apt-get install google-cloud-sdk

5. Предварительные условия

Прежде чем мы начнем настраивать ресурсы GCP, нам необходимо сделать следующее:

  1. Настройка переменных среды
  2. Включите необходимые сервисные API

1. Настройка переменных среды

В ходе этой лабораторной работы мы будем запускать команды gcloud и curl с несколькими переменными. Нам необходимо настроить следующие переменные среды.

  • Идентификатор проекта
  • Номер проекта
  • Имя пользователя
  • Область
  • Введите идентификатор
  • Идентификатор канала

Идентификатор проекта и имя пользователя

Эти переменные среды обычно предварительно настраиваются в 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 Edge Cache медиа CDN

Включите API сетевых служб

Чтобы включить API сетевых служб, выполните следующую команду:

Команда

gcloud services enable networkservices.googleapis.com

Включите API диспетчера сертификатов

Чтобы включить API диспетчера сертификатов, выполните следующую команду:

Команда

gcloud services enable certificatemanager.googleapis.com

Включите API прямой трансляции

Чтобы включить API Live Stream, выполните следующую команду:

Команда

gcloud services enable livestream.googleapis.com

Включите API Edge Cache Media CDN

Чтобы включить API Media CDN Edge Cache, выполните следующую команду:

Команда

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. Создайте сегмент облачного хранилища.

В этом разделе мы сделаем следующее:

  1. Создайте сегмент облачного хранилища.
  2. Сделайте корзину общедоступной

Позже в лабораторных условиях мы будем использовать эту корзину для хранения перекодированных видеофайлов. Этот сегмент также будет выступать в качестве исходного хранилища для службы 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 Live Streaming имеют следующую архитектуру:

96b5d26aedeb89a6.png

В предыдущем разделе мы создали корзину Cloud Storage live-streaming-storage-$LOGNAME . В следующих двух разделах мы создадим следующие ресурсы:

  • Ввод потоковой передачи в реальном времени. Конечная точка ввода — это конечная точка, в которую ваш кодер отправляет входной поток. Вы можете использовать конечную точку ввода, чтобы указать конфигурации для вашего потока, такие как разрешение ввода, тип ввода и обрезка видео.
  • Канал потоковой передачи в реальном времени. Канал — это ресурс, который принимает входной поток через конечную точку ввода, перекодирует входной поток в несколько версий и публикует выходные прямые потоки в определенных форматах в указанном месте. Вы можете включить основной и резервный входной поток в один и тот же канал.

Позже в лабораторной работе мы создадим следующие ресурсы:

  • Кодировщик: Кодер — это программа, используемая для отправки входных потоков. В этой лабораторной работе мы будем использовать FFmpeg.

8. Создайте и настройте входную конечную точку.

Создайте файл input.json.

Мы создадим файл input.json , чтобы указать тип сигнала прямой трансляции. В этой лабораторной работе мы используем прямой сигнал RTMP.

Команда

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

Создайте входную конечную точку

На момент написания этой лабораторной работы поддержка API Live Stream не поддерживалась gcloud. Мы будем использовать команду curl для выполнения вызовов API.

Команда

curl -X POST \
-H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
-H "Content-Type: application/json; charset=utf-8" \
-d @input.json \
"https://livestream.googleapis.com/v1/projects/$PROJECT_NUMBER/locations/$LOCATION/inputs?inputId=$INPUT_ID"

Пример вывода

{
  "name": "projects/PROJECT_NUMBER/locations/us-west2/operations/operation-1661405972853-5e70a38d6f27f-79100d00-310671b4",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata",
    "createTime": "2022-08-25T05:39:32.884030164Z",
    "target": "projects/PROJECT_NUMBER/locations/us-west2/inputs/lab-live-input",
    "verb": "create",
    "requestedCancellation": false,
    "apiVersion": "v1"
  },
  "done": false
}

Вывод содержит много полезной информации, но сейчас нам нужно сосредоточиться на двух полях:

  • Идентификатор операции: из вывода скопируйте и запишите идентификатор операции. Ниже приведен идентификатор операции из примера вывода. Это можно найти в строке вывода, начинающейся с "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. Запустите канал прямой трансляции.

Теперь, когда мы создали канал прямой трансляции, давайте запустим канал. В этом разделе мы сделаем следующее:

  1. Запустить канал прямой трансляции
  2. Проверьте статус канала, нам нужно убедиться, что 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. Мы создадим следующие ресурсы:

  1. Происхождение пограничного кэша
  2. Служба пограничного кэша

1. Создайте источник пограничного кэша

Источник Edge Cache представляет собой местоположение контента, например сегмент облачного хранилища, стороннее хранилище или балансировщик нагрузки. С точки зрения CDN, источник (или исходный сервер) — это место, где находится источник контента, который мы хотим распространять — например, весь CSS, Javascripts, 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.

Теперь, когда у нас настроен источник Edge Cache, мы можем создать саму службу Edge Cache.

Создайте файл cme-demo.yaml

Конфигурация службы Edge Cache выполняется через файл 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 по умолчанию. В файле выше есть три значения полей, которые пользователи могут захотеть обновить:

  • name : имя экземпляра Media CDN — здесь: cme-demo
  • hosts: список доменных имен, которые будут разрешены этой службой Media CDN — здесь: demo.cme.com . Мы будем использовать это во время этой демонстрации. Мы будем использовать IP-адрес экземпляра Media CDN.
  • Origin: это источник Edge Cache, который мы только что создали на предыдущем шаге. Установите cme-origin — имя источника Media CDN.

Дополнительную информацию о различных переменных, которые можно использовать в файле YAML, см. в руководстве по настройке Edge Cache Service .

Создайте службу Edge Cache.

Мы создадим службу Edge Cache с именем cme-demo в Edge Cache Origin cme-origin с хостом demo.cme.com . Чтобы создать службу, выполните следующую команду в Cloud Shell:

Команда

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

Создание службы Edge Cache может занять несколько минут.

Пример вывода

Request issued for: [cme-demo]
Waiting for operation [projects/PROJECT_ID/locations/global/operations/operation-1670476252264-5ef4a0f9f36ce-dd380af5-321be9a0] to complete...done.     
createTime: '2022-12-07T18:08:54.403446942Z'
ipv4Addresses:
- 34.104.35.152
ipv6Addresses:
- '2600:1900:4110:d18::'
name: projects/PROJECT_ID/locations/global/edgeCacheServices/cme-demo
routing:
  hostRules:
  - hosts:
    - demo.cme.com
    - 34.104.35.152
    pathMatcher: routes
  pathMatchers:
  - name: routes
    routeRules:
    - headerAction:
        responseHeadersToAdd:
        - headerName: x-cache-status
          headerValue: '{cdn_cache_status}'
      matchRules:
      - prefixMatch: /
      origin: projects/123456789/locations/global/edgeCacheOrigins/cme-origin
      priority: '100'
      routeAction:
        cdnPolicy:
          cacheKeyPolicy: {}
          cacheMode: FORCE_CACHE_ALL
          defaultTtl: 3600s
          signedRequestMode: DISABLED
    - headerAction:
        responseHeadersToAdd:
        - headerName: x-cache-status
          headerValue: '{cdn_cache_status}'
      matchRules:
      - pathTemplateMatch: /**.m3u8
      origin: projects/123456789/locations/global/edgeCacheOrigins/cme-origin
      priority: '25'
      routeAction:
        cdnPolicy:
          cacheKeyPolicy: {}
          cacheMode: FORCE_CACHE_ALL
          defaultTtl: 1s
          signedRequestMode: DISABLED
    - headerAction: {}
      matchRules:
      - pathTemplateMatch: /**.ts
      origin: projects/123456789/locations/global/edgeCacheOrigins/cme-origin
      priority: '50'
      routeAction:
        cdnPolicy:
          cacheKeyPolicy: {}
          cacheMode: FORCE_CACHE_ALL
          defaultTtl: 2s
          signedRequestMode: DISABLED
updateTime: '2022-12-08T05:11:31.598744308Z'

Запишите и скопируйте ipv4Addresses экземпляра Edge Cache Service — здесь 34.104.36.157 . Мы будем использовать его для обновления файла cme-demo.yaml , а затем для потоковой передачи перекодированного видео.

Обновите службу Edge Cache

На этом этапе рекомендуется обновить конфигурацию службы Edge Cache, чтобы иметь возможность использовать IP-адрес службы для потоковой передачи видео в дальнейшем. YAML-файл Edge Cache Service позволяет нам перечислить все имена/IP-адреса хостов, от которых Edge Cache Service будет принимать запросы. На данный момент в качестве хоста мы указали только 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. Сгенерируйте входной сигнал

Теперь, когда мы настроили все необходимые службы, давайте сгенерируем входной сигнал прямого потока. В этом разделе мы сделаем следующее:

  1. Установите FFmpeg, бесплатное программное обеспечение с открытым исходным кодом.
  2. Отправьте тестовый живой сигнал на вход/канал

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.

b3c7b0be6276c194.png

Запустите остальную часть лабораторной работы в открывшемся окне 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 , чтобы описать канал. В выводе мы должны увидеть, что состояние потокового вещания изменилось с "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 с сегментом хранилища Live Streaming в качестве источника Media CDN.

В следующих разделах мы проверим службу Edge Cache, а затем будем транслировать перекодированное видео, используя произвольный IP-адрес Media CDN.

15. Убедитесь, что экземпляр Edge Cache Service работает.

В этом разделе мы проверим, что экземпляр службы Edge Cache работает должным образом. Для этого мы попытаемся получить доступ к файлу из экземпляра службы Edge Cache, используя IP-адрес службы Edge Cache Service. При первом обращении к объекту он еще не кэшируется. Нам предстоит наблюдать за кэшем MISS . Для первого запроса объект считывается из источника и кэшируется на границе. Все последующие попытки доступа к одному и тому же файлу будут возвращать HIT кэша, поскольку объект теперь кэшируется на границе. Давайте проверим это поведение:

Выполните следующую команду curl в Cloud Shell, чтобы получить доступ к файлу манифеста перекодированного видео, который хранится в источнике Edge Cache:

Команда

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

Обратите внимание на решение, в котором мы используем IP-адрес экземпляра службы Edge Cache для разрешения его имени. Используйте demo.cme.com:<IP> , где IP — это IP-адрес экземпляра службы Edge Cache, который мы только что создали.

Найдите в выводе заголовок x-cache-status .

Пример вывода

Added demo.cme.com:80:34.104.35.152 to DNS cache
* Hostname demo.cme.com was found in DNS cache
*   Trying 34.104.35.152:80...
* Connected to demo.cme.com (34.104.35.152) port 80 (#0)
> GET /main.m3u8 HTTP/1.1
> Host: demo.cme.com
> User-Agent: curl/7.74.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< x-guploader-uploadid: ADPycdtKtflWt4Kha5YxXNNRwO-Eu6fGSPs-T-XY4HJmNMo46VJyWlD4EAk-8a6SegxjWq3o1gTPqZbpkU_sjW__HPAdDw
< date: Wed, 07 Dec 2022 18:23:46 GMT
< last-modified: Wed, 07 Dec 2022 18:23:45 GMT
< etag: "6bff620ccca4a9849ba4e17fa7c521fb"
< x-goog-generation: 1670437425805400
< x-goog-metageneration: 1
< x-goog-stored-content-encoding: identity
< x-goog-stored-content-length: 193
< content-type: application/x-mpegURL
< x-goog-hash: crc32c=sPO3zw==
< x-goog-hash: md5=a/9iDMykqYSbpOF/p8Uh+w==
< x-goog-storage-class: STANDARD
< accept-ranges: bytes
< content-length: 193
< server: Google-Edge-Cache
< x-request-id: fd25285b-fc1a-4fd4-981a-c50ead2c85ed
< x-xss-protection: 0
< x-frame-options: SAMEORIGIN
< x-cache-status: den;miss
< cache-control: public,max-age=3600
<
{ [193 bytes data]
* Connection #0 to host demo.cme.com left intact

Обратите внимание на промах в кэше, поскольку объект еще не был кэширован и считывается из источника.

Теперь мы сделаем несколько запросов к файлу m3u8 , и если все настроено правильно, Media CDN должен начать обслуживать контент из своего кеша. Команда ниже выполнит 10 запросов на завивку и распечатает только заголовок x-cache-status .

Команда

for i in {1..10};do curl -Is --resolve demo.cme.com:80:<Replace_With_Edge_Cache_IP> "http://demo.cme.com/main.m3u8" | grep x-cache-status;done

Вывод должен представлять собой смесь hit и miss кэша. Если вы видите попадания в кэш в выходных данных, значит, Media CDN работает должным образом.

Пример вывода

x-cache-status: den;miss
x-cache-status: den;hit
x-cache-status: den;hit
x-cache-status: den;hit
x-cache-status: den;hit
x-cache-status: den;hit
x-cache-status: den;hit
x-cache-status: den;hit
x-cache-status: den;hit
x-cache-status: den;hit

Обратите внимание на попадание в кеш, поскольку объект теперь кэшируется на границе. Служба Cloud Medie Edge работает должным образом.

16. Потоковое транскодированное видео в реальном времени с помощью VLC.

Это та часть, где мы соединяем точки и связываем все шаги, над которыми мы работали до сих пор:

  • Мы создали корзину под названием live-streaming-storage-$LOGNAME , которая получает результат живого сигнала, транскодированного в контент HLS с помощью Live Streaming API.
  • Мы настроили API прямой трансляции.
  • Мы запустили прямой сигнал RTMP с помощью FFmpeg, который подает вход/канал API прямой потоковой передачи.
  • Мы проверили, что прямой сигнал подавался на канал, и убедились, что канал находится в streaming режиме.
  • Мы проверили, что полученные перекодированные файлы (сегменты манифеста и TS) были сгенерированы и сохранены в корзине live-streaming-storage-$LOGNAME .
  • Источник Edge Cache под названием cme-origin был настроен с использованием корзины GCS live-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, перейдите по адресу https://www.videolan.org/vlc/ и загрузите версию проигрывателя для операционной системы вашего ноутбука. VLC доступен для Windows, MacOSX, Linux, Android и iOS.

2a2d19abe728d222.png

Установите плеер на свой ноутбук и запустите его. Для следующих нескольких шагов мы будем использовать версию плеера для MacOSX.

Для того, чтобы воспроизвести видео, перейдите в «Файл»/«Открыть сеть»:

f85565301f7c68dc.png

Настройте его с помощью:

  • URL-адрес: http://<Replace_With_Edge_Cache_IP>/main.m3u8 . Это URL-адрес видео, которое мы хотим транслировать. Уведомление:
  • IP-адрес экземпляра Media CDN: 34.105.35.246 . Замените его IP-адресом развернутой службы Cloud Media.
  • Путь к видеофайлу манифеста: « / ». Это путь, который мы использовали в сегменте live-streaming-storage-$LOGNAME для хранения перекодированных файлов сигналов реального времени. Здесь путь — это корневой путь: «/».
  • Имя видеофайла манифеста: файл манифеста HLS, main.m3u8 .

И нажмите «Открыть». Вы должны увидеть, как начинает воспроизводиться перекодированное живое видео. Видео будет выглядеть как на скриншоте ниже. Счетчик на экране будет работать с шагом 1, и вы услышите непрерывный звуковой сигнал.

Это базовый тестовый живой сигнал RTMP, сгенерированный FFmpeg, транскодированный в HLS API Live Streaming и подаваемый через кеш Media CDN:

28fc359b49d44ec2.png

Если хотите, вы можете использовать любой другой проигрыватель HLS и MPEG DASH. Вот некоторые из них, которые вы можете рассмотреть:

  • Quicktime player — установлен по умолчанию на компьютерах Mac. То же самое и здесь: откройте сетевое подключение к http://34.104.36.157/main.m3u8 — замените IP-адрес на адрес вашего экземпляра службы Edge Cache.

17. Мониторинг медиа CDN

Шаблон информационной панели Media CDN был создан командой SME — https://gist.github.com/elithrar/1c511d00f5cd3736fb2a3897867209c1 .

Чтобы установить его, выполните следующие команды в окне Cloud Shell:

Загрузите YAML-файл:

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

Создайте панель мониторинга для облачного мониторинга:

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

Настройка может занять несколько минут. Перейдите в Google Cloud Console и нажмите на три панели > Операции > Мониторинг > Панели мониторинга. Вы должны увидеть панель мониторинга под названием «Метрики Media Edge». Нажмите на нее, и вы увидите показатели:

d0821d84a88a928d.png

18. Очистите лабораторную среду.

Поздравляю с завершением лабораторной работы. В этом разделе мы удалим все ресурсы, которые мы создали в лаборатории.

Остановите сигнал FFmpeg:

Нажмите <CTRL+C> на терминале Cloud Shell, на котором работает FFmpeg.

Остановите канал прямой трансляции:

Команда

curl -X POST \
-H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
-H "Content-Type: application/json; charset=utf-8" \
-d "" \
"https://livestream.googleapis.com/v1/projects/$PROJECT_NUMBER/locations/$LOCATION/channels/$CHANNEL_ID:stop"

Удалите канал прямой трансляции:

Команда

curl -X DELETE -H "Authorization: Bearer "$(gcloud auth application-default print-access-token) "https://livestream.googleapis.com/v1/projects/$PROJECT_NUMBER/locations/$LOCATION/channels/$CHANNEL_ID"

Удалите конечную точку ввода потоковой передачи в реальном времени:

Команда

curl -X DELETE \
-H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
"https://livestream.googleapis.com/v1/projects/$PROJECT_NUMBER/locations/$LOCATION/inputs/$INPUT_ID"

Удалите сегмент GCS:

Команда

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

Удалите экземпляр службы Edge Cache:

Команда

gcloud edge-cache services delete cme-demo

Подтвердите удаление, введя «Y» при появлении запроса.

Удалите источник Edge Cache:

Команда

gcloud edge-cache origins delete cme-origin

Подтвердите удаление, введя «Y» при появлении запроса.

Удалить пользовательскую панель мониторинга

Команда

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