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 emplacementsus-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 lieuxus-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 emplacementsus-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é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 (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 emplacementsus-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
poslices
- 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 champclipManifests.outputUri
. Cet URI est au chemin 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 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 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
: votre projet Google Cloud numéro ; celui-ci est indiqué dans le champ Numéro du projet Page Paramètres IAMLOCATION
: 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-northeast1
asia-southeast1
australia-southeast1
europe-west1
europe-west2
europe-west3
europe-west4
CHANNEL_ID
: identifiant de la chaîne défini par l'utilisateurCLIP_ID
: identifiant défini par l'utilisateur pour le clip VODMARK_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 emplacementsus-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'utilisateurCLIP_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
- Plusieurs fichiers de segment
- Une playlist pour le clip (par exemple,
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 :
- 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 les . 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 le clip VOD généré.