VOD-Clips aus einem Livestream erstellen

Auf dieser Seite wird beschrieben, wie du mit der Live Stream API Video-on-Demand-Clips aus einem Livestream erstellen kannst. VOD-Clips bestehen aus HLS-Manifestdateien und Segmentdateien, die aus einem Livestream gespeichert wurden. Es werden nur HLS-Manifeste unterstützt.

Unterschiede zwischen VOD-Clips und DVR-Sitzungen

VOD-Clips (auch als Channel-Clips bezeichnet) ähneln DVR-Sitzungen, mit den folgenden wichtigen Unterschieden:

  • DVR-Sitzungen:
    • Die API speichert das DVR-Manifest am selben Speicherort wie die Live-Stream-Segmente, sodass keine zusätzliche Kopie in Cloud Storage erstellt wird. Das DVR-Manifest ähnelt dem Livestream-Manifest, ist aber länger. Wenn das Speicherzeitraum abläuft, werden das Manifest und die Segmentdateien gelöscht.
    • Du kannst eine DVR-Sitzung für vergangene, aktuelle und zukünftige Inhalte erstellen. So kann eine DVR-Sitzung beispielsweise auf einen Livestream folgen oder du kannst eine DVR-Sitzung für einen bestimmten Zeitpunkt planen.
    • Ein typischer Anwendungsfall für DVR-Sitzungen ist die Unterstützung von DVR-Funktionen für Live-Streaming-Ereignisse. Ein Zuschauer kann beispielsweise eine Stunde nach Beginn des Livestreams beitreten und sich die Inhalte mit einer Stunde Verzögerung ansehen oder Teile davon überspringen.
  • Kanalclips:
    • Die Live Stream API kopiert das Clip-Manifest und die zugehörigen Segmentdateien in ein vom Nutzer angegebenes Verzeichnis, damit sie nicht gelöscht werden, wenn das Speicherzeitraum abläuft. Du hast die volle Kontrolle über den Clip.
    • Nur Inhalte aus der Vergangenheit können zu Clips verarbeitet werden. Live-Clips und die Planung zukünftiger Clips werden nicht unterstützt.
    • Ein typischer Anwendungsfall für Clips ist das Archivieren eines Livestreams, damit er zeitlich unbegrenzt als VOD-Datei verfügbar ist.

Weitere Informationen zu DVR-Sitzungen findest du unter DVR-Sitzung erstellen.

Google Cloud-Projekt und Authentifizierung einrichten

Wenn Sie noch kein Google Cloud-Projekt und keine Anmeldedaten erstellt haben, lesen Sie den Abschnitt Vorbereitung.

Eingabeendpunkt erstellen

Verwenden Sie zum Erstellen eines Eingabeendpunkts die Methode projects.locations.inputs.create.

Ersetzen Sie diese Werte in den folgenden Anfragedaten:

  • PROJECT_NUMBER: Ihre Google Cloud-Projektnummer. Sie finden sie auf der Seite IAM-Einstellungen im Feld Projektnummer.
  • LOCATION: Der Speicherort, an dem der Eingabeendpunkt erstellt werden soll. Verwenden Sie eine der unterstützten Regionen.
    Standorte anzeigen
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-south1
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-north1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-west4
  • INPUT_ID: Eine benutzerdefinierte Kennung für den neuen zu erstellenden Eingabeendpunkt, an den Sie Ihren Eingabestream senden. Dieser Wert muss 1–63 Zeichen lang sein, mit [a-z0-9] beginnen und enden und darf zwischen den Zeichen Bindestriche (-) enthalten. Beispiel: my-input

Wenn Sie die Anfrage senden möchten, maximieren Sie eine der folgenden Optionen:

Sie sollten in etwa folgende JSON-Antwort erhalten:

{
  "name": "projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_ID",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata",
    "createTime": CREATE_TIME,
    "target": "projects/PROJECT_NUMBER/locations/LOCATION/inputs/INPUT_ID",
    "verb": "create",
    "requestedCancellation": false,
    "apiVersion": "v1"
  },
  "done": false
}

Mit diesem Befehl wird ein Vorgang mit langer Ausführungszeit erstellt, mit dem Sie den Fortschritt Ihrer Anfrage verfolgen können. Weitere Informationen finden Sie unter Vorgänge mit langer Ausführungszeit verwalten .

Details zum Eingabeendpunkt abrufen

Verwenden Sie die Methode projects.locations.inputs.get, um Details zum Eingabeendpunkt abzurufen.

Ersetzen Sie diese Werte in den folgenden Anfragedaten:

  • PROJECT_NUMBER: Ihre Google Cloud-Projektnummer. Sie finden sie auf der Seite IAM-Einstellungen im Feld Projektnummer.
  • LOCATION: Der Standort, an dem sich Ihr Eingabeendpunkt befindet. Verwenden Sie eine der unterstützten Regionen.
    Standorte anzeigen
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-south1
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-north1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-west4
  • INPUT_ID: die benutzerdefinierte Kennung für den Eingabeendpunkt

Wenn Sie die Anfrage senden möchten, maximieren Sie eine der folgenden Optionen:

Sie sollten in etwa folgende JSON-Antwort erhalten:

{
  "name": "projects/PROJECT_NUMBER/locations/LOCATION/inputs/INPUT_ID",
  "createTime": CREATE_TIME,
  "updateTime": UPDATE_TIME,
  "type": "RTMP_PUSH",
  "uri":  "INPUT_STREAM_URI", # For example, "rtmp://1.2.3.4/live/b8ebdd94-c8d9-4d88-a16e-b963c43a953b",
  "tier": "HD"
}

Suchen Sie das Feld uri und kopieren Sie den zurückgegebenen uri, um ihn später im Abschnitt Eingabestream senden zu verwenden.INPUT_STREAM_URI

Kanäle erstellen

Verwenden Sie zum Erstellen eines Channels die Methode projects.locations.channels.create. In den folgenden Beispielen wird ein Kanal erstellt, der einen HLS-Livestream generiert. Der Livestream besteht aus einer einzelnen HD-Version (1280 × 720).

Wenn du VOD-Clips erstellen möchtest, füge der Kanalkonfiguration das Objekt retentionConfig hinzu.

"retentionConfig": {
  "retentionWindowDuration": {
      "seconds": 86400
    }
},

Wenn die Datenaufbewahrung für einen Livestream-Kanal aktiviert ist, werden die Livestream-Segmente und das Manifest aufbewahrt, um VOD-Clips zu erstellen. Mit dem Objekt retentionWindowDuration wird angegeben, wie lange die Livestream-Ausgabe nach dem Hochladen in Cloud Storage gespeichert wird. Das Speicherzeitraum beginnt zu dem Zeitpunkt, zu dem das Segment in Cloud Storage erstellt wird.

Der Zeitraum für die Bindung ist auf 30 Tage begrenzt. Nach Ablauf des Speicherzeitraums werden die Dateien der Livestream-Segmente und die Manifestdatei automatisch aus Cloud Storage gelöscht. Das VOD-Clip-Manifest und die zugehörigen Segmentdateien werden nicht automatisch gelöscht. Du kannst keine VOD-Clips mit gelöschten Segmenten erstellen. Das Löschen ist asynchron und kann bis zu 24 Stunden dauern.

Gib einen Schlüssel für das Manifest an, um das Erstellen von VOD-Clips zu aktivieren. Auf diesen Schlüssel verweist du beim Erstellen des Clips. Es werden nur HLS-Manifeste unterstützt.

"manifests": [
{
  ...
  "key": "manifest_hls"
}

Ersetzen Sie diese Werte in den folgenden Anfragedaten:

  • PROJECT_NUMBER: Ihre Google Cloud-Projektnummer. Sie finden sie auf der Seite IAM-Einstellungen im Feld Projektnummer.
  • LOCATION: Der Speicherort, an dem der Kanal erstellt werden soll. Verwenden Sie eine der unterstützten Regionen.
    Standorte anzeigen
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-south1
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-north1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-west4
  • CHANNEL_ID: Eine benutzerdefinierte Kennung für den zu erstellenden Kanal. Dieser Wert muss 1–63 Zeichen lang sein, mit [a-z0-9] beginnen und enden und darf zwischen den Zeichen Bindestriche (-) enthalten.
  • INPUT_ID: die benutzerdefinierte Kennung für den Eingabeendpunkt
  • BUCKET_NAME: Der Name des Cloud Storage-Buckets, den du zum Speichern des Manifests und der Segmentdateien des Livestreams erstellt hast

Wenn Sie die Anfrage senden möchten, maximieren Sie eine der folgenden Optionen:

Sie sollten in etwa folgende JSON-Antwort erhalten:

{
  "name": "projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_ID",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata",
    "createTime": CREATE_TIME,
    "target": "projects/PROJECT_NUMBER/locations/LOCATION/channels/CHANNEL_ID",
    "verb": "create",
    "requestedCancellation": false,
    "apiVersion": "v1"
  },
  "done": false
}

Mit diesem Befehl wird ein Vorgang mit langer Ausführungszeit erstellt, mit dem Sie den Fortschritt Ihrer Anfrage verfolgen können. Weitere Informationen finden Sie unter Vorgänge mit langer Ausführungszeit verwalten .

Kanal starten

Verwenden Sie zum Starten eines Kanals die Methode projects.locations.channels.start.

Ersetzen Sie diese Werte in den folgenden Anfragedaten:

  • PROJECT_NUMBER: Ihre Google Cloud-Projektnummer. Sie finden sie auf der Seite IAM-Einstellungen im Feld Projektnummer.
  • LOCATION: den Standort deines Kanals. Wähle eine der unterstützten Regionen aus.
    Standorte anzeigen
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-south1
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-north1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-west4
  • CHANNEL_ID: eine benutzerdefinierte Kennung für den Kanal

Wenn Sie die Anfrage senden möchten, maximieren Sie eine der folgenden Optionen:

Sie sollten in etwa folgende JSON-Antwort erhalten:

{
  "name": "projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_ID",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata",
    "createTime": CREATE_TIME,
    "target": "projects/PROJECT_NUMBER/locations/LOCATION/channels/CHANNEL_ID",
    "verb": "start",
    "requestedCancellation": false,
    "apiVersion": "v1"
  },
  "done": false
}

Mit diesem Befehl wird ein Vorgang mit langer Ausführungszeit erstellt, mit dem Sie den Fortschritt Ihrer Anfrage verfolgen können. Weitere Informationen finden Sie unter Vorgänge mit langer Ausführungszeit verwalten .

Eingabestream senden

Öffnen Sie ein neues Terminalfenster. Führen Sie den folgenden Befehl aus und verwenden Sie dabei INPUT_STREAM_URI aus dem Abschnitt Details zum Eingabeendpunkt abrufen:

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

VOD-Clip erstellen

Verwende die Methode projects.locations.channels.clips.create, um einen VOD-Clip zu erstellen.

Gib im Feld outputUri den Speicherort an, an dem die Clips und die Clip-Manifestdatei in Cloud Storage gespeichert werden sollen. Du kannst denselben Bucket verwenden, den du für das Manifest des Livestreams erstellt hast, oder einen anderen. Sie können dem Bucketnamen auch einen Verzeichnisnamen anhängen, z. B. my-bucket/vod-clip.

Verwende das Feld manifestKey im Array clipManifests, um das Manifest anzugeben, aus dem Clips gespeichert werden sollen. In der Beispiel-Kanalkonfiguration auf dieser Seite ist dieser Schlüssel auf manifest_hls gesetzt.

Du kannst mehrere Zeitabschnitte aus dem Livestream in einem einzigen Clip kombinieren, indem du dem Array slices timeSlice-Objekte hinzufügst.

"outputUri": "gs://my-bucket",
"clipManifests":[
  {
    "manifestKey": "manifest_hls"
  }
],
"slices":[
  {
    "timeSlice": {
      "markinTime": "2022-07-08T23:03:20.000Z",
      "markoutTime": "2022-07-08T23:04:20.000Z"
    }
  },
  {
    "timeSlice": {
      "markinTime": "2022-07-08T23:05:20.000Z",
      "markoutTime": "2022-07-08T23:06:20.000Z"
    }
  }
]

Wichtige Hinweise:

  • Jeder Clip muss mindestens eine timeSlice in slices enthalten.
  • Das Feld clipManifests.manifestKey muss sich auf ein definiertes HLS-Manifest im übergeordneten Kanal des Clips beziehen. Wenn die Anfrage zum Erstellen des Clip-Jobs erfolgreich ist, wird der URI des generierten Clip-Manifests im Feld clipManifests.outputUri zurückgegeben. Dieser URI befindet sich im Pfad, der im Feld outputUri des Clips angegeben ist.
  • Das clipManifests-Array unterstützt nur ein Manifest pro Anfrage. Wenn du mehrere Manifeste für denselben Clipjob generieren möchtest, musst du die Manifeste in mehrere Clipjob-Anfragen aufteilen.
  • Clip-Scheiben müssen homogen sein. Jedes Element muss vom Typ timeSlice sein.
  • Die timeSlice-Objekte dürfen sich nicht überschneiden und müssen in chronologischer Reihenfolge angeordnet sein. Der Wert im Feld markinTime muss in jedem timeSlice vor dem Wert im Feld markoutTime liegen.
  • Wenn das aktuelle markinTime eines Clips vor der Startzeit des Kanals oder dem Beginn des Bindungszeitraums liegt, wird die Markierungszeit auf den jeweils späteren Zeitpunkt festgelegt.
  • Wenn das aktuelle markoutTime eines Clips nach der Ausstrahlungszeit des Kanals liegt, wird es auf die Ausstrahlungszeit des Kanals gesetzt. Wenn das aktuelle markoutTime eines Clips später als die aktuelle Systemzeit ist, wird es auf die Zeit festgelegt, zu der die API die Clip-Aufgabe tatsächlich startet.
  • Die maximale Dauer eines Clips beträgt 24 Stunden.

Ersetzen Sie diese Werte in den folgenden Anfragedaten:

  • PROJECT_NUMBER: Ihre Google Cloud-Projektnummer. Sie finden sie auf der Seite IAM-Einstellungen im Feld Projektnummer.
  • LOCATION: den Standort deines Kanals. Wähle eine der unterstützten Regionen aus.
    Standorte anzeigen
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-south1
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-north1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-west4
  • CHANNEL_ID: eine benutzerdefinierte Kennung für den Kanal
  • CLIP_ID: eine benutzerdefinierte Kennung für den VOD-Clip
  • MARK_IN_TIME: die Markierung in Unix-Epochenzeit im ursprünglichen Live-Stream-Manifest; verwendet einen Zeitstempel im RFC3339-UTC-„Zulu“-Format (z. B. 2014-10-02T15:01:23Z)
  • MARK_OUT_TIME: die Unix-Ärazeit im ursprünglichen Live-Stream-Manifest; verwendet einen Zeitstempel im „Zulu“-Format von RFC3339 UTC (z. B. 2014-10-02T15:01:23Z)
  • BUCKET_NAME: Der Name des Cloud Storage-Buckets, den du zum Speichern des VOD-Clip-Manifests und der Segmentdateien erstellt hast. Du kannst denselben Bucket verwenden, den du für das Live-Stream-Manifest erstellt hast, oder einen anderen Bucket. Du kannst dem Bucket-Namen auch einen Verzeichnisnamen anhängen (z. B. my-bucket/vod-clip).

Wenn Sie die Anfrage senden möchten, maximieren Sie eine der folgenden Optionen:

Sie sollten in etwa folgende JSON-Antwort erhalten:

{
  "name": "projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_ID",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata",
    "createTime": CREATE_TIME,
    "target": "projects/PROJECT_NUMBER/locations/LOCATION/channels/CHANNEL_ID/clips/CLIP_ID",
    "verb": "create",
    "requestedCancellation": false,
    "apiVersion": "v1"
  },
  "done": false
}

Mit diesem Befehl wird ein Vorgang mit langer Ausführungszeit erstellt, mit dem Sie den Fortschritt Ihrer Anfrage verfolgen können. Weitere Informationen finden Sie unter Vorgänge mit langer Ausführungszeit verwalten .

VOD-Clip abrufen

Wenn du einen VOD-Clip abrufen möchtest, verwende die Methode projects.locations.channels.clips.get.

Ersetzen Sie diese Werte in den folgenden Anfragedaten:

  • PROJECT_NUMBER: Ihre Google Cloud-Projektnummer. Sie finden sie auf der Seite IAM-Einstellungen im Feld Projektnummer.
  • LOCATION: den Standort deines Kanals. Wähle eine der unterstützten Regionen aus.
    Standorte anzeigen
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-south1
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-north1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-west4
  • CHANNEL_ID: eine benutzerdefinierte Kennung für den Kanal
  • CLIP_ID: eine benutzerdefinierte Kennung für den VOD-Clip

Wenn Sie die Anfrage senden möchten, maximieren Sie eine der folgenden Optionen:

Sie sollten in etwa folgende JSON-Antwort erhalten:

{
  "name": "projects/PROJECT_NUMBER/locations/LOCATION/channels/CHANNEL_ID/clips/CLIP_ID",
  "createTime": CREATE_TIME,
  "startTime": START_TIME,
  "updateTime": UPDATE_TIME,
  "state": "SUCCEEDED",
  "outputUri": "gs://BUCKET_NAME",
  "slices": [
    {
      "timeSlice": {
        "markinTime": "MARK_IN_TIME",
        "markoutTime": "MARK_OUT_TIME"
      }
    }
  ],
  "features": {},
  "clipManifests": [
    {
      "manifestKey": "manifest_hls",
      "outputUri": "gs://BUCKET_NAME/main.m3u8"
    }
  ]
}

Das generierte Manifest befindet sich unter dem URI, der im Feld clipManifests.outputUri angegeben ist. Der Dateiname des Manifests entspricht dem Feldwert manifests.fileName des übergeordneten Kanals.

Die Antwort sollte Folgendes enthalten:

{
  ...
  "state": "SUCCEEDED"
  ...
}

Mit der Methode projects.locations.channels.clips.get sind nur die letzten 1.000 Clipjob-Einträge pro Kanal verfügbar. Alle Clip-Job-Einträge, die älter als das Limit sind, werden entfernt. Du musst die mit der outputUri angegebenen generierten Clipdateien verwalten. Die Live Stream API löscht diese Dateien nicht aus Cloud Storage.

Bucket-Inhalt prüfen

Öffne den Cloud Storage-Bucket, der im Feld outputUri des Clips angegeben ist. Prüfen Sie, ob die folgenden Dateien und Verzeichnisse vorhanden sind:

  • Ein Manifest der obersten Ebene für den Clip mit demselben Namen wie die in der Kanalkonfiguration angegebene manifests.fileName (z. B. main.m3u8). Dieses Manifest kann mit einem Online-Medienplayer wiedergegeben werden.
  • Ein Verzeichnis für jede im Kanal angegebene muxStreams.key (z. B. mux_video_ts)
    • Eine Playlist für den Clip (z. B. index-1.m3u8)
    • Ein Verzeichnis mit dem Namen YYYYMMDDTHHMMSSZ (z. B. 20220708T203309Z/), das die VOD-Clipsegmente enthält
      • Mehrere Segment-segment-number.ts-Dateien, aus denen der VOD-Clip besteht

VOD-Clip abspielen

Führen Sie die folgenden Schritte aus, um die generierte Mediadatei in Shaka Player abzuspielen:

  1. Machen Sie den von Ihnen erstellten Cloud Storage-Bucket öffentlich.
  2. So aktivieren Sie Cross-Origin Resource Sharing (CORS) für einen Cloud Storage-Bucket:
    1. Erstellen Sie eine JSON-Datei, die Folgendes enthält:
      [
        {
          "origin": ["https://shaka-player-demo.appspot.com/"],
          "responseHeader": ["Content-Type", "Range"],
          "method": ["GET", "HEAD"],
          "maxAgeSeconds": 3600
        }
      ]
    2. Führen Sie den folgenden Befehl aus, nachdem Sie JSON_FILE_NAME durch den Namen der im vorherigen Schritt erstellten JSON-Datei ersetzt haben:
      gcloud storage buckets update gs://BUCKET_NAME --cors-file=JSON_FILE_NAME.json
  3. Suchen Sie im Cloud Storage-Bucket nach der generierten Datei. Klicken Sie in der Spalte Öffentlicher Zugriff der Datei auf URL kopieren.
  4. Rufen Sie Shaka Player, ein Online-Livestream-Player, auf.
  5. Klicken Sie in der Navigationsleiste oben auf Benutzerdefinierte Inhalte.
  6. Klicken Sie auf die Schaltfläche +.
  7. Fügen Sie die öffentliche URL der Datei in das Feld URL manifestieren ein.

  8. Geben Sie einen Namen in das Feld Name ein.

  9. Klicken Sie auf Speichern.

  10. Klicken Sie auf Wiedergabe.

Während des Livestreams sollte ein Testmuster wiedergegeben werden.

Testmustervideo

Ereignisse für Werbeunterbrechungen und Werbeblöcke

Wenn du für den Livestream ein Ereignis für Werbeunterbrechungen erstellt hast, enthalten die VOD-Clips keine Anzeigen. Die API generiert eine Playlist, in der die Werbeunterbrechungspunkte durch die folgenden Tags ersetzt werden:

#EXT-X-CUE-OUT: AD_BREAK_DURATION
#EXT-X-CUE-IN

Einblendungen, die am Anfang oder Ende des VOD-Clips erscheinen, werden automatisch entfernt. Slates, die im Stream zu sehen sind, werden im generierten VOD-Clip beibehalten.