Créer une session DVR

Cette page explique comment créer une session d'enregistreur vidéo numérique (DVR) à partir d'un flux en direct à l'aide de l'API Live Stream. Vous pouvez regarder une session DVR pendant une diffusion en direct et après sa fin.

Différences entre les sessions DVR et les extraits de chaîne

Les sessions DVR sont semblables aux extraits de chaîne (également appelés extraits VOD), avec les principales différences suivantes:

  • Sessions DVR :
    • L'API enregistre le fichier manifeste DVR au même emplacement que les segments de flux en direct. Il n'y a donc pas de copie supplémentaire dans Cloud Storage. Le fichier manifeste DVR est semblable au fichier manifeste de la diffusion en direct, mais plus long. Lorsque la période de conservation expire, le fichier manifeste est supprimé, ainsi que les fichiers de segment.
    • Vous pouvez créer une session d'enregistreur numérique vidéo pour des contenus passés, actuels et futurs. Par exemple, une session DVR peut suivre une diffusion en direct, ou vous pouvez programmer une session DVR pour qu'elle démarre et s'arrête à une date ultérieure.
    • Un cas d'utilisation courant des sessions DVR consiste à prendre en charge les fonctionnalités DVR pour les événements de streaming en direct. Par exemple, un spectateur peut rejoindre la diffusion en direct une heure après son début et regarder le contenu avec un décalage d'une heure (ou sauter certaines parties).
  • Clips de la chaîne :
    • L'API Live Stream copie le fichier manifeste du clip et les fichiers de segment associés dans un répertoire spécifié par l'utilisateur afin qu'ils ne soient pas supprimés lorsque la période de conservation expire. Vous avez le contrôle total sur le clip.
    • Seuls les contenus passés peuvent être coupés. Les extraits en direct et la planification d'extraits futurs ne sont pas acceptés.
    • Un cas d'utilisation typique des clips consiste à archiver une diffusion en direct, en la rendant disponible en tant que fichier VOD indéfiniment.

Pour en savoir plus sur les extraits de chaîne, consultez la section Créer des extraits VOD à partir d'une diffusion en direct.

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-south1
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-north1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-west4
  • INPUT_ID: identifiant défini par l'utilisateur pour le nouveau point de terminaison d'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. Pour en savoir plus, consultez la section Gérer les opérations de longue durée .

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 de votre 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-south1
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-north1
    • 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 de test 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 un canal qui génère une diffusion en direct HLS. La diffusion en direct se compose d'un seul rendu haute définition (1 280 x 720).

Pour activer la création de sessions DVR, ajoutez l'objet retentionConfig à la configuration du canal.

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

Lorsque la fidélisation est activée pour une chaîne de diffusion en direct, les segments et le fichier manifeste de la diffusion en direct sont conservés afin de créer des sessions DVR. L'objet retentionWindowDuration spécifie la durée pendant laquelle la sortie de la diffusion en direct est enregistrée après avoir été importée dans Cloud Storage. La période de conservation commence au moment de la création du segment dans Cloud Storage.

La période de conservation est limitée à 30 jours. Une fois la période de conservation écoulée, les fichiers de segments, le fichier manifeste de la diffusion en direct et le fichier manifeste du DVR sont automatiquement supprimés de Cloud Storage. Vous ne pouvez pas créer de sessions d'enregistreur numérique vidéo à l'aide de segments supprimés. La suppression est asynchrone et peut prendre jusqu'à 24 heures.

Spécifiez une clé pour le fichier manifeste afin d'activer la création de sessions DVR. Vous vous référez à cette clé lorsque vous créez la session. 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 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-south1
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-north1
    • 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 du 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 que vous pouvez utiliser pour suivre la progression de votre requête. 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-south1
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-north1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-west4
  • CHANNEL_ID: identifiant défini par l'utilisateur pour le canal

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 que vous pouvez utiliser pour suivre la progression de votre requête. Pour en savoir plus, consultez la section Gérer les opérations de longue durée .

Envoyer le flux d'entrée de test

Ouvrez une nouvelle fenêtre de terminal. Exécutez la commande suivante, à l'aide de INPUT_STREAM_URI de la 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 une session DVR

Pour créer une session DVR, utilisez la méthode projects.locations.channels.dvrSessions.create.

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

Vous pouvez combiner plusieurs sections temporelles de la diffusion en direct en une seule session DVR en ajoutant des objets timeInterval au tableau dvrWindows.

"dvrManifests": [
  {
    "manifestKey": "manifest_hls"
  }
],
"dvrWindows": [
  {
    "timeInterval": {
      "startTime": "2022-07-08T23:03:20.000Z",
      "endTime": "2022-07-08T23:04:20.000Z"
    }
  },
  {
    "timeInterval": {
      "startTime": "2022-07-08T23:05:20.000Z",
      "endTime": "2022-07-08T23:06:20.000Z"
    }
  }
]

Veuillez noter les points suivants :

  • Chaque session DVR doit contenir au moins un timeInterval dans dvrWindows.
  • Le champ dvrManifests.manifestKey doit faire référence à un fichier manifeste HLS défini dans la chaîne parente de la session DVR. Si la requête de création de session DVR aboutit, l'URI du fichier manifeste DVR généré est renvoyé dans le champ dvrManifests.outputUri. Cet URI se trouve dans le chemin d'accès spécifié par le champ outputUri du canal.
  • Le tableau dvrManifests n'accepte qu'un seul fichier manifeste par requête. Si vous souhaitez générer plusieurs fichiers manifestes pour les mêmes périodes d'enregistrement DVR, vous devez les diviser en plusieurs sessions d'enregistrement DVR.
  • L'ensemble des objets timeInterval ne doit pas se chevaucher et être organisé par ordre chronologique. startTime doit être antérieur à endTime dans chaque timeInterval.
  • startTime et endTime font référence à la chronologie de la diffusion en direct. Si le code temporel intégré est activé pour le fichier manifeste, cette chronologie est basée sur le code temporel intégré fourni dans le flux d'entrée et peut différer de l'horloge murale.
  • La durée totale maximale de la fenêtre DVR est de 24 heures.
  • Le endTime du dernier timeInterval dans dvrWindows peut être laissé vide. Dans ce cas, endTime est calculé automatiquement pour maximiser la durée de la session DVR (soit une durée totale de 24 heures).
  • Les fenêtres DVR peuvent couvrir n'importe quelle période, y compris celles à venir. Toutefois, le nombre de sessions DVR avec dvrWindows s'étendant à une date ultérieure est limité à un.
  • Le nombre de sessions DVR pour lesquelles toutes les fenêtres DVR sont strictement dans le passé n'est pas limité.

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-south1
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-north1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-west4
  • CHANNEL_ID: identifiant défini par l'utilisateur pour le canal
  • DVR_SESSION_ID: identifiant défini par l'utilisateur pour la session DVR
  • INTERVAL_START_TIME: heure Unix de la marque dans le fichier manifeste du flux en direct d'origine. Utilise un code temporel au format UTC "Zulu" RFC3339 (par exemple, 2014-10-02T15:01:23Z).
  • INTERVAL_END_TIME: l'époque Unix de la balise dans le fichier manifeste du flux en direct d'origine. Utilise un code temporel au format RFC3339 UTC "Zulu" (par exemple, 2014-10-02T15:01:23Z).

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/dvrSessions/DVR_SESSION_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. Pour en savoir plus, consultez la section Gérer les opérations de longue durée .

Obtenir la session DVR

Pour obtenir une session DVR, utilisez la méthode projects.locations.channels.dvrSessions.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 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-south1
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-north1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-west4
  • CHANNEL_ID: identifiant défini par l'utilisateur pour le canal
  • DVR_SESSION_ID: identifiant défini par l'utilisateur pour la session DVR

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/dvrSessions/DVR_SESSION_ID",
  "createTime": CREATE_TIME,
  "startTime": START_TIME,
  "updateTime": UPDATE_TIME,
  "state": "SUCCEEDED",
  "dvrManifests": [
    {
      "manifestKey": "manifest_hls",
      "outputUri": "gs://BUCKET_NAME/dvr/DVR_SESSION_ID/main.m3u8"
    }
  ],
  "dvrWindows": [
    {
      "timeInterval": {
        "startTime": "INTERVAL_START_TIME",
        "endTime": "INTERVAL_END_TIME"
      }
    }
  ]
}

La réponse doit contenir un champ state indiquant l'état de la session:

{
  ...
  "state": "PENDING" // DVR session is waiting to be processed (for example, it is waiting for the channel to start)
  ...
}

Pour obtenir la liste des états et leurs descriptions, consultez la documentation de référence sur state.

Vérifier le contenu du bucket

Ouvrez le bucket Cloud Storage tel que spécifié dans le champ dvrManifests.outputUri de la session DVR. Vérifiez qu'il contient les fichiers et répertoires suivants:

  • Un fichier manifeste de premier niveau pour la session DVR 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 sous-répertoire pour chaque muxStreams.key spécifié dans le canal (par exemple, mux_video_ts). Chaque sous-répertoire contient une playlist pour la session DVR (par exemple, index-1.m3u8).

Lire la session DVR

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 le fichier généré. 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 du modèle de test

Événements de coupure publicitaire

Si vous avez créé un événement de coupure publicitaire pour la diffusion en direct, la session DVR contient les segments d'annonces tels qu'ils apparaissent dans la diffusion en direct.