Transmitowanie na żywo w Google Cloud z użyciem Media CDN i interfejsu Live Streaming API

1. Wprowadzenie

Sieci dystrybucji treści (CDN) zwiększają wydajność dla użytkowników dzięki przechowywaniu w pamięci podręcznej treści, do których użytkownicy często uzyskują dostęp, kończeniu połączeń bliżej klientów, ponownemu używaniu połączeń z punktem początkowym oraz wdrażaniu nowoczesnych protokołów sieciowych i dostosowań. Dla użytkowników (i naszych klientów) oznacza to mniejsze opóźnienia, większą niezawodność i niższe koszty, co przekłada się na lepsze wyniki sprzedaży, wygodę korzystania z internetu i ogólne zwiększenie wygody użytkowników. Obecnie bardzo niewiele nowoczesnych witryn i platform do strumieniowego przesyłania filmów działa bez sieci CDN.

Czego się nauczysz

W tym laboratorium dowiesz się, jak wdrożyć środowisko przepływu pracy dotyczące strumieniowego przesyłania danych na żywo za pomocą Media CDN (CDN) + interfejsu Cloud Media Live Streaming API (transkodowanie wideo na żywo) + Cloud Storage (magazyn dla filmów) + odtwarzacz wideo (VLC, Google Shaka Player itp. – odtwarzacz obsługujący HLS i MPEG-DASH).

Skonfigurujemy komponenty interfejsu Live Streaming API – Input (wejście) i Channel (kanał) – oraz uruchomimy transmisję na żywo do wejścia lub kanału za pomocą FFmpeg (FFmpeg może wygenerować sygnał testowy na żywo). Interfejs Live Streaming API przekoduje transmisję na żywo. Przetworzony manifest wideo i segmenty zostaną zapisane w zasobniku Cloud Storage. Następnie skonfigurujemy Media CDN, używając zasobnika Cloud Storage z filmem na żywo jako punktu początkowego. Odtwarzacz VLC będzie też służył do odtwarzania treści na żywo z pamięci podręcznej w sieci CDN Media. Skonfigurujemy też panel Cloud Monitoring, aby wizualizować aktywność Media CDN.

Co utworzysz

W tym laboratorium skonfigurujemy środowisko oparte na tej architekturze:

de33cb3e75d52549.png

W ramach tego modułu skonfigurujemy te komponenty i wykonamy te zadania:

  • Utwórz zasobnik Google Cloud Storage (GCS) na potrzeby przechowywania transkodowanych filmów z transmisji na żywo.
  • Skonfiguruj interfejs Live Streaming API, aby przekonwertować wideo do wielu formatów: HLS + MPEG DASH, SD i HD.
  • Skonfiguruj komponenty transmisji na żywo: wejście/kanał
  • Uruchamianie kanału transmisji na żywo
  • Konfigurowanie Media CDN z zasobnikiem GCS jako punktem początkowym
  • Skonfiguruj FFmpeg do przesyłania danych do kanału na żywo
  • Transkodowany przekaz na żywo można przesyłać strumieniowo za pomocą odtwarzacza wideo.
  • Skonfiguruj panel Cloud Monitoring, aby monitorować aktywność Media CDN (czas oczekiwania, trafienia w pamięci podręcznej, braki w pamięci podręcznej itd.).

Uwaga: w tym praktycznym laboratorium zakładamy, że użytkownicy mają dostęp do konsoli Google Cloud i mają już skonfigurowany projekt. Zakładamy też, że użytkownicy zaczynają od świeżego środowiska i nie mają nic skonfigurowanego na potrzeby tego demonstracyjnego scenariusza.

Wszystkie działania związane z konfiguracją będą wykonywane w wierszu poleceń w Cloud Shell. Skonfigurowane komponenty możesz zawsze sprawdzić w konsoli za pomocą wiersza poleceń. W trakcie tego modułu będziemy korzystać z konsoli Google Cloud.

2. Zanim zaczniesz

Dostęp do CDN multimediów jest ograniczony. Aby uzyskać dostęp do Media CDN, skontaktuj się z zespołem ds. kont. Będzie on mógł poprosić o dostęp w Twoim imieniu. Jeśli pracujesz w Google i chcesz przetestować strumieniowe przesyłanie danych za pomocą Media CDN, skontaktuj się z Menedżerem produktu Media CDN, aby poprosić o dostęp do tej usługi.

3. Konfiguracja i wymagania

Uruchamianie Cloud Shell

Google Cloud można obsługiwać zdalnie z laptopa, ale w tym ćwiczeniu będziesz używać Google Cloud Shell, czyli środowiska wiersza poleceń działającego w chmurze.

W konsoli Google Cloud kliknij ikonę Cloud Shell na pasku narzędzi w prawym górnym rogu:

55efc1aaa7a4d3ad.png

Uzyskanie dostępu do środowiska i połączenie się z nim powinno zająć tylko kilka chwil. Po jego zakończeniu powinno wyświetlić się coś takiego:

7ffe5cbb04455448.png

Ta maszyna wirtualna zawiera wszystkie potrzebne narzędzia dla programistów. Zawiera stały katalog domowy o pojemności 5 GB i działa w Google Cloud, co znacznie poprawia wydajność sieci i uwierzytelnianie. Wszystkie zadania w tym CodeLab możesz wykonać w przeglądarce. Nie musisz niczego instalować.

4. Wersja Google Cloud SDK

W chwili powstawania tego tekstu najnowsza wersja pakietu Google Cloud SDK to 408.0.0. Wszystkie polecenia w tym module zostały przetestowane za pomocą najnowszej wersji pakietu Google Cloud SDK. Zanim przejdziesz dalej, sprawdź, czy Cloud Shell używa najnowszej wersji pakietu SDK.

Sprawdzanie wersji pakietu SDK

Aby sprawdzić wersję pakietu SDK, użyjemy polecenia gcloud version.

Command

gcloud version | grep "Google Cloud SDK"

Przykład danych wyjściowych

Google Cloud SDK 408.0.0

Następne kroki

  1. Jeśli wersja pakietu SDK to 408.0.0 lub nowsza, przejdź do następnej sekcji.
  2. Jeśli wersja pakietu SDK jest niższa niż 408.0.0, uaktualnij go, wykonując podane niżej polecenie.
sudo apt-get update && sudo apt-get install google-cloud-sdk

5. Wymagania wstępne

Zanim zaczniemy konfigurować zasoby GCP, musimy wykonać te czynności:

  1. Konfigurowanie zmiennych środowiskowych
  2. Włączanie wymaganych interfejsów API usługi

1. Konfigurowanie zmiennych środowiskowych

W tym laboratorium będziemy uruchamiać polecenia gcloud i curl z kilkoma zmiennymi. Musimy skonfigurować te zmienne środowiskowe.

  • Identyfikator projektu
  • Numer projektu
  • Nazwa użytkownika
  • Region
  • Identyfikator wejścia
  • Identyfikator kanału

Identyfikator projektu i nazwa użytkownika

Te zmienne środowiskowe są zwykle wstępnie skonfigurowane w Cloudshell. Aby to sprawdzić, użyjemy polecenia env.

Command

env | grep -E 'DEVSHELL_PROJECT_ID=|LOGNAME'

Przykład danych wyjściowych

DEVSHELL_PROJECT_ID=<YOUR_PROJECT_ID>
LOGNAME=<YOUR_USERNAME>

Tworzenie pliku env_variables

Aby utworzyć plik env_variables.txt, użyj polecenia cat. To polecenie utworzy plik env_variables.txt w katalogu głównym użytkownika.

Polecenia

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

Konfigurowanie zmiennych środowiskowych

Aby ustawić zmienne środowiskowe, użyjemy polecenia source.

Command

source ~/env_variables.txt

Sprawdź, czy zmienne są ustawione

Sprawdźmy, czy wszystkie wymagane zmienne środowiskowe są ustawione. W wyjściu powinno być łącznie 6 zmiennych środowiskowych.

Command

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

Przykład danych wyjściowych

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. Włączanie wymaganych interfejsów API usług

Musimy się upewnić, że w naszym projekcie są włączone te interfejsy API.

  • Network Services API
  • Certificate Manager API
  • Interfejs Livestream API
  • Media CDN Edge Cache API

Włącz interfejs Network Services API

Aby włączyć interfejs Network Services API, uruchom to polecenie:

Command

gcloud services enable networkservices.googleapis.com

Włącz interfejs Certificate Manager API

Aby włączyć interfejs Certificate Manager API, uruchom to polecenie:

Command

gcloud services enable certificatemanager.googleapis.com

Włączanie interfejsu Live Stream API

Aby włączyć interfejs Live Stream API, uruchom to polecenie:

Command

gcloud services enable livestream.googleapis.com

Włącz interfejs Media CDN Edge Cache API

Aby włączyć interfejs Media CDN Edge Cache API, uruchom to polecenie:

Command

gcloud services enable edgecache.googleapis.com

Sprawdź, czy interfejsy API są włączone

Uruchom polecenie gcloud services list, aby wyświetlić listę wszystkich włączonych interfejsów API. W wyniku powinny się pojawić 4 interfejsy API.

Command

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

Przykład danych wyjściowych

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

6. Tworzenie zasobnika Cloud Storage

W tej sekcji:

  1. Tworzenie zasobnika Cloud Storage
  2. Ustawianie zasobnika jako dostępnego publicznie

W dalszej części modułu użyjemy tego zasobnika do przechowywania transkodowanych plików wideo. Ten zasobnik będzie też pełnić rolę źródła dla usługi Media CDN.

1. Tworzenie zasobnika

Aby utworzyć zasób, użyjemy polecenia gsutil mb:

Command

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

2. Ustawianie zasobnika jako dostępnego publicznie

Aby udostępnić pliki publicznie, użyjemy polecenia gsutil iam:

Command

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

7. Konfigurowanie środowiska interfejsu Live Streaming API

Komponenty łańcucha interfejsu Live Streaming API są skonfigurowane w ten sposób:

96b5d26aedeb89a6.png

W poprzedniej sekcji utworzyliśmy zasobnik Cloud Storage live-streaming-storage-$LOGNAME. W następnych 2 sekcjach utworzymy te zasoby:

  • Transmitowanie na żywo: punkt końcowy wejścia to punkt końcowy, do którego koder wysyła strumień wejściowy. Za pomocą punktu końcowego wejścia możesz określić konfiguracje strumienia, takie jak rozdzielczość wejścia, typ wejścia i przycinanie filmu.
  • Kanał transmisji na żywo: kanał to zasób, który przetwarza strumień wejściowy za pomocą punktu końcowego wejściowego, transkoduje strumień wejściowy na wiele wersji i publikuje wyjściowe transmisje na żywo w określonych formatach w określonym miejscu. Możesz umieścić główny i zapasowy strumień danych na tym samym kanale.

W dalszej części tego modułu utworzymy te zasoby:

  • Kodowanie: koder to program służący do wysyłania strumieni danych wejściowych. W tym module użyjemy FFmpeg.

8. Tworzenie i konfigurowanie wejściowego punktu końcowego

Tworzenie pliku input.json

Utworzymy plik input.json, aby określić typ sygnału transmisji na żywo. W tym laboratorium używamy sygnału RTMP na żywo.

Command

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

Tworzenie wejściowego punktu końcowego

W momencie pisania tego laboratorium interfejs Live Stream API nie był obsługiwany przez gcloud. Do wywoływania interfejsu API użyjemy polecenia curl.

Command

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"

Przykład danych wyjściowych

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

Wyjście zawiera wiele przydatnych informacji, ale w tej chwili musimy skupić się na 2 polach:

  • Identyfikator operacji: skopiuj z wyjścia identyfikator operacji. Poniżej znajduje się identyfikator operacji z przykładu danych wyjściowych. Znajdziesz go w wierszu wyjściowym zaczynającym się od "name". "operation-1661405972853-5e70a38d6f27f-79100d00-310671b4"
  • Stan: musimy zaczekać, aż stan zmieni się z "done": false na "done": true.

Sprawdzanie stanu

Zanim przejdziemy dalej, musimy sprawdzić, czy punkt końcowy danych wejściowych został utworzony i czy jest gotowy do użycia.

W poniższym poleceniu zastąp <OPERATION> identyfikatorem operacji, który właśnie otrzymaliśmy. W tym przykładzie jest to "operation-1661405972853-5e70a38d6f27f-79100d00-310671b4".

Command

export OPERATION_ID_1=<OPERATION>

Command

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"

Przykład danych wyjściowych

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

Ponownie uruchom polecenie, aż zobaczysz "done:true", co oznacza, że wejściowy punkt końcowy został utworzony i jest gotowy.

Zapisz identyfikator URI

W dalszej części tego modułu użyjemy URI z poprzednich danych wyjściowych. Skonfigurujmy teraz zmienną środowiskową dla URI.

Command

export URI=<uri>

Zastąp <uri> adresem URI zapisanym powyżej. Opcjonalnie możesz też użyć metody GET, aby pobrać identyfikator URI.

Command

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. Tworzenie i konfigurowanie kanału transmisji na żywo

Utwórz kanał transmisji na żywo powiązany z wejściowym punktem końcowym utworzonym w poprzedniej sekcji. W tym przykładzie tworzymy kanał generujący transmisję na żywo HLS, która składa się z jednej wersji w wysokiej rozdzielczości (1280 × 720). Kanał zostanie powiązany z wejściowym punktem końcowym i zasobnikiem na dane utworzonym wcześniej.

Tworzenie pliku channel.json

Aby utworzyć plik "channel.json", w terminalu Cloud Shell wpisz to polecenie:

Command

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

Tworzenie kanału

Aby utworzyć kanał, uruchom to polecenie curl:

Command

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"

Przykład danych wyjściowych

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

Zapisz i skopiuj identyfikator operacji. Będziemy go potrzebować w jednym z kolejnych kroków. Znajdziesz go w wierszu wyjściowym zaczynającym się od "name".

Sprawdzanie stanu

Zanim przejdziemy dalej, musimy sprawdzić, czy kanał został utworzony i czy jest gotowy.

W poniższym poleceniu zastąp <OPERATION> identyfikatorem operacji, który właśnie otrzymaliśmy. W tym przykładzie jest to operation-1661405972853-5e70a38d6f27f-79100d00-310671b4

Command

export OPERATION_ID_2=<OPERATION>

Command

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"

Przykład danych wyjściowych

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

Ponownie uruchom polecenie, aż zobaczysz "done:true", co oznacza, że wejściowy punkt końcowy został utworzony i jest gotowy.

Pamiętaj, że "streamingState" w tej chwili to "STOPPED". Kanał uruchomimy w następnej sekcji.

10. Uruchamianie kanału transmisji na żywo

Utworzyliśmy już kanał transmisji na żywo, więc możemy go uruchomić. W tej sekcji:

  1. Uruchamianie kanału transmisji na żywo
  2. Sprawdź stan kanału. Musimy się upewnić, że streamingState to "AWAITING INPUT"

1. Uruchom kanał

Aby uruchomić kanał, w Cloud Shell uruchom to polecenie: curl

Command

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"

Przykład danych wyjściowych

{
  "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. Sprawdzanie stanu kanału

Aby uzyskać stan kanału, uruchom to polecenie curl:

Command

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"

Przykład danych wyjściowych

"streamingState": "AWAITING_INPUT",

Ponownie uruchom polecenie, aż zobaczysz „AWAITING_INPUT”, co oznacza, że kanał działa i jest gotowy do odbioru sygnału.

11. Konfigurowanie Media CDN

W tej sekcji wdrożymy Media CDN, czyli infrastrukturę CDN. Utworzymy te zasoby:

  1. Punkt początkowy tymczasowego przechowywania danych na serwerach brzegowych
  2. Usługa tymczasowego przechowywania danych na serwerach brzegowych

1. Tworzenie punktu początkowego tymczasowego przechowywania danych na serwerach brzegowych

Źródło pamięci podręcznej Edge reprezentuje lokalizację treści, np. zasobnik Cloud Storage, zewnętrzna lokalizacja pamięci masowej lub system równoważenia obciążenia. W terminologii CDN źródło (lub serwer źródłowy) to lokalizacja, w której znajduje się źródło treści, które chcemy rozpowszechniać, np. wszystkie pliki CSS, JavaScript, HTML, obrazy itp. W tym module utworzymy źródło, które odwzorowuje zasobnik Cloud Storage utworzony na początku tego modułu. Punkt początkowy tymczasowego przechowywania danych na serwerach brzegowych będzie nazywał się cme-origin. Punkt początkowy sieci CDN to miejsce, w którym przechowywane są wszystkie treści źródłowe przed ich rozpowszechnieniem na serwerach tymczasowego przechowywania danych na serwerach brzegowych.

Użyjemy polecenia gcloud edge-cache origins create, aby utworzyć źródło. Wykonanie tego polecenia może potrwać kilka minut.

Command

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

Przykładowe dane wyjściowe

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. Tworzenie usługi tymczasowego przechowywania danych na serwerach brzegowych

Gdy skonfigurujemy punkt początkowy tymczasowego przechowywania danych na serwerach brzegowych, możemy utworzyć samą usługę tymczasowego przechowywania danych na serwerach brzegowych.

Tworzenie pliku cme-demo.yaml

Konfiguracja usługi tymczasowego przechowywania danych na serwerach brzegowych jest wykonywana za pomocą pliku YAML. W Cloud Shell utwórz lokalny plik o nazwie cme-demo.yaml. Użyj edytora vi, nano lub dowolnego innego i wklej te wiersze w pliku 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

Wszystkie ustawienia usługi tymczasowego przechowywania danych na serwerach brzegowych pozostaną domyślne. W tym pliku znajdują się 3 wartości pól, które użytkownicy mogą zmienić:

  • name: nazwa instancji Media CDN – tutaj: cme-demo
  • hosts: lista nazw domen, które zostaną rozwiązane przez tę usługę CDN Media – tutaj: demo.cme.com. Użyjemy go w trakcie tego pokazu. Użyjemy adresu IP instancji CDN multimediów.
  • Origin: to punkt początkowy tymczasowego przechowywania danych na serwerach brzegowych utworzony w poprzednim kroku. Ustaw wartość na cme-origin – nazwę punktu początkowego Media CDN.

Więcej informacji o różnych zmiennych, których można używać w pliku YAML, znajdziesz w przewodniku po konfigurowaniu usługi Edge Cache Service.

Tworzenie usługi tymczasowego przechowywania danych na serwerach brzegowych

Utworzymy usługę tymczasowego przechowywania danych na serwerach brzegowych o nazwie cme-demo w punkcie początkowym tymczasowego przechowywania danych na serwerach brzegowych cme-origin z hostem demo.cme.com. Aby utworzyć usługę, uruchom w Cloud Shell to polecenie:

Command

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

Tworzenie usługi tymczasowego przechowywania danych na serwerach brzegowych może potrwać kilka minut.

Przykład danych wyjściowych

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'

Zanotuj i skopiuj ipv4Addresses instancji usługi tymczasowego przechowywania danych na serwerach brzegowych – tutaj 34.104.36.157. Użyjemy go do zaktualizowania pliku cme-demo.yaml, a później do strumieniowego przesyłania transkodowanego filmu.

Aktualizowanie usługi tymczasowego przechowywania danych na serwerach brzegowych

W tym momencie warto zaktualizować konfigurację usługi Edge Cache Service, aby móc później używać adresu IP tej usługi do strumieniowego przesyłania filmów. Plik YAML usługi tymczasowego przechowywania danych na serwerach brzegowych umożliwia podanie listy wszystkich nazw hostów lub adresów IP, z których usługa tymczasowego przechowywania danych na serwerach brzegowych będzie przyjmować żądania. Na tym etapie jako hosta określono tylko demo.cme.com. Aby zapewnić rozpoznawanie nazw w tej domenie, skonfiguruj strefę DNS. Łatwiej jednak będzie dodać adres IP do listy hostów w pliku yaml. Ponownie otwórz plik YAML i zmień go tak, aby wyglądał jak poniżej:

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

Aby odzwierciedlić zmiany, wystarczy ponownie zaimportować plik YAML. W terminalu Cloud Shell uruchom to polecenie:

Command

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

Sprawdź dane wyjściowe polecenia i sprawdź, czy adres IP znajduje się na liście hostów.

W tym momencie instancja usługi Edge Cache Service będzie akceptować żądania z wartością "demo.cme.com" lub adresem IP jako hostem.

12. Generowanie sygnału wejściowego

Skonfigurowaliśmy już wszystkie wymagane usługi, więc wygenerujmy sygnał wejściowy transmisji na żywo. W tej sekcji:

  1. Zainstaluj FFmpeg, czyli bezpłatne oprogramowanie open source.
  2. Wysyłanie testowego sygnału na żywo do wejścia/kanału

1. Instalowanie FFmpeg

FFmpeg to bezpłatny projekt oprogramowania typu open source, który składa się z pakietu bibliotek i programów do obsługi plików i strumieni wideo, dźwięku i innych plików multimedialnych. Aby zainstalować FFmpeg, w terminalu Cloud Shell użyj tego polecenia:

Command

sudo apt install ffmpeg -y

Po zakończeniu instalacji sprawdź, czy FFmpeg zostało prawidłowo zainstalowane. Aby to zrobić, sprawdź jego wersję:

Command

ffmpeg -version

Przykład danych wyjściowych

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

FFmpeg został prawidłowo zainstalowany.

2. Rozpocznij transmisję na żywo do wejścia/kanału.

Po zainstalowaniu FFmpeg wyślemy testowy strumień wejściowy do wejściowego punktu końcowego, aby wygenerować transmisję na żywo.

W terminalu Cloud Shell uruchom to polecenie, używając zmiennej środowiskowej URI utworzonej w sekcji „Tworzenie i konfigurowanie punktu końcowego danych wejściowych”.

Command

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

Powinieneś zobaczyć, że FFmpeg wysyła sygnał testowy na żywo. Polecenie nie zwróci prompta. Sygnał będzie generowany, dopóki go nie przerwiesz. Na potrzeby dalszej części laboratorium musisz otworzyć nowe okno Cloud Shell.

13. Otwieranie nowej sesji Cloud Shell

Aby kontynuować pracę z tym laboratorium, musisz otworzyć nowe okno Cloud Shell, ponieważ FFmpeg będzie działać do momentu, aż nie wciśniesz <CTRL+C>, aby zatrzymać polecenie i w ten sposób zatrzymać generowanie sygnału na żywo.

Kliknij znak „+” obok nazwy bieżącego terminala Cloud Shell. Otworzy się dodatkowe okno Cloud Shell.

b3c7b0be6276c194.png

Przeprowadź pozostałą część ćwiczenia w nowo otwartym oknie Cloud Shell.

Konfigurowanie zmiennych środowiskowych

Ponieważ jest to nowa sesja Cloud Shell, musimy ponownie ustawić zmienne środowiskowe. Aby ustawić zmienne środowiskowe, użyjemy polecenia source.

Command

source ~/env_variables.txt

Sprawdź, czy zmienne są ustawione

Sprawdźmy, czy wszystkie wymagane zmienne środowiskowe są ustawione. W wyjściu powinno być łącznie 6 zmiennych środowiskowych.

Command

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

Przykład danych wyjściowych

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. Sprawdź, czy sygnał na żywo jest przekodowywany

Uruchomimy curl, aby opisać kanał. W wyniku powinno być widać, że stan streamingState zmienił się z "AWAITING_INPUT" na "STREAMING"

Command

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"

W odpowiedzi w pliku wyjściowym JSON powinien pojawić się element "streamingState": "STREAMING", co oznacza, że kanał jest przesyłany strumieniowo, a sygnał na żywo jest transkodowany.

Sprawdźmy też zawartość zasobnika, w którym powinniśmy znaleźć plik manifestu i kilka segmentów wideo TS. Uruchom to polecenie w Cloud Shell, aby wyświetlić zawartość zasobnika utworzonego na początku modułu, którego używa interfejs Live Streaming API do generowania przetranskodowanego pliku manifestu sygnału na żywo i segmentów wideo TS:

Command

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

Przykład danych wyjściowych

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

Zobaczysz, że:

  • plik manifestu HLS: main.m3u8
  • Odpowiednie segmenty wideo TS: seria ponumerowanych plików segment-000000000X.ts

W tym momencie skończyliśmy:

  • Interfejs Live Streaming API: sygnał na żywo jest generowany i transkodowany do puli za pomocą interfejsu Live Streaming API.
  • Media CDN: skonfigurowana usługa Media CDN z zasobnikiem do przechowywania danych do transmisji na żywo jako punktem początkowym.

W kolejnych sekcjach zweryfikujemy usługę Edge Cache Service, a następnie strumieniowo prześlemy przekonwertowane wideo, korzystając z adresu IP anycast Media CDN.

15. Sprawdzanie, czy instancja usługi Edge Cache Service działa

W tej sekcji sprawdzimy, czy instancja usługi tymczasowego przechowywania danych na serwerach brzegowych działa zgodnie z oczekiwaniami. W tym celu spróbujemy uzyskać dostęp do pliku z instancji usługi Edge Cache Service przy użyciu adresu IP usługi Edge Cache Service. Gdy po raz pierwszy uzyskujesz dostęp do obiektu, nie jest on jeszcze zapisany w pamięci podręcznej. Powinniśmy zaobserwować pamięć podręczną MISS. W przypadku pierwszego żądania obiekt jest odczytywany z źródła i przechowywany w pamięci podręcznej na brzegu. Wszystkie kolejne próby uzyskania dostępu do tego samego pliku będą zwracać pamięć podręczną HIT, ponieważ obiekt jest teraz przechowywany w pamięci podręcznej na brzegu. Sprawdźmy to zachowanie:

Aby uzyskać dostęp do przetworzonego pliku manifestu wideo, który jest przechowywany w Edge Cache Origin, uruchom w Cloud Shell to polecenie: curl.

Command

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

Zwróć uwagę, że do rozpoznawania nazwy używamy adresu IP instancji usługi Edge Cache Service. Upewnij się, że używasz demo.cme.com:<IP>, gdzie IP to adres IP utworzonej przez nas instancji usługi Edge Cache Service.

W wyniku odszukaj nagłówek x-cache-status.

Przykład danych wyjściowych

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

Zwróć uwagę na brak odpowiedzi z pamięci podręcznej, ponieważ obiekt nie został jeszcze zapisany w pamięci podręcznej i jest odczytywany z źródła.

Teraz wyślemy kilka żądań pliku m3u8. Jeśli wszystko jest prawidłowo skonfigurowane, CDN Media powinien zacząć dostarczać treści z pamięci podręcznej. To polecenie wyśle 10 żądań curl i wydrukuje tylko nagłówek x-cache-status.

Command

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

Dane wyjściowe powinny być kombinacją pamięci podręcznej hit i miss. Jeśli w wynikach widzisz trafienia w pamięci podręcznej, oznacza to, że Media CDN działa zgodnie z oczekiwaniami.

Przykład danych wyjściowych

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

Zwróć uwagę na trafienie do pamięci podręcznej, ponieważ obiekt jest teraz przechowywany w pamięci podręcznej na brzegu sieci. Usługa Cloud Media Edge działa zgodnie z oczekiwaniami.

16. Transkodowanie transmisji wideo z sygnału na żywo i strumieniowanie za pomocą VLC

W tej części połączymy kropki i połączymy wszystkie kroki, nad którymi pracowaliśmy do tej pory:

  • Utworzyliśmy zbiornik o nazwie live-streaming-storage-$LOGNAME, który odbiera sygnał z transmisji na żywo przekodowany na treści HLS przez interfejs Live Streaming API.
  • Skonfigurowaliśmy interfejs Live Streaming API.
  • Rozpoczęliśmy przesyłanie sygnału RTMP za pomocą FFmpeg do wejścia/kanału interfejsu Live Streaming API.
  • Potwierdzono, że sygnał na żywo został przesłany na kanał i że kanał był w trybie streaming.
  • Potwierdzono, że wygenerowane pliki po transkodowaniu (manifest i segmenty TS) zostały utworzone i zapisane w zasobniku live-streaming-storage-$LOGNAME.
  • Punkt początkowy tymczasowego przechowywania danych na serwerach brzegowych o nazwie cme-origin został skonfigurowany z zasobnikiem GCS live-streaming-storage-$LOGNAME jako punktem początkowym.
  • Konfiguracja instancji tymczasowego przechowywania danych na serwerach brzegowych o nazwie cme-demo z użyciem punktu początkowego cme-origin.
  • Zweryfikowaliśmy działanie (niepowodzenie pamięci podręcznej, trafienie do pamięci podręcznej) instancji usługi Edge Cache Service.

Obecnie możemy używać odtwarzacza wideo do przesyłania strumieniowego transkodowanego sygnału na żywo za pomocą pamięci podręcznej CDN Media. Aby to zrobić, użyjemy odtwarzacza VLC. VLC Player to bezpłatny, oparty na open source odtwarzacz multimedialny i środowisko programistyczne, które obsługuje większość plików multimedialnych. Odtwarza adaptacyjne formaty multimediów (np. DASH i HLS). Korzysta on z zasady adaptacyjnego strumieniowania – w zależności od jakości połączenia z internetem i dostępnej przepustowości odtwarzacz dostosowuje jakość odtwarzanego filmu. Podczas ostatniego procesu transkodowania użyliśmy domyślnych wstępnie ustawionych wartości i wygenerowaliśmy „tylko” 2 jakości: SD i HD. Gdy zaczniemy odtwarzać film w odtwarzaczu, powinien on zacząć odtwarzać w formacie SD, a następnie szybko przełączyć się na format HD, jeśli połączenie z siecią będzie wystarczająco dobre.

Transkodujemy sygnał na żywo i prześlemy go strumieniowo w formacie HLS (powszechnie obsługiwanym formacie wideo Apple). Odpowiedni plik nosi nazwę main.m3u8 i jest plikiem manifestu HLS. Plik manifestu wskazuje na segmenty wideo TS.

Aby korzystać z odtwarzacza VLC, otwórz stronę https://www.videolan.org/vlc/ i pobierz wersję odtwarzacza dla systemu operacyjnego laptopa. VLC jest dostępny na systemy Windows, MacOSX, Linux, Android i iOS.

2a2d19abe728d222.png

Zainstaluj odtwarzacz na laptopie i uruchom go. W kolejnych krokach użyjemy odtwarzacza w wersji na MacOSX.

Aby odtworzyć film, kliknij „Plik” lub „Otwórz sieć”:

f85565301f7c68dc.png

Skonfiguruj je za pomocą:

  • Adres URL: http://<Replace_With_Edge_Cache_IP>/main.m3u8. To jest adres URL filmu, który chcemy przesyłać strumieniowo. Uwaga:
  • Adres IP instancji Media CDN: 34.105.35.246. Zastąp adresem IP zaimplementowanej usługi Cloud Media Service.
  • Ścieżka do pliku manifestu wideo: „/”. Jest to ścieżka użyta w zasobniku live-streaming-storage-$LOGNAME do przechowywania transkodowanych plików sygnału na żywo. Ścieżka to tutaj ścieżka katalogu głównego: „/”.
  • Nazwa pliku wideo manifestu: plik manifestu HLS, main.m3u8.

Kliknij „Otwórz”. Powinien rozpocząć się odtwarzanie przetranskodowanego filmu na żywo. Film będzie wyglądał jak na zrzucie ekranu poniżej. Licznik na ekranie będzie odliczać w krokach po 1 i powinieneś usłyszeć ciągły sygnał dźwiękowy.

Jest to podstawowy sygnał testowy RTMP wygenerowany przez FFmpeg, przekonwertowany do HLS przez interfejs Live Streaming API i przesłany przez pamięć podręczną Media CDN:

28fc359b49d44ec2.png

Jeśli chcesz, możesz użyć dowolnego innego odtwarzacza HLS i MPEG DASH. Oto kilka opcji do rozważenia:

  • Odtwarzacz Quicktime – domyślnie instalowany na komputerach Mac. U mnie to samo: otwórz połączenie sieciowe z http://34.104.36.157/main.m3u8 – zastąp adres IP adresem instancji usługi Edge Cache Service.

17. Monitorowanie Media CDN

Szablon panelu Media CDN został utworzony przez zespół SME: https://gist.github.com/elithrar/1c511d00f5cd3736fb2a3897867209c1.

Aby go zainstalować, uruchom w oknie Cloud Shell te polecenia:

Pobierz plik YAML:

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

Utwórz panel Cloud Monitoring:

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

Konfiguracja może potrwać kilka minut. Otwórz konsolę Google Cloud i kliknij 3 paski > Operacje > Monitorowanie > Panele. Powinien wyświetlić się panel o nazwie „Dane Media Edge”. Kliknij go, aby wyświetlić dane:

d0821d84a88a928d.png

18. Czyszczenie środowiska modułu

Gratulujemy ukończenia laboratorium. W tej sekcji usuniemy wszystkie zasoby utworzone w ramach tego modułu.

Zatrzymanie sygnału FFmpeg:

Naciśnij <CTRL+C> w terminalu Cloud Shell, w którym działa FFmpeg.

Zatrzymanie kanału transmisji na żywo:

Command

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"

Aby usunąć kanał transmisji na żywo:

Command

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"

Usuń punkt końcowy wejścia transmisji na żywo:

Command

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"

Usuwanie zasobnika GCS:

Command

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

Usuwanie instancji usługi tymczasowego przechowywania danych na serwerach brzegowych:

Command

gcloud edge-cache services delete cme-demo

Potwierdź usunięcie, wpisując „Y” (tak), gdy pojawi się odpowiedni komunikat

Usuwanie punktu początkowego tymczasowego przechowywania danych na serwerach brzegowych:

Command

gcloud edge-cache origins delete cme-origin

Potwierdź usunięcie, wpisując „Y” (tak), gdy pojawi się odpowiedni komunikat

Usuwanie panelu niestandardowego

Command

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