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 de fichiers de segments enregistrés à partir d'une diffusion en direct. Seuls les fichiers manifestes HLS sont acceptés.
Différences entre les extraits VOD et les sessions DVR
Les extraits VOD (également appelés extraits de chaîne) sont semblables aux sessions DVR, 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 sessions DVR, consultez Créer une session DVR.
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 emplacementsus-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 emplacementsus-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 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 se compose d'une seule version haute définition (1 280 x 720).
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 segments et le fichier manifeste de la diffusion en direct sont conservés afin de créer des extraits VOD. 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 de diffusion en direct et le fichier manifeste sont automatiquement supprimés de Cloud Storage. (Le fichier manifeste du clip VOD et les fichiers de segment associés ne sont pas automatiquement supprimés.) Vous ne pouvez pas créer d'extraits VOD à partir 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 clips VOD. Vous vous référez à cette clé lorsque vous créez le 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 chaîne. Utilisez l'une des régions disponibles.Afficher les emplacementsus-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éeBUCKET_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 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 emplacementsus-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
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 un extrait de VOD
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 temporelles du flux 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 extrait doit contenir au moins un
timeSlice
dansslices
. - Le champ
clipManifests.manifestKey
doit faire référence à un fichier manifeste HLS défini dans la chaîne parente du clip. Si la requête de création de la tâche de clip aboutit, l'URI du fichier manifeste de clip généré est renvoyé dans le champclipManifests.outputUri
. Cet URI se trouve dans le chemin d'accès spécifié par le champoutputUri
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 de montage, vous devez les diviser en plusieurs demandes de montage. - Les segments de clip 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 chaquetimeSlice
. - 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èremarkoutTime
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
: 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 emplacementsus-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 canalCLIP_ID
: identifiant défini par l'utilisateur pour l'extrait VODMARK_IN_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
).MARK_OUT_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
).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. Pour en savoir plus, consultez la section Gérer les opérations de longue durée .
Obtenir l'extrait de la vidéo à la demande
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 de votre chaîne. Utilisez l'une des régions disponibles.Afficher les emplacementsus-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 canalCLIP_ID
: identifiant défini par l'utilisateur pour l'extrait 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 à l'URI spécifié dans le champ clipManifests.outputUri
. Le nom de fichier du fichier manifeste est identique à la valeur du champ manifests.fileName
du canal parent.
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 tâches d'extraction antérieurs à 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é au format
YYYYMMDDTHHMMSSZ
(par exemple,20220708T203309Z/
) qui contient les segments de clips VOD- Plusieurs fichiers
segment-number.ts
de segments qui constituent l'extrait VOD
- Plusieurs fichiers
- Une playlist pour le clip (par exemple,
Lire l'extrait de la VOD
Pour lire le fichier multimédia généré dans Shaka Player, procédez comme suit :
- Rendez le bucket Cloud Storage que vous avez créé publiquement lisible.
- Pour activer le partage des ressources entre origines multiples (CORS) sur un bucket Cloud Storage, procédez comme suit :
- 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 } ]
- 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
- Créez un fichier JSON contenant les informations suivantes :
- Dans le bucket Cloud Storage, recherchez le fichier généré. Cliquez sur Copier l'URL dans la colonne Accès public du fichier.
- Accédez à Shaka Player, un lecteur de diffusion en direct en ligne.
- Cliquez sur Contenu personnalisé dans la barre de navigation supérieure.
- Cliquez sur le bouton +.
Collez l'URL publique du fichier dans la zone URL du fichier manifeste.
Saisissez un nom dans la zone Nom.
Cliquez sur Enregistrer.
Cliquez sur Jouer.
Un modèle de test devrait s'afficher pendant la diffusion en direct.
É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 l'extrait VOD généré.