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ść użytkowników, przechowując w pamięci podręcznej często używane treści bliżej użytkowników końcowych, zamykając połączenia bliżej klientów, ponownie wykorzystując połączenia z punktem początkowym oraz stosując nowoczesne protokoły sieciowe i dostosowania. 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 wzrost sprzedaży, lepsze wrażenia z korzystania z internetu i ogólny wzrost zadowolenia użytkowników. Obecnie bardzo niewiele nowoczesnych witryn i platform do strumieniowego przesyłania wideo działa bez sieci CDN.

Czego się nauczysz

W tym module dowiesz się, jak wdrożyć środowisko przepływu pracy transmitowania na żywo za pomocą 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 i MPEG-DASH).

Skonfigurujemy komponenty interfejsu Live Streaming API – wejście i kanał – i rozpoczniemy transmisję na żywo do wejścia/kanału za pomocą FFmpeg (FFmpeg może generować sygnał testowy na żywo). Interfejs Live Streaming API przekoduje aktywny kanał. Manifest i segmenty przekodowanego filmu będą przechowywane w zasobniku Cloud Storage. Następnie skonfigurujemy Media CDN, używając zasobnika Cloud Storage z transmisją na żywo jako źródła. Na koniec VLC Player będzie używany do odtwarzania treści na żywo buforowanych za pomocą Media CDN. Skonfigurujemy też panel Cloud Monitoring, aby wizualizować aktywność Media CDN.

Co utworzysz

W tym module skonfigurujemy środowisko na podstawie tej architektury:

de33cb3e75d52549.png

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

  • Utwórz zasobnik Google Cloud Storage (GCS) do przechowywania transkodowanych na żywo filmów.
  • Skonfiguruj interfejs Live Streaming API, aby transkodować 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
  • Konfigurowanie FFmpeg do przesyłania danych do kanału na żywo
  • Przesyłanie strumieniowe transkodowanego aktywnego kanału 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: na potrzeby tego modułu zakładamy, że użytkownicy mają dostęp do konsoli Google Cloud i skonfigurowany projekt. Zakładamy też, że użytkownicy zaczynają od nowego środowiska i nie mają niczego skonfigurowanego na potrzeby tej wersji demonstracyjnej.

Wszystkie czynności konfiguracyjne wykonasz w wierszu poleceń w Cloud Shell. W konsoli zawsze możemy sprawdzić komponenty skonfigurowane za pomocą wiersza poleceń. W tym module znajdziesz wskazówki, które będą Cię kierować do konsoli Google Cloud.

2. Zanim zaczniesz

Dostęp do sieci CDN multimediów jest ograniczony. Aby uzyskać dostęp do Media CDN, skontaktuj się z zespołem ds. kont. Może on w Twoim imieniu utworzyć prośbę o dostęp. Jeśli pracujesz w Google i chcesz przetestować transmisje na żywo z 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

Z Google Cloud można korzystać zdalnie na laptopie, ale w tym module praktycznym 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 zakończeniu powinno wyświetlić się coś takiego:

7ffe5cbb04455448.png

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

4. Wersja (pakietu) SDK Google Cloud

W momencie pisania tego artykułu najnowszą wersją pakietu SDK Google Cloud jest 408.0.0. Wszystkie polecenia w tym module zostały przetestowane przy użyciu 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ładowe dane wyjściowe

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 poniższe polecenie, aby zaktualizować pakiet SDK.
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ług

1. Konfigurowanie zmiennych środowiskowych

W tym module będziemy wykonywać polecenia gcloudcurl 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 Cloud Shell. Do weryfikacji użyjemy polecenia env.

Command

env | grep -E 'DEVSHELL_PROJECT_ID=|LOGNAME'

Przykładowe dane wyjściowe

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

Do ustawienia zmiennych środowiskowych użyjemy polecenia source.

Command

source ~/env_variables.txt

Sprawdź, czy zmienne są ustawione.

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

Command

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

Przykładowe dane wyjściowe

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
  • 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łączanie interfejsu 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ć Live Stream API, uruchom to polecenie:

Command

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:

Command

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 się pojawić 4 interfejsy API.

Command

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

Przykładowe dane wyjściowe

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

6. Tworzenie zasobnika Cloud Storage

W tej sekcji wykonamy te czynności:

  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ć zasobnik, 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 mają taką architekturę:

96b5d26aedeb89a6.png

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

  • Wejście transmisji na żywo: wejściowy punkt końcowy 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ściowa, typ wejścia i przycinanie wideo.
  • Kanał transmisji na żywo: kanał to zasób, który przetwarza strumień wejściowy za pomocą punktu końcowego wejścia, transkoduje go do wielu wersji i publikuje wyjściowe transmisje na żywo w określonych formatach w wybranej lokalizacji. Możesz uwzględnić główny i zapasowy strumień wejściowy na tym samym kanale.

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

  • Koder: koder to program służący do wysyłania strumieni 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 module używamy sygnału na żywo RTMP.

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 jest obsługiwany przez gcloud. Do wywoływania interfejsu API będziemy używać 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ładowe dane wyjściowe

{
  "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 w tej chwili musimy skupić się na 2 polach:

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

Sprawdź stan

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

W poleceniu poniżej zastąp <OPERATION> identyfikatorem operacji uzyskanym powyżej. 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ładowe dane wyjściowe

{
  "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 "done:true", co oznacza, że wejściowy punkt końcowy został utworzony i jest gotowy.

Zapisz identyfikator URI

W dalszej części modułu użyjemy wartości URI z poprzedniego wyniku. Teraz ustawmy 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órzmy 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 (1280x720). 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":

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ładowe dane wyjściowe

{
  "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 potrzebny w jednym z kolejnych kroków. Znajduje się on w wierszu wyjściowym zaczynającym się od "name".

Sprawdź stan

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

W poleceniu poniżej zastąp <OPERATION> identyfikatorem operacji uzyskanym powyżej. 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ładowe dane wyjściowe

  "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 "done:true", co oznacza, że wejściowy punkt końcowy został utworzony i jest gotowy.

Zwróć uwagę, że "streamingState" obecnie jest "STOPPED" ; kanał uruchomimy w następnej sekcji.

10. Uruchamianie kanału transmisji na żywo

Po utworzeniu kanału transmisji na żywo uruchom go. W tej sekcji wykonamy te czynności:

  1. Uruchom kanał Transmisje na żywo
  2. Sprawdź stan kanału. Musimy mieć pewność, że streamingState ma wartość "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ładowe dane wyjściowe

{
  "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 sprawdzić 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ładowe dane wyjściowe

"streamingState": "AWAITING_INPUT",

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

11. Konfigurowanie Media CDN

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

  1. Źródło tymczasowego przechowywania danych na serwerach brzegowych
  2. Usługa tymczasowego przechowywania danych na serwerach brzegowych

1. Tworzenie źródła tymczasowego przechowywania danych na serwerach brzegowych

Źródło tymczasowego przechowywania danych na serwerach brzegowych reprezentuje lokalizację treści, np. zasobnik Cloud Storage, lokalizację pamięci masowej innej firmy lub system równoważenia obciążenia. W terminologii CDN serwer pierwotny 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 serwer pierwotny, który będzie mapowany na zasobnik Cloud Storage utworzony na początku modułu. Punkt początkowy tymczasowego przechowywania danych na serwerach brzegowych nazwiemy cme-origin. Źródło sieci CDN to miejsce, w którym przechowywane są wszystkie treści źródłowe przed rozpowszechnieniem ich na serwerach pamięci podręcznej na brzegu sieci.

Do utworzenia źródła użyjemy polecenia gcloud edge-cache origins create. 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 mamy już skonfigurowane źródło 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 odbywa się za pomocą pliku YAML. W Cloud Shell utwórz lokalny plik o nazwie cme-demo.yaml. Użyj vi, nano lub dowolnego innego edytora i wklej te wiersze do 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 – w tym przypadku: cme-demo
  • hosts: lista nazw domen, które będą rozpoznawane przez tę usługę Media CDN – tutaj: demo.cme.com. Użyjemy go w tej prezentacji. Użyjemy adresu IP instancji Media CDN.
  • Origin: jest to źródło tymczasowego przechowywania danych na serwerach brzegowych, które zostało utworzone w poprzednim kroku. Ustaw wartość cme-origin – nazwa punktu początkowego Media CDN.

Więcej informacji o różnych zmiennych, których możesz używać w pliku YAML, znajdziesz w przewodniku po konfiguracji usługi pamięci podręcznej Edge.

Tworzenie usługi tymczasowego przechowywania danych na serwerach brzegowych

Utworzymy usługę tymczasowego przechowywania danych na serwerach brzegowych o nazwie cme-demo w źródle 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

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

Przykładowe dane wyjściowe

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 – w tym przypadku 34.104.36.157. Użyjemy go do zaktualizowania pliku cme-demo.yaml, a później do przesyłania strumieniowego 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 później używać adresu IP usługi do przesyłania strumieniowego wideo. Plik YAML usługi tymczasowego przechowywania danych na serwerach brzegowych umożliwia wyświetlenie wszystkich nazw hostów i adresów IP, z których usługa tymczasowego przechowywania danych na serwerach brzegowych będzie akceptować żądania. W tym momencie jako hosta określiliśmy tylko demo.cme.com. Aby zapewnić rozpoznawanie nazw w tej domenie, możesz skonfigurować strefę DNS. Łatwiejszym rozwiązaniem jest jednak dodanie adresu IP do listy hostów w pliku yaml. Ponownie zmodyfikuj plik YAML, 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ź wynik 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 "demo.cme.com" lub adresem IP jako hostem.

12. Generowanie sygnału wejściowego

Po skonfigurowaniu wszystkich wymaganych usług wygenerujmy sygnał wejściowy transmisji na żywo. W tej sekcji wykonamy te czynności:

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

1. Instalowanie FFmpeg

FFmpeg to bezpłatny projekt oprogramowania typu open source, który obejmuje pakiet bibliotek i programów do obsługi plików i strumieni wideo, audio i innych multimediów. 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ł prawidłowo zainstalowany, sprawdzając jego wersję:

Command

ffmpeg -version

Przykładowe dane wyjściowe

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. Uruchom sygnał transmisji 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 wejścia”.

Command

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

Powinno być widać, że FFmpeg wysyła testowy sygnał na żywo. Polecenie nie zwróci prompta. Sygnał będzie generowany, dopóki go nie zatrzymasz. Na potrzeby pozostałej części ćwiczenia musisz otworzyć nowe okno Cloud Shell.

13. Otwórz nową sesję Cloud Shell

Aby kontynuować ćwiczenie, musisz otworzyć nowe okno Cloud Shell, ponieważ FFmpeg będzie działać nieprzerwanie, dopóki nie przerwiesz polecenia za pomocą kombinacji klawiszy <CTRL+C>, co spowoduje zatrzymanie generowania sygnału na żywo.

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

b3c7b0be6276c194.png

Pozostałą część ćwiczenia wykonaj w nowo otwartym oknie Cloud Shell.

Konfigurowanie zmiennych środowiskowych

Ponieważ jest to nowa sesja Cloud Shell, musimy jeszcze raz ustawić zmienne środowiskowe. Do ustawienia zmiennych środowiskowych użyjemy polecenia source.

Command

source ~/env_variables.txt

Sprawdź, czy zmienne są ustawione.

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

Command

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

Przykładowe dane wyjściowe

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

Uruchomimy curl, aby opisać kanał. W danych wyjściowych powinniśmy zobaczyć, że stan przesyłania strumieniowego 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 JSON powinna się pojawić wartość "streamingState": "STREAMING", co oznacza, że kanał transmituje na żywo, a sygnał jest transkodowany.

Sprawdźmy też zawartość zasobnika, w którym powinien znajdować się plik manifestu i kilka segmentów wideo TS. Aby wyświetlić zawartość zasobnika utworzonego na początku modułu, który jest używany przez interfejs Live Streaming API do generowania manifestu przekodowanego sygnału na żywo i segmentów wideo TS, uruchom w Cloud Shell to polecenie:

Command

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

Przykładowe dane wyjściowe

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 mamy już za sobą:

  • Live Streaming API: sygnał na żywo jest generowany i transkodowany do zasobnika za pomocą interfejsu Live Streaming API.
  • Media CDN: skonfigurowana usługa Media CDN z zasobnikiem pamięci masowej Live Streaming jako punktem początkowym Media CDN.

W kolejnych sekcjach sprawdzimy usługę Edge Cache, a następnie będziemy przesyłać strumieniowo przekodowane wideo za pomocą adresu IP anycast Media CDN.

15. Sprawdzanie, czy instancja usługi tymczasowego przechowywania danych na serwerach brzegowych działa

W tej sekcji sprawdzimy, czy instancja usługi tymczasowego przechowywania danych na serwerach brzegowych działa zgodnie z oczekiwaniami. Aby to zrobić, 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. Gdy obiekt jest używany po raz pierwszy, nie jest jeszcze zapisany w pamięci podręcznej. Powinniśmy obserwować pamięć podręczną MISS. W przypadku pierwszego żądania obiekt jest odczytywany z punktu początkowego i buforowany na brzegu sieci. 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 sieci. Sprawdźmy to:

Aby uzyskać dostęp do pliku manifestu przekodowanego filmu przechowywanego w źródle tymczasowego przechowywania danych na serwerach brzegowych, 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ę na pole resolve, w którym używamy adresu IP instancji usługi pamięci podręcznej Edge Cache Service do rozpoznawania jej nazwy. Upewnij się, że używasz demo.cme.com:<IP>, gdzie IP to adres IP utworzonej właśnie instancji usługi tymczasowego przechowywania danych na serwerach brzegowych.

W danych wyjściowych znajdź nagłówek x-cache-status.

Przykładowe dane wyjściowe

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 w pamięci podręcznej, ponieważ obiekt nie został jeszcze zapisany w pamięci podręcznej i jest odczytywany ze źródła.

Teraz wyślemy wiele żądań dotyczących pliku m3u8. Jeśli wszystko jest prawidłowo skonfigurowane, CDN Media powinien zacząć udostępniać treści z pamięci podręcznej. Poniższe polecenie wyśle 10 żądań curl i wyświetli 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 zawierać mieszankę pamięci podręcznej hitmiss. Jeśli w danych wyjściowych widzisz trafienia w pamięci podręcznej, oznacza to, że Media CDN działa zgodnie z oczekiwaniami.

Przykładowe dane wyjściowe

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 w 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. Przesyłanie strumieniowe transkodowanego sygnału wideo na żywo za pomocą VLC

W tym miejscu łączymy wszystkie dotychczasowe kroki:

  • Utworzyliśmy zasobnik o nazwie live-streaming-storage-$LOGNAME, który otrzymuje wynik transkodowania sygnału na żywo na treści HLS przez interfejs Live Streaming API.
  • Skonfigurujemy interfejs Live Streaming API.
  • Uruchomiliśmy sygnał na żywo RTMP za pomocą FFmpeg, który przekazuje dane wejściowe do interfejsu Live Streaming API lub kanału.
  • Sprawdziliśmy, czy sygnał na żywo był przesyłany do kanału, i potwierdziliśmy, że kanał był w trybie streaming.
  • Sprawdziliśmy, czy wygenerowane pliki po transkodowaniu (manifest + segmenty TS) zostały zapisane w zasobniku live-streaming-storage-$LOGNAME.
  • Skonfigurowano źródło tymczasowego przechowywania danych na serwerach brzegowych o nazwie cme-origin, w którym jako punkt początkowy używany jest zasobnik GCS live-streaming-storage-$LOGNAME.
  • Skonfigurowano instancję tymczasowego przechowywania danych na serwerach brzegowych o nazwie cme-demo, której punktem początkowym jest cme-origin.
  • Sprawdziliśmy działanie instancji usługi tymczasowego przechowywania danych na serwerach brzegowych (brak w pamięci podręcznej, trafienie w pamięci podręcznej).

Jesteśmy już na etapie, na którym możemy użyć odtwarzacza wideo do przesyłania strumieniowego transkodowanego sygnału na żywo za pomocą pamięci podręcznej Media CDN. W tym celu użyjemy odtwarzacza VLC. VLC Player to bezpłatny odtwarzacz multimedialny typu open source, który działa na różnych platformach i odtwarza większość plików multimedialnych. Odtwarza adaptacyjne formaty multimedialne (takie jak DASH i HLS). Wykorzystuje on zasadę strumieniowania adaptacyjnego – w zależności od jakości połączenia sieciowego i dostępnej przepustowości odtwarzacz dostosowuje jakość odtwarzanego filmu. W przypadku zadania transkodowania, które właśnie wykonaliśmy, użyliśmy domyślnych ustawień wstępnych i wygenerowaliśmy „tylko” 2 jakości: SD i HD. Gdy zaczniemy odtwarzać film w odtwarzaczu, powinien on rozpocząć odtwarzanie w formacie SD i szybko przełączyć się na format HD, jeśli połączenie sieciowe jest wystarczająco dobre.

Będziemy transmitować transkodowany sygnał na żywo w formacie HLS (szeroko obsługiwany format wideo firmy Apple). Odpowiedni plik nazywa się main.m3u8, czyli jest to manifest HLS. Plik manifestu wskazuje segmenty wideo TS.

Aby użyć odtwarzacza VLC, wejdź na stronę https://www.videolan.org/vlc/ i pobierz wersję odtwarzacza dla systemu operacyjnego laptopa. VLC jest dostępny na Windows, MacOSX, Linux, Android i iOS.

2a2d19abe728d222.png

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

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

f85565301f7c68dc.png

Skonfiguruj za pomocą:

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

Następnie kliknij „Otwórz”. Powinien rozpocząć się odtwarzanie przekodowanego obrazu na żywo. Film będzie wyglądać jak na zrzucie ekranu poniżej. Licznik na ekranie będzie zwiększał się o 1, a Ty powinieneś(-aś) słyszeć ciągły sygnał dźwiękowy.

Jest to podstawowy sygnał testowy RTMP na żywo wygenerowany przez FFmpeg, przekodowany na HLS przez interfejs Live Streaming API i dostarczony przez pamięć podręczną Media CDN:

28fc359b49d44ec2.png

Możesz użyć dowolnego innego odtwarzacza HLS i MPEG DASH. Oto kilka przykładów:

  • Odtwarzacz Quicktime – domyślnie zainstalowany na komputerach Mac. Podobnie jak w przypadku poprzedniego kroku: otwórz połączenie sieciowe z adresem http://34.104.36.157/main.m3u8. Zastąp adres IP adresem IP instancji usługi Edge Cache Service.

17. Monitorowanie Media CDN

Zespół SME utworzył szablon panelu Media CDN – 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 informacyjne. Powinien wyświetlić się panel o nazwie „Dane Media Edge”. Kliknij go, aby wyświetlić te dane:

d0821d84a88a928d.png

18. Zwalnianie miejsca w środowisku modułu

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

Zatrzymaj sygnał FFmpeg:

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

Zatrzymaj kanał 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"

Usuń 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"

Usuń zasobnik GCS:

Command

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

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

Command

gcloud edge-cache services delete cme-demo

Gdy pojawi się odpowiedni komunikat, potwierdź usunięcie, wpisując „Y”.

Usuń źródło tymczasowego przechowywania danych na serwerach brzegowych:

Command

gcloud edge-cache origins delete cme-origin

Gdy pojawi się odpowiedni komunikat, potwierdź usunięcie, wpisując „Y”.

Usuwanie panelu niestandardowego

Command

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