Créer des extraits VOD à partir d'une diffusion en direct

Cette page explique comment créer des extraits vidéo à la demande (VOD) à partir d'une diffusion en direct à l'aide de l'API Live Stream. Les extraits VOD sont constitués de fichiers manifestes HLS et segments qui ont été enregistrés à partir d'une diffusion en direct. Fichiers manifestes HLS uniquement sont pris en charge.

Configurer votre authentification et votre projet Google Cloud

Si vous n'avez pas encore créé de projet Google Cloud ni d'identifiants, consultez la section Avant de commencer.

Créer un point de terminaison d'entrée

Pour créer un point de terminaison d'entrée, utilisez la méthode projects.locations.inputs.create.

Avant d'utiliser les données de requête ci-dessous, effectuez les remplacements suivants :

  • PROJECT_NUMBER : numéro de votre projet Google Cloud, qui se trouve dans le champ Numéro de projet sur la page Paramètres IAM.
  • LOCATION : emplacement dans lequel créer le point de terminaison d'entrée. Utilisez l'une des régions disponibles.
    Afficher les emplacements
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-west4
  • INPUT_ID: identifiant défini par l'utilisateur pour la nouvelle entrée. à créer (auquel vous envoyez votre flux d'entrée). Cette valeur doit comporter entre 1 et 63 caractères, commencer et se terminer par [a-z0-9], et peut contenir des tirets (-) entre les caractères. Par exemple, my-input.

Pour envoyer votre requête, développez l'une des options suivantes :

Vous devriez recevoir une réponse JSON de ce type :

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

Cette commande crée une opération de longue durée que vous pouvez utiliser pour suivre la progression de votre requête. Voir Gérer les opérations de longue durée pour plus d'informations.

Obtenir les détails du point de terminaison d'entrée

Pour obtenir les détails du point de terminaison d'entrée, utilisez la méthode projects.locations.inputs.get.

Avant d'utiliser les données de requête ci-dessous, effectuez les remplacements suivants :

  • PROJECT_NUMBER : numéro de votre projet Google Cloud, qui se trouve dans le champ Numéro de projet sur la page Paramètres IAM.
  • LOCATION: emplacement où se trouve votre point de terminaison d'entrée localisé ; utilisez l'une des régions disponibles.
    Afficher les lieux
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-west4
  • INPUT_ID : identifiant défini par l'utilisateur pour le point de terminaison d'entrée

Pour envoyer votre requête, développez l'une des options suivantes :

Vous devriez recevoir une réponse JSON de ce type :

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

Recherchez le champ uri et copiez le INPUT_STREAM_URI renvoyé pour l'utiliser plus tard dans la section Envoyer le flux d'entrée.

Créer une chaîne

Pour créer un canal, utilisez la méthode projects.locations.channels.create. Les exemples suivants créent une chaîne qui génère un flux en direct HLS. La diffusion en direct est constituée d'un seul écran haute définition (1 280 x 720). le rendu final.

Pour activer la création de clips VOD, ajoutez l'objet retentionConfig à la configuration de la chaîne.

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

Lorsque la conservation est activée pour une chaîne de diffusion en direct, les fichiers de segment et de fichier manifeste sont conservés afin de créer des extraits VOD. La L'objet retentionWindowDuration spécifie durée pendant laquelle le flux en direct est enregistré après sa mise en ligne sur Cloud Storage. La période de conservation commence au moment où le segment créés dans Cloud Storage. La période de conservation est limitée à 30 jours. Une fois la période de conservation écoulée, le segment est automatiquement supprimé Cloud Storage. Vous ne pouvez pas créer de clips VOD à partir de segments supprimés. La de suppression est asynchrone et peut prendre jusqu'à 24 heures.

Spécifiez une clé pour le fichier manifeste afin d'activer la création d'extraits vidéo à la demande. Vous vous référez à lors de la création du clip. Seuls les fichiers manifestes HLS sont acceptés.

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

Avant d'utiliser les données de requête ci-dessous, effectuez les remplacements suivants :

  • PROJECT_NUMBER : numéro de votre projet Google Cloud, qui se trouve dans le champ Numéro de projet sur la page Paramètres IAM.
  • LOCATION: emplacement dans lequel créer la canal ; utilisez l'une des régions disponibles.
    Afficher les emplacements
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-west4
  • CHANNEL_ID : identifiant défini par l'utilisateur pour le canal à créer. Cette valeur doit comporter entre 1 et 63 caractères, commencer et se terminer par [a-z0-9], et peut contenir des tirets (-) entre les caractères.
  • INPUT_ID : identifiant défini par l'utilisateur pour le point de terminaison d'entrée
  • BUCKET_NAME : nom du bucket Cloud Storage que vous avez créé pour contenir le fichier manifeste et les fichiers de segment de flux en direct

Pour envoyer votre requête, développez l'une des options suivantes :

Vous devriez recevoir une réponse JSON de ce type :

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

Cette commande crée une opération de longue durée (LRO) que vous pouvez utiliser pour suivre la progression de votre demande. Pour en savoir plus, consultez la section Gérer les opérations de longue durée.

Démarrer le canal

Pour démarrer un canal, utilisez la méthode projects.locations.channels.start.

Avant d'utiliser les données de requête ci-dessous, effectuez les remplacements suivants :

  • PROJECT_NUMBER : numéro de votre projet Google Cloud, qui se trouve dans le champ Numéro de projet sur la page Paramètres IAM.
  • LOCATION : emplacement de votre chaîne. Utilisez l'une des régions disponibles.
    Afficher les emplacements
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-west4
  • CHANNEL_ID: identifiant de la chaîne défini par l'utilisateur

Pour envoyer votre requête, développez l'une des options suivantes :

Vous devriez recevoir une réponse JSON de ce type :

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

Cette commande crée une opération de longue durée (LRO) que vous pouvez utiliser pour suivre la progression de votre demande. Pour en savoir plus, consultez la section Gérer les opérations de longue durée.

Envoyer le flux d'entrée

Ouvrez une nouvelle fenêtre de terminal. Exécutez la commande suivante, en utilisant INPUT_STREAM_URI dans le Section Obtenir les détails du point de terminaison d'entrée:

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

Créer un extrait vidéo à la demande

Pour créer un extrait VOD, utilisez la méthode projects.locations.channels.clips.create.

Utilisez le champ outputUri pour spécifier l'emplacement où enregistrer les extraits et le fichier manifeste des extraits dans Cloud Storage. Vous pouvez utiliser le même bucket que celui que vous avez créé pour le fichier manifeste de la diffusion en direct ou un autre bucket. Vous pouvez également ajouter un nom de répertoire au nom du bucket (par exemple, my-bucket/vod-clip).

Utilisez le champ manifestKey dans le tableau clipManifests pour spécifier le fichier manifeste à partir duquel enregistrer les extraits. Dans l'exemple de configuration de canal sur cette page, cette clé est définie sur manifest_hls.

Vous pouvez combiner plusieurs sections de la diffusion en direct en un seul extrait. en ajoutant des objets timeSlice au tableau slices.

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

Veuillez noter les points suivants :

  • Chaque clip doit contenir au moins un timeSlice po slices
  • Le champ clipManifests.manifestKey doit faire référence à un fichier manifeste HLS défini dans la chaîne parente du clip. Si la création du job d'extrait aboutit, l'URI du fichier manifeste du clip généré est renvoyé dans le champ clipManifests.outputUri. Cet URI est au chemin spécifié par le champ outputUri du clip.
  • Le tableau clipManifests n'accepte qu'un seul fichier manifeste par requête. Si vous souhaitez générer plusieurs fichiers manifestes pour la même tâche d'extrait, vous devez diviser les fichiers manifestes en plusieurs requêtes de job d'extrait.
  • Les segments de l'extrait doivent être homogènes. chaque élément doit être de type timeSlice
  • L'ensemble des objets timeSlice ne doit pas se chevaucher et être dans l'ordre chronologique. markinTime doit être antérieur à markoutTime dans chaque timeSlice.
  • Si le dernier markinTime d'un extrait est antérieur à l'heure de début de la chaîne ou au début de la période de conservation, l'heure de début de l'extrait est définie sur la plus tardive des deux.
  • Si la dernière markoutTime d'un extrait est postérieure à l'heure d'arrêt de la chaîne, elle est définie sur l'heure d'arrêt de la chaîne. Si la dernière markoutTime d'un extrait est postérieure à l'heure actuelle du système, elle est définie sur l'heure à laquelle l'API démarre réellement la tâche de découpage.
  • La durée maximale d'un extrait est de 24 heures.

Avant d'utiliser les données de requête ci-dessous, effectuez les remplacements suivants :

  • PROJECT_NUMBER: votre projet Google Cloud numéro ; celui-ci est indiqué dans le champ Numéro du projet Page Paramètres IAM
  • LOCATION : emplacement de votre chaîne. Utilisez l'une des régions disponibles.
    Afficher les emplacements
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-west4
  • CHANNEL_ID: identifiant de la chaîne défini par l'utilisateur
  • CLIP_ID : identifiant défini par l'utilisateur pour le clip VOD
  • MARK_IN_TIME: l'heure de l'epoch Unix marque dans le fichier manifeste d'origine de la diffusion en direct ; utilise un code temporel selon la RFC3339 UTC "Zulu" ; (par exemple, 2014-10-02T15:01:23Z)
  • MARK_OUT_TIME: heure de l'epoch Unix Markdown dans le fichier manifeste de la diffusion en direct d'origine. utilise un code temporel selon la RFC3339 UTC "Zulu" ; (par exemple, exemple : 2014-10-02T15:01:23Z)
  • BUCKET_NAME : nom du bucket Cloud Storage que vous avez créé pour contenir le fichier manifeste et les fichiers de segment du clip VOD. Vous pouvez utiliser le même bucket que celui que vous avez créé pour le fichier manifeste du flux en direct ou un autre. Vous pouvez également ajouter un nom de répertoire au nom du bucket (par exemple, my-bucket/vod-clip).

Pour envoyer votre requête, développez l'une des options suivantes :

Vous devriez recevoir une réponse JSON de ce type :

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

Cette commande crée une opération de longue durée que vous pouvez utiliser pour suivre la progression de votre requête. Voir Gérer les opérations de longue durée pour plus d'informations.

Télécharger l'extrait en VOD

Pour obtenir un extrait VOD, utilisez la méthode projects.locations.channels.clips.get.

Avant d'utiliser les données de requête ci-dessous, effectuez les remplacements suivants :

  • PROJECT_NUMBER : numéro de votre projet Google Cloud, qui se trouve dans le champ Numéro de projet sur la page Paramètres IAM.
  • LOCATION: emplacement où se trouve votre chaîne localisé ; utilisez l'une des régions disponibles.
    Afficher les emplacements
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-west4
  • CHANNEL_ID: identifiant de la chaîne défini par l'utilisateur
  • CLIP_ID : identifiant défini par l'utilisateur pour le clip VOD

Pour envoyer votre requête, développez l'une des options suivantes :

Vous devriez recevoir une réponse JSON de ce type :

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

Le fichier manifeste généré se trouve dans l'URI spécifié dans clipManifests.outputUri. Fichier manifeste le nom de fichier est identique à celui du canal parent, Valeur du champ manifests.fileName.

La réponse doit contenir les éléments suivants :

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

Seuls les 1 000 enregistrements de jobs de clips les plus récents par chaîne sont disponibles à l'aide de la méthode projects.locations.channels.clips.get. Tous les enregistrements de jobs d'extraction plus anciens que la limite sont supprimés. Vous devez gérer les fichiers de clip générés spécifiés par outputUri. L'API Live Stream ne supprime pas ces fichiers de Cloud Storage.

Vérifier le contenu du bucket

Ouvrez le bucket Cloud Storage spécifié dans le champ outputUri du clip. Vérifiez qu'il contient les fichiers et les répertoires suivants :

  • Un fichier manifeste de premier niveau pour l'extrait portant le même nom que l'manifests.fileName spécifié dans la configuration de la chaîne (par exemple, main.m3u8). Vous pouvez lire ce fichier manifeste à l'aide d'un lecteur multimédia en ligne.
  • Un répertoire pour chaque muxStreams.key spécifié dans le canal (par exemple, mux_video_ts)
    • Une playlist pour le clip (par exemple, index-1.m3u8)
    • Un répertoire nommé selon le format YYYYMMDDTHHMMSSZ (par exemple, 20220708T203309Z/) ; cet annuaire contient les segments d'extraits vidéo à la demande
      • Plusieurs fichiers de segment segment-number.ts qui composent l'extrait VOD

Lire l'extrait de la vidéo à la demande

Pour lire le fichier multimédia généré dans Shaka Player, procédez comme suit :

  1. Rendez le bucket Cloud Storage que vous avez créé publiquement lisible.
  2. Pour activer le partage des ressources entre origines multiples (CORS) sur un bucket Cloud Storage, procédez comme suit :
    1. Créez un fichier JSON contenant les informations suivantes :
      [
        {
          "origin": ["https://shaka-player-demo.appspot.com/"],
          "responseHeader": ["Content-Type", "Range"],
          "method": ["GET", "HEAD"],
          "maxAgeSeconds": 3600
        }
      ]
    2. Exécutez la commande suivante en remplaçant JSON_FILE_NAME par le nom du fichier JSON que vous avez créé à l'étape précédente :
      gcloud storage buckets update gs://BUCKET_NAME --cors-file=JSON_FILE_NAME.json
  3. Dans le bucket Cloud Storage, recherchez les . Cliquez sur Copier l'URL dans la colonne Accès public du fichier.
  4. Accédez à Shaka Player, un lecteur de diffusion en direct en ligne.
  5. Cliquez sur Contenu personnalisé dans la barre de navigation supérieure.
  6. Cliquez sur le bouton +.
  7. Collez l'URL publique du fichier dans la zone URL du fichier manifeste.

  8. Saisissez un nom dans la zone Nom.

  9. Cliquez sur Enregistrer.

  10. Cliquez sur Jouer.

Un modèle de test devrait s'afficher pendant la diffusion en direct.

Vidéo de format test

Événements de coupure publicitaire et de grille

Si vous avez créé un événement de coupure publicitaire pour la diffusion en direct, les extraits VOD ne contiendront pas les annonces. L'API génère une playlist dans laquelle les points de coupure des annonces sont remplacés par les balises suivantes :

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

Les titres qui apparaissent au début ou à la fin de l'extrait VOD sont automatiquement supprimés. Les fiches qui apparaissent dans le flux, entourées du contenu de la diffusion en direct, sont conservées dans le clip VOD généré.