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

1. Wprowadzenie

Sieci dostarczania treści (CDN) zwiększają wydajność użytkowników przez buforowanie często używanych treści bliżej użytkowników, przerywanie połączeń bliżej klientów, ponowne wykorzystywanie połączeń ze źródłem oraz stosowanie nowoczesnych protokołów sieciowych i dostosowań. W przypadku użytkowników (i naszych klientów) oznacza to krótszy czas oczekiwania, większą niezawodność i mniejsze koszty, a w efekcie wzrost sprzedaży i wygody korzystania z internetu oraz zwiększona satysfakcja użytkowników. Obecnie bardzo niewiele witryn i platform streamingowych nie ma sieci CDN.

Czego się nauczysz

W tym module dowiesz się, jak wdrożyć środowisko strumieniowania na żywo: Media CDN (CDN) + Cloud Media Live Streaming API (transkodowanie wideo na żywo) + Cloud Storage (miejsce na filmy) + odtwarzacz wideo (VLC, Google Shaka Player itp. – odtwarzacz obsługujący HLS + MPEG-DASH).

Skonfigurujemy komponenty interfejsu Live Streaming API – dane wejściowe i kanał – oraz uruchomimy transmisję na żywo do wejścia/kanału za pomocą FFmpeg (FFmpeg może wygenerować sygnał testowy na żywo). Interfejs Live Streaming API transkoduje transmisję na żywo. Transkodowany plik manifestu i segmenty wideo będą przechowywane w zasobniku Cloud Storage. Następnie skonfigurujemy Media CDN z zasobnikiem Cloud Storage na żądanie na żywo. VLC Player będzie też służyć do odtwarzania treści na żywo zapisanych w pamięci podręcznej przez Media CDN. Skonfigurowamy też panel Cloud Monitoring, w którym będzie można wizualizować aktywność Media CDN.

Co utworzysz

W tym module skonfigurujemy środowisko zgodnie z tą architekturą:

de33cb3e75d52549.png

W ramach modułu skonfigurujemy następujące elementy i wykonamy następujące zadania:

  • Tworzenie zasobnika Google Cloud Storage (GCS) do przechowywania transkodowanych filmów na żywo
  • Skonfiguruj interfejs Live Streaming API, aby transkodować filmy na wiele formatów: HLS + MPEG DASH, SD i HD.
  • Konfigurowanie komponentów transmisji na żywo: wejście/kanał
  • Uruchom kanał transmisji na żywo
  • Skonfiguruj Media CDN z zasobnikiem GCS jako punktem początkowym
  • Skonfiguruj FFmpeg, aby promować kanał na żywo
  • Transmitowanie transkodowanego kanału na żywo 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 itp.)

Uwaga: w tym module zakładamy, że użytkownicy mają dostęp do konsoli Google Cloud i mają już skonfigurowany projekt. Zakładamy też, że użytkownicy uruchamiają nowe środowisko i nie mają nic skonfigurowanego w tej wersji demonstracyjnej.

Wszystkie działania konfiguracyjne będą wykonywane w wierszu poleceń w Cloud Shell. Możemy w każdej chwili sprawdzić komponenty skonfigurowane w wierszu poleceń w konsoli. W całym module zobaczysz wskaźniki wskazujące konsolę Google Cloud.

2. Zanim zaczniesz

Dostęp do Media CDN jest ograniczony. Aby uzyskać dostęp do Media CDN, skontaktuj się z zespołem ds. kont. Będzie on mógł utworzyć prośbę o dostęp w Twoim imieniu. Jeśli korzystasz z usług Google i chcesz przetestować transmitowanie na żywo w Media CDN, skontaktuj się z menedżerem Media CDN, aby poprosić o dostęp do Media CDN.

3. Konfiguracja i wymagania

Uruchamianie Cloud Shell

Google Cloud można obsługiwać zdalnie z laptopa, ale w ramach tego ćwiczenia z programowania wykorzystasz Google Cloud Shell – środowisko wiersza poleceń działające w chmurze.

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

55efc1aaa7a4d3ad.png

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

7ffe5cbb04455448.png

Ta maszyna wirtualna ma wszystkie potrzebne narzędzia dla programistów. Zawiera stały katalog domowy o pojemności 5 GB i działa w Google Cloud, znacząco zwiększając wydajność sieci i uwierzytelnianie. Wszystkie zadania w ramach tego ćwiczenia z programowania można wykonywać w przeglądarce. Nie musisz niczego instalować.

4. Wersja pakietu SDK Google Cloud

W momencie pisania wiadomości pakiet 408.0.0 jest najnowszą wersją pakietu SDK Google Cloud. Wszystkie polecenia w tym module zostały przetestowane przy użyciu najnowszej wersji pakietu SDK Google Cloud. Zanim przejdziesz dalej, sprawdź, czy Cloud Shell używa najnowszej wersji pakietu SDK.

Sprawdzanie wersji pakietu SDK

Użyjemy polecenia gcloud version, aby sprawdzić wersję pakietu SDK.

Polecenie

gcloud version | grep "Google Cloud SDK"

Przykład wyjściowy

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, uruchom podane poniżej polecenie, aby zaktualizować pakiet SDK.
sudo apt-get update && sudo apt-get install google-cloud-sdk

5. Wymagania wstępne

Zanim rozpoczniemy konfigurowanie zasobów GCP, musimy wykonać te czynności:

  1. Skonfiguruj zmienne środowiskowe
  2. Włącz wymagane interfejsy API usługi

1. Skonfiguruj zmienne środowiskowe

W tym module uruchomimy polecenia gcloud i curl z kilkoma zmiennymi. Musimy skonfigurować wymienione poniżej zmienne środowiskowe.

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

Identyfikator projektu i nazwa użytkownika

Te zmienne środowiskowe są zwykle wstępnie skonfigurowane w Cloud Shell. Do weryfikacji użyjemy polecenia env.

Polecenie

env | grep -E 'DEVSHELL_PROJECT_ID=|LOGNAME'

Przykład wyjściowy

DEVSHELL_PROJECT_ID=<YOUR_PROJECT_ID>
LOGNAME=<YOUR_USERNAME>

Utwórz plik env_variables

Użyj polecenia cat, aby utworzyć plik env_variables.txt. Poniższe 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

Konfiguracja zmiennych środowiskowych

Do ustawiania zmiennych środowiskowych użyjemy polecenia source

Polecenie

source ~/env_variables.txt

Sprawdź, czy zmienne są ustawione

Sprawdźmy, czy wszystkie wymagane zmienne środowiskowe są ustawione. W danych wyjściowych powinno pojawić się łącznie 6 zmiennych środowiskowych.

Polecenie

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

Przykład wyjściowy

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łącz wymagane interfejsy API usługi

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

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

Włączanie interfejsu Network Services API

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

Polecenie

gcloud services enable networkservices.googleapis.com

Włączanie interfejsu Certificate Manager API

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

Polecenie

gcloud services enable certificatemanager.googleapis.com

Włączanie interfejsu Live Stream API

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

Polecenie

gcloud services enable livestream.googleapis.com

Włączanie interfejsu Media CDN Edge Cache API

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

Polecenie

gcloud services enable edgecache.googleapis.com

Sprawdzanie, czy interfejsy API są włączone

Uruchom polecenie gcloud services list, aby wyświetlić listę wszystkich włączonych interfejsów API. W danych wyjściowych powinny być widoczne 4 interfejsy API.

Polecenie

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

Przykład wyjściowy

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ż działać jako pamięć punktu początkowego dla usługi Media CDN.

1. Tworzenie zasobnika

Do utworzenia zasobnika użyjemy polecenia gsutil mb:

Polecenie

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

2. Ustawianie zasobnika jako dostępnego publicznie

Użyjemy polecenia gsutil iam, aby udostępnić pliki publicznie:

Polecenie

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

7. Konfigurowanie środowiska interfejsu Live Streaming API

Architektura łańcucha interfejsu Live Streaming API jest taka:

96b5d26aedeb89a6.png

W poprzedniej sekcji utworzyliśmy zasobnik Cloud Storage live-streaming-storage-$LOGNAME. W 2 kolejnych sekcjach utworzymy następujące zasoby:

  • Wejście transmisji na żywo: wejściowy punkt końcowy to punkt końcowy, do którego koder wysyła strumień wejściowy. Wejściowego punktu końcowego możesz użyć do określenia konfiguracji strumienia, np. rozdzielczości wejściowej, typu danych wejściowych i przycięcia filmu.
  • Kanał transmisji na żywo: kanał to zasób, który pozyskuje strumień wejściowy przez wejściowy punkt końcowy, transkoduje go na wiele odtworzeń i publikuje wyjściowe transmisje na żywo w określonych formatach w określonej lokalizacji. W tym samym kanale możesz umieścić główny i zapasowy strumień wejściowy.

W dalszej części modułu utworzymy następujące zasoby:

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

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

Tworzenie plikuinput.json

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

Polecenie

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

Tworzenie wejściowego punktu końcowego

W momencie tworzenia tego modułu interfejs Live Stream API nie jest obsługiwany przez gcloud. Do wywoływania interfejsu API będziemy używać polecenia curl.

Polecenie

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 wyjściowy

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

Dane wyjściowe zawierają wiele przydatnych informacji, ale obecnie musimy skupić się na 2 polach:

  • Identyfikator operacji: skopiuj identyfikator operacji i zapisz go w danych wyjściowych. Poniżej znajdziesz identyfikator operacji z przykładu danych wyjściowych. Możesz go znaleźć w wierszu wyjściowym rozpoczynającym się od "name". "operation-1661405972853-5e70a38d6f27f-79100d00-310671b4"
  • Stan: musimy poczekać na zmianę stanu z "done": false na "done": true

Sprawdzanie stanu

Zanim przejdziemy dalej, musimy sprawdzić, czy wejściowy punkt końcowy został utworzony i czy jest gotowy.

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

Polecenie

export OPERATION_ID_1=<OPERATION>

Polecenie

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 wyjściowy

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

Ponawiaj polecenie, aż zobaczysz komunikat "done:true" wskazujący, że wejście do punktu końcowego zostało utworzone i jest gotowe.

Zapisz identyfikator URI

W dalszej części tego modułu użyjemy funkcji URI z poprzednich wyników. Ustawmy teraz zmienną środowiskową dla interfejsu URI.

Polecenie

export URI=<uri>

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

Polecenie

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. Utwórz & Konfigurowanie kanału transmisji na żywo

Utwórzmy kanał transmisji na żywo powiązany z wejściowym punktem końcowym utworzonym w poprzedniej sekcji. Ten przykład pozwala utworzyć kanał generujący transmisję na żywo HLS składającą się z pojedynczej wersji w wysokiej rozdzielczości (1280 × 720). Kanał zostanie powiązany z wejściowym punktem końcowym i utworzonym wcześniej zasobnikiem na dane.

Tworzenie pliku channel.json

W terminalu Cloud Shell wpisz to polecenie, aby utworzyć plik "channel.json":

Polecenie

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

Utwórz kanał

Aby utworzyć kanał, uruchom to polecenie curl:

Polecenie

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 wyjściowy

{
  "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ędzie nam potrzebna w jednym z nadchodzących kroków. Możesz go znaleźć w wierszu wyjściowym rozpoczynają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órą właśnie zrobiliśmy. W tym przykładzie jest to operation-1661405972853-5e70a38d6f27f-79100d00-310671b4

Polecenie

export OPERATION_ID_2=<OPERATION>

Polecenie

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 wyjściowy

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

Ponawiaj polecenie, aż zobaczysz komunikat "done:true" wskazujący, że wejście do punktu końcowego zostało utworzone i jest gotowe.

Pamiętaj, że "streamingState" to obecnie "STOPPED"; uruchomimy kanał w następnej sekcji.

10. Uruchom kanał transmisji na żywo

Skoro mamy już kanał z transmisją na żywo, czas go uruchomić. W tej sekcji:

  1. Zakładanie kanału Transmitowanie na żywo
  2. Sprawdź stan kanału, musimy się upewnić, że streamingState ma stan "AWAITING INPUT"

1. Uruchom kanał

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

Polecenie

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 wyjściowy

{
  "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. Jak sprawdzić stan kanału

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

Polecenie

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 wyjściowy

"streamingState": "AWAITING_INPUT",

Ponawiaj polecenie, aż zobaczysz „AWAITING_INPUT” oznacza, że kanał działa i jest gotowy do odbierania sygnału.

11. Skonfiguruj Media CDN

W tej sekcji wdrożymy Media CDN – 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

Punkt początkowy tymczasowego przechowywania danych na serwerach brzegowych reprezentuje lokalizację treści, taką jak zasobnik Cloud Storage, lokalizacja pamięci innej firmy lub system równoważenia obciążenia. W kontekście CDN punkt początkowy (lub serwer pierwotny) to lokalizacja, w której znajduje się źródło treści, które chcemy rozpowszechniać, np. wszystkie fragmenty CSS, JavaScript, HTML, obrazy itp. W tym module utworzymy punkt początkowy zmapowany na zasobnik Cloud Storage, który utworzyliśmy na początku tego modułu. Punkt początkowy tymczasowego przechowywania danych na serwerach brzegowych to cme-origin. Źródło sieci CDN to miejsce, w którym przechowywana jest cała treść źródłowa, zanim zostanie rozpowszechniona na serwerach tymczasowego przechowywania danych na serwerach brzegowych.

Do utworzenia punktu początkowego użyjemy polecenia gcloud edge-cache origins create. Wykonanie polecenia może zająć kilka minut.

Polecenie

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

Teraz, gdy mamy już skonfigurowany punkt początkowy tymczasowego przechowywania danych na serwerach brzegowych, możemy utworzyć samą usługę tymczasowego przechowywania danych na serwerach brzegowych.

Utwórz plik cme-demo.yaml

Konfigurowanie usługi tymczasowego przechowywania danych na serwerach brzegowych odbywa się za pomocą pliku YAML. W Cloud Shell utwórz plik lokalny o nazwie cme-demo.yaml. Użyj narzędzia vi, nano lub innego edytora 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

Pozostawimy wszystkie domyślne ustawienia konfiguracji usługi tymczasowego przechowywania danych na serwerach brzegowych. W pliku powyżej znajdują się 3 wartości pól, które użytkownicy mogą chcieć zaktualizować:

  • name: nazwa instancji Media CDN – tutaj: cme-demo
  • hosts: listę nazw domen, które zostaną przetworzone przez tę usługę Media CDN – tutaj: demo.cme.com. Wykorzystamy to podczas prezentacji. Użyjemy adresu IP instancji Media CDN.
  • Origin: to jest punkt początkowy tymczasowego przechowywania danych na serwerach brzegowych, który właśnie utworzyliśmy w poprzednim kroku. Ustaw ją na cme-origin – nazwa punktu początkowego Media CDN.

Więcej informacji na temat różnych zmiennych, których możesz użyć w pliku YAML, znajdziesz w przewodniku po konfiguracji usługi tymczasowego przechowywania danych na serwerach brzegowych (w języku angielskim).

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 cme-origin dla tymczasowego przechowywania danych na serwerach brzegowych z hostem demo.cme.com. Aby utworzyć usługę, uruchom w Cloud Shell to polecenie:

Polecenie

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

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

Przykład wyjściowy

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'

Zapisz i skopiuj adres ipv4Addresses instancji usługi tymczasowego przechowywania danych na serwerach brzegowych – tutaj 34.104.36.157. Wykorzystamy go do aktualizacji pliku cme-demo.yaml, a później umożliwimy strumieniowanie transkodowanego filmu.

Aktualizowanie usługi tymczasowego przechowywania danych na serwerach brzegowych

W tym momencie warto zaktualizować konfigurację usługi tymczasowego przechowywania danych na serwerach brzegowych, aby móc używać adresu IP tej usługi do późniejszego strumieniowego przesyłania filmu. Plik YAML usługi tymczasowego przechowywania danych na serwerach brzegowych umożliwia nam wyświetlanie listy wszystkich nazw lub adresów IP hostów, z których usługa tymczasowego przechowywania danych na serwerach brzegowych akceptuje żądania. Na tym etapie jako hosta określiliśmy tylko demo.cme.com. Aby zapewnić rozpoznawanie nazw dla tej domeny, skonfiguruj strefę DNS w chmurze. Łatwiejszym rozwiązaniem jest jednak dodanie adresu IP do listy hostów w pliku yaml. Ponownie zmodyfikuj plik YAML, aby wyglądał tak 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, musimy ponownie zaimportować plik YAML. W terminalu Cloud Shell uruchom to polecenie:

Polecenie

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

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

W tym momencie instancja usługi tymczasowego przechowywania danych na serwerach brzegowych będzie akceptować żądania z hostem "demo.cme.com" lub adresem IP.

12. Generowanie sygnału wejściowego

Skoro mamy już skonfigurowane wszystkie wymagane usługi, możemy wygenerować sygnał wejściowy transmisji na żywo. W tej sekcji:

  1. Zainstaluj FFmpeg – bezpłatne oprogramowanie typu open source.
  2. Wyślij testowy sygnał na żywo do wejścia/kanału

1. Zainstaluj FFmpeg

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

Polecenie

sudo apt install ffmpeg -y

Po zakończeniu instalacji sprawdźmy, czy program FFmpeg został poprawnie zainstalowany. W tym celu sprawdź jego wersję:

Polecenie

ffmpeg -version

Przykład wyjściowy

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

Plik FFmpeg został poprawnie zainstalowany.

2. Uruchom sygnał transmisji na żywo do wejścia/kanału.

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

W terminalu Cloud Shell uruchom podane niżej polecenie, używając zmiennej środowiskowej URI utworzonej w sekcji „Create and Configure the wejściowych Endpoint” (Tworzenie i konfigurowanie wejściowego punktu końcowego). .

Polecenie

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

Aplikacja FFmpeg powinna wysłać testowy sygnał aktywny. To polecenie nie zwróci promptu. Sygnał będzie generowany, dopóki go nie zatrzymasz. Do końca tego modułu musisz otworzyć nowe okno Cloud Shell.

13. Otwórz nową wersję Cloud Shell

W tym momencie musisz otworzyć nowe okno Cloud Shell, aby kontynuować moduł, ponieważ program FFmpeg będzie działać na stałe, dopóki nie naciśniesz <CTRL+C> polecenie zatrzymania go i w ten sposób zatrzymania generowania sygnałów na żywo.

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

b3c7b0be6276c194.png

Uruchom pozostałą część modułu w nowo otwartym oknie Cloud Shell.

Konfiguracja zmiennych środowiskowych

To nowa powłoka CloudShell, więc musimy jeszcze raz ustawić zmienne środowiskowe. Do ustawiania zmiennych środowiskowych użyjemy polecenia source.

Polecenie

source ~/env_variables.txt

Sprawdź, czy zmienne są ustawione

Sprawdźmy, czy wszystkie wymagane zmienne środowiskowe są ustawione. W danych wyjściowych powinno pojawić się łącznie 6 zmiennych środowiskowych.

Polecenie

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

Przykład wyjściowy

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. Sprawdzanie, czy sygnał na żywo jest transkodowany

Uruchomimy zapytanie curl, aby opisać kanał. W danych wyjściowych powinniśmy zobaczyć, że parametr streamingState zmienił się z "AWAITING_INPUT" na "STREAMING"

Polecenie

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 z wyjściowym plikiem JSON powinien być widoczny znak "streamingState": "STREAMING". Oznacza on, że kanał jest przesyłany strumieniowo, a sygnał transmisji na żywo jest transkodowany.

Sprawdźmy też zawartość zasobnika, w którym powinien być plik manifestu i kilka segmentów wideo TS. Uruchom w Cloud Shell to polecenie, aby wyświetlić zawartość zasobnika, który został utworzony na początku modułu i który został użyty przez interfejs Live Streaming API do wygenerowania transkodowanego pliku manifestu sygnału na żywo i segmentów wideo TS:

Polecenie

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

Przykład wyjściowy

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

Na tym etapie zajmujemy się następującymi sprawami:

  • Interfejs Live Streaming API: sygnał na żywo jest generowany i transkodowany do zasobnika przez interfejs Live Streaming API.
  • Media CDN: jako punkt początkowy Media CDN skonfigurowano zasobnik na dane transmisji na żywo.

W kolejnych sekcjach zweryfikujemy usługę tymczasowego przechowywania danych na serwerach brzegowych i będziemy przesyłać strumieniowo transkodowany film za pomocą adresu IP anycast Media CDN.

15. Sprawdzanie działania instancji usługi tymczasowego przechowywania danych na serwerach brzegowych

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 tymczasowego przechowywania danych na serwerach brzegowych przy użyciu adresu IP tej usługi. Przy pierwszym dostępie do obiektu nie jest on jeszcze buforowany. Powinniśmy obserwować pamięć podręczną MISS. W przypadku pierwszego żądania obiekt jest odczytywany ze punktu początkowego i buforowany na brzegu. Każda kolejna próba uzyskania dostępu do tego samego pliku spowoduje zwrócenie HIT pamięci podręcznej, ponieważ obiekt jest teraz w pamięci podręcznej. Sprawdźmy to:

Uruchom w Cloud Shell to polecenie curl, aby uzyskać dostęp do transkodowanego pliku manifestu wideo zapisanego w punkcie początkowym tymczasowego przechowywania danych na serwerach brzegowych:

Polecenie

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

Zwróć uwagę na punkt rozpoznawania, w którym do rozpoznania nazwy instancji usługi tymczasowego przechowywania danych na serwerach brzegowych używamy adresu IP. Użyj zasady demo.cme.com:<IP>, w której IP to adres IP utworzonej właśnie instancji usługi tymczasowego przechowywania danych na serwerach brzegowych.

W danych wyjściowych poszukaj nagłówka x-cache-status.

Przykład wyjściowy

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

Zauważ, że w pamięci podręcznej brakuje obiektu, ponieważ obiekt nie został jeszcze umieszczony w pamięci podręcznej i jest odczytywany z pierwotnego miejsca.

Teraz wyślemy kilka żądań do pliku m3u8. Jeśli wszystko jest skonfigurowane prawidłowo, Media CDN powinna zacząć wyświetlać treści ze swojej pamięci podręcznej. Poniższe polecenie spowoduje wysłanie 10 żądań curl i wydrukowanie tylko nagłówka x-cache-status.

Polecenie

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

Wynikiem powinny być zawartość pamięci podręcznej hit i miss. Jeśli w danych wyjściowych zobaczysz trafienia w pamięci podręcznej, oznacza to, że Media CDN działa zgodnie z oczekiwaniami.

Przykład wyjściowy

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 działanie w pamięci podręcznej, ponieważ obiekt jest teraz w pamięci podręcznej na krawędziach. Usługa Cloud Medie Edge działa zgodnie z oczekiwaniami.

16. Transmituj transkodowany sygnał wideo na żywo przez VLC

W tym miejscu łączymy wszystkie elementy, nad którymi dotychczas pracowaliśmy:

  • Utworzyliśmy zasobnik o nazwie live-streaming-storage-$LOGNAME, do którego dotarła transmisja sygnału transkodowanego na żywo na treści HLS przez interfejs Live Streaming API.
  • Skonfigurowaliśmy interfejs Live Streaming API.
  • Zaczęliśmy we współpracy z FFmpeg sygnał na żywo RTMP, który przesyła dane wejściowe/kanał interfejsu Live Streaming API.
  • Upewniliśmy się, że sygnał na żywo jest przesłany do kanału i upewniliśmy się, że kanał działa w trybie streaming.
  • Sprawdziliśmy, czy transkodowane pliki (plik manifestu + segmenty TS) zostały wygenerowane 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.
  • Instancja tymczasowego przechowywania danych na serwerach brzegowych o nazwie cme-demo została skonfigurowana z punktem początkowym cme-origin.
  • Zweryfikowaliśmy zachowanie instancji usługi tymczasowego przechowywania danych na serwerach brzegowych pod kątem działania (brak w pamięci podręcznej, trafienie w pamięci podręcznej).

Doszliśmy właśnie do momentu, w którym będziemy mogli używać odtwarzacza wideo do transmitowania transkodowanego sygnału na żywo przez pamięć podręczną Media CDN. Użyjemy do tego odtwarzacza VLC. VLC Player to bezpłatny, międzyplatformowy odtwarzacz multimedialny typu open source, który umożliwia odtwarzanie większości plików multimedialnych. Odtwarzane są adaptacyjne formaty multimediów (takie jak DASH i HLS). Wykorzystuje zasadę adaptacyjnego strumieniowego przesyłania danych – w zależności od jakości połączenia sieciowego i dostępnej przepustowości odtwarzacz dostosowuje jakość odtwarzanego filmu. W ramach właśnie wykonanego zadania transkodowania użyliśmy domyślnych gotowych ustawień i wygenerowaliśmy „tylko” 2 jakości: SD i HD. Gdy zaczniemy odtwarzać film w odtwarzaczu, powinien on zacząć odtwarzać treści w formacie SD i szybko przełączyć się na format HD, jeśli połączenie sieciowe będzie wystarczająco dobre.

Będziemy przesyłać strumieniowo transkodowany sygnał HLS (powszechnie obsługiwany format wideo Apple). Powiązany plik nazywa się main.m3u8 – jest to plik manifestu HLS. Plik manifestu wskazuje segmenty wideo TS.

Aby używać odtwarzacza VLC Player, wejdź na https://www.videolan.org/vlc/ i pobierz jego wersję na swój system operacyjny laptopa. Aplikacja VLC jest dostępna dla systemów Windows, MacOSX, Linux, Android i iOS.

2a2d19abe728d222.png

Zainstaluj odtwarzacz na laptopie i uruchom go. W kolejnych kilku krokach będziemy używać odtwarzacza w wersji na system MacOSX.

Aby odtworzyć film, przejdź do „Plik” / "Otwarta sieć":

f85565301f7c68dc.png

Skonfiguruj za pomocą:

  • Adres URL: http://&lt;Replace_With_Edge_Cache_IP&gt;/main.m3u8. To jest adres URL filmu, który chcesz transmitować. Uwaga:
  • Adres IP instancji Media CDN: 34.105.35.246. Zastąp go adresem IP wdrożonej usługi Cloud Media.
  • Ścieżka do pliku wideo manifestu: „/”. Ścieżka, którą użyliśmy w zasobniku live-streaming-storage-$LOGNAME do przechowywania transkodowanych plików sygnałów na żywo. Ścieżka jest ścieżką główną tutaj: „/”.
  • Nazwa pliku wideo manifestu: plik manifestu HLS, main.m3u8.

I kliknij „Otwórz”. Powinna zacząć się odtwarzać transkodowana transmisja wideo na żywo. Film będzie wyglądać tak jak na zrzucie ekranu poniżej. Licznik na ekranie uruchamia się w przyrostach co 1. Powinno być słychać nieprzerwany sygnał.

To podstawowy testowy sygnał RTMP wygenerowany przez FFmpeg, transkodowany na HLS przez interfejs Live Streaming API i udostępniany przez pamięć podręczną Media CDN:

28fc359b49d44ec2.png

Możesz użyć dowolnego innego odtwarzacza HLS lub MPEG DASH. Oto kilka kwestii, które warto wziąć pod uwagę:

  • Quicktime Player – instalowany domyślnie na komputerach Mac. To samo: otwórz połączenie sieciowe pod adresem http://34.104.36.157/main.m3u8 – zastąp adres IP adresem z instancji usługi tymczasowego przechowywania danych na serwerach brzegowych.

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 usługi 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 się wyświetlić panel o nazwie „Media Edge Metrics”. Kliknij tę pozycję, aby wyświetlić dane:

d0821d84a88a928d.png

18. Uporządkuj środowisko modułu

Gratulujemy ukończenia modułu. W tej sekcji usuniemy wszystkie zasoby utworzone w tym module.

Zatrzymaj sygnał FFmpeg:

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

Zatrzymaj kanał transmisji na żywo:

Polecenie

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"

Usuń kanał transmisji na żywo:

Polecenie

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 wprowadzania danych transmisji na żywo:

Polecenie

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:

Polecenie

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

Usuń instancję usługi tymczasowego przechowywania danych na serwerach brzegowych:

Polecenie

gcloud edge-cache services delete cme-demo

Potwierdź usunięcie, wpisując „Y” po wyświetleniu monitu

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

Polecenie

gcloud edge-cache origins delete cme-origin

Potwierdź usunięcie, wpisując „Y” po wyświetleniu monitu

Usuwanie panelu niestandardowego

Polecenie

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