

# Enregistrement automatique IVS vers Amazon S3 \$1 Diffusion à faible latence
<a name="record-to-s3"></a>

Cette section fournit des informations sur la fonctionnalité d’enregistrement automatique vers S3 de diffusion à faible latence d’Amazon IVS. Nous discutons du stockage de données pour les flux Amazon IVS enregistrés. Nous y présentons les contenus de stockage et le schéma du fichier de métadonnées. Nous discutons également de la lecture de votre contenu enregistré.


| Pour plus d’informations sur… | Voir… | 
| --- | --- | 
| Configuration et arrêt de l’enregistrement vidéo |   [Créer un canal avec une option d’enregistrement facultatif](https://docs.aws.amazon.com//ivs/latest/LowLatencyUserGuide/getting-started-create-channel.html) dans *Mise en route avec Amazon IVS* | 
| L’API |  [Référence d’API IVS](https://docs.aws.amazon.com//ivs/latest/LowLatencyAPIReference/Welcome.html) | 
| Coûts |  [Coûts Amazon IVS](https://docs.aws.amazon.com//ivs/latest/LowLatencyUserGuide/costs.html) | 

## Préfixe S3
<a name="r2s3-prefix"></a>

Le préfixe S3 est une structure de répertoire unique pour chaque flux en direct enregistré. Tous les fichiers de médias et de métadonnées du flux en direct sont écrits dans ce répertoire. Pour les canaux dont l’enregistrement est activé, le préfixe S3 est généré au démarrage d’une session en direct et est fourni dans l’événement CloudWatch au début et à la fin d’un enregistrement.

Le préfixe S3 a le format suivant :

```
/ivs/v1/<aws_account_id>/<channel_id>/<year>/<month>/<day>/<hours>/<minutes>/<recording_id>
```

Où :
+ `aws_account_id` correspond à l’ID de votre compte AWS (généré lorsque vous avez créé un compte AWS), à partir duquel le canal est créé.
+ `channel_id` correspond à l’ID de ressource faisant partie du canal ARN (la dernière partie du nom de ressource Amazon). Voir ARN dans [Glossaire](ivs-glossary.md).
+ `<year>/<month>/<day>/<hours>/<minutes>` correspond à l’horodatage UTC du démarrage de l’enregistrement.
+ `recording_id` correspond à un ID unique généré pour chaque session d’enregistrement.

Par exemple :

```
ivs/v1/123456789012/AsXego4U6tnj/2020/6/23/20/12/j8Z9O91ndcVs
```

## Enregistrer des contenus
<a name="r2s3-contents"></a>

Lorsque l’enregistrement démarre, les segments vidéo et les fichiers de métadonnées sont écrits dans le compartiment S3 configuré pour le canal. Ce contenu sont disponibles pour le post-traitement ou la lecture en tant que vidéo à la demande.

Notez qu’une fois qu’un flux en direct démarre et que l’événement EventBridge Recording Start est émis, il faut un peu de temps avant que les fichiers manifestes et les segments vidéo soient écrits. Nous vous recommandons de lire ou de traiter les flux enregistrés uniquement après l’envoi de l’événement Recording End. (Voir [Utilisation d’Amazon EventBridge avec IVS](eventbridge.md).)

Voici un exemple de structure de répertoire et de contenu d’un enregistrement d’une session Amazon IVS en direct :

```
ivs/v1/123456789012/AsXego4U6tnj/2020/6/23/20/12/j8Z9O91ndcVs/
   events
      recording-started.json
      recording-ended.json
   media
      hls
      thumbnails
```

Le dossier `events` contient les fichiers de métadonnées correspondant à l’événement d’enregistrement. Les fichiers de métadonnées JSON sont générés lorsque l’enregistrement démarre, se termine avec succès ou se termine avec des échecs :
+ `events/recording-started.json`
+ `events/recording-ended.json`
+ `events/recording-failed.json`

Un fichier `events` contiendra `recording-started.json` et `recording-ended.json` ou `recording-failed.json`.

Ceux-ci contiennent des métadonnées relatives à la session enregistrée et à ses formats de sortie. Les détails JSON sont fournis ci-dessous.

Le dossier `media` contient tous les contenus multimédias pris en charge, dans deux sous-dossiers :
+ `hls` contient tous les fichiers multimédia et manifestes générés au cours de la session en direct et est lisible avec le lecteur Amazon IVS. Ce dossier contient deux types de manifestes HLS : le manifeste principal standard `master.m3u8` et le manifeste activé par plage d’octets `byte-range-multivariant.m3u8`. Par conséquent, chaque dossier de rendu contient à la fois un fichier `playlist.m3u8` et un fichier `byte-range-variant.m3u8`. (Voir les [listes de lecture par plage d’octets](#r2s3-byte-range-playlists) ci-dessous.)
+ `thumbnails` contient des miniatures générées au cours de la session en direct. Les miniatures sont générées et écrites dans le compartiment toutes les minutes. (Pour modifier ce comportement, remplacez la propriété `thumbnailConfiguration` sur une configuration d’enregistrement.)

**Important :** le contenu du dossier `media` est généré dynamiquement et déterminé par les caractéristiques des premiers segments vidéo reçus. Le contenu du dossier peut ne pas représenter les caractéristiques finales (par exemple, la qualité du rendu). *Ne formulez aucune hypothèse à propos du chemin statique.* Pour découvrir les rendus HLS disponibles et leur chemin d’accès, utilisez les fichiers de métadonnées JSON décrits ci-dessous.

## Listes de lecture par plage d’octets
<a name="r2s3-byte-range-playlists"></a>

La fonctionnalité d’enregistrement automatique vers S3 prend en charge la génération de [listes de lecture par plage d’octets](https://datatracker.ietf.org/doc/html/draft-pantos-http-live-streaming-23#section-4.3.2.2), en plus des listes de lecture HLS standard. Les listes de lecture par plage d’octets sont conformes à la version 4 de la spécification HLS. Cela permet un découpage de contenu plus précis : dans une liste de lecture par plage d’octets, chaque segment d’un fichier d’index de rendu fait référence à une sous-plage d’octets d’un morceau vidéo, offrant ainsi une granularité supérieure à la taille standard de 10 secondes d’un fichier multimédia. Avec une liste de lecture par plage d’octets, la durée du segment est la même que l’intervalle d’images clés configuré pour le flux.

## Miniatures
<a name="r2s3-thumbnails"></a>

La propriété `thumbnailConfiguration` sur une configuration d’enregistrement vous permet d’activer/désactiver l’enregistrement des miniatures pour une session en direct et de modifier l’intervalle auquel les miniatures sont générées pour la session en direct. Les intervalles entre miniatures peuvent être compris entre 1 seconde et 60 secondes. Par défaut, l’enregistrement des miniatures est activé, à un intervalle de 60 secondes. Pour plus d’informations, consultez la [référence de l’API de diffusion à faible latence d’Amazon IVS](https://docs.aws.amazon.com//ivs/latest/LowLatencyAPIReference/Welcome.html).

La configuration des miniatures peut également inclure le champ `storage` (`SEQUENTIAL` et/ou `LATEST`) et une résolution (`LOWEST_RESOLUTION`, `SD`, `HD` ou `FULL_HD`). Vous trouverez ci-dessous les résolutions pour chaque option : 

160 <= `LOWEST_RESOLUTION` <= 360

360 <= `SD` <= 480

480 <= `HD` <= 720

720 <= `FULL_HD` <= 1080

Si `resolution` n’est pas défini pour un flux utilisant une entrée vidéo multipiste, les vignettes de tous les rendus sont enregistrées. Pour plus d’informations sur la multipiste, reportez-vous à [Vidéo multipiste](multitrack-video.md).

## Fusionner des flux fragmentés
<a name="r2s3-merge-fragmented-streams"></a>

La propriété `recordingReconnectWindowSeconds` d’une configuration d’enregistrement vous permet de spécifier un intervalle de temps (en secondes) pendant lequel, si votre flux est interrompu et qu’un nouveau flux est démarré, Amazon IVS tente d’enregistrer vers le même préfixe S3 que le flux précédent. En d’autres termes, si une diffusion se déconnecte puis se reconnecte dans l’intervalle spécifié, les multiples flux sont considérés comme une diffusion unique et sont fusionnés.

**Événements de changement d’état d’enregistrement IVS dans Amazon EventBridge :** les événements de fin d’enregistrement et les fichiers de métadonnées JSON *recording-ended* sont retardés d’au moins `recordingReconnectWindowSeconds`, pendant qu’Amazon IVS attend de s’assurer qu’un nouveau flux ne démarre pas.

Pour obtenir des instructions sur la configuration de la fonctionnalité de fusion des flux, veuillez consulter la rubrique [Étape 4 : créer un canal avec une option d'enregistrement facultative](getting-started-create-channel.md) dans *Mise en route avec Amazon IVS*.

### Éligibilité
<a name="r2s3-merge-fragmented-streams-eligibility"></a>

Pour que plusieurs flux puissent enregistrer vers le même préfixe S3, certaines conditions doivent être remplies pour tous les flux : 
+ La largeur et la hauteur de la vidéo doivent être identiques.
+ La fréquence d’images doit être identique.
+ La différence de débit des flux suivants doit être inférieure ou égale à 50 % du débit du flux d’origine.
+ Les codecs vidéo et audio doivent être identiques.

**Remarques:**
+ 20 flux sont fusionnés au maximum, après quoi un nouveau préfixe S3 est créé.
+ Au bout de 48 heures, un nouveau préfixe S3 est créé. Par exemple, si la première diffusion dure 48 heures et qu’une autre diffusion est lancée dans l’intervalle `recordingReconnectWindowSeconds`, la prochaine diffusion *n’est pas* fusionnée dans le premier préfixe S3.
+ Les reconnexions rapides risquent d’entraîner le démarrage d’une nouvelle diffusion avant la fin de l’écriture de la diffusion précédente dans S3, auquel cas la nouvelle diffusion *n’est pas* fusionnée dans le préfixe S3 précédent. (En général, l’écriture dans S3 se termine dans les 10 secondes suivant la fin d’une diffusion.) Des reconnexions rapides peuvent se produire dans plusieurs scénarios, notamment : 1) des transitions rapides entre l’arrière-plan et le premier plan des applications mobiles, 2) lorsque la reprise du flux n’est pas possible lors de l’utilisation de la fonctionnalité de reconnexion automatique des kits SDK de diffusion mobile IVS, et 3) lorsque l’appel de [StopStream](https://docs.aws.amazon.com//ivs/latest/LowLatencyAPIReference/API_StopStream.html) déclenche une reconnexion automatique depuis le logiciel client de streaming.

### Problème connu
<a name="r2s3-merge-fragmented-streams-known-issue"></a>

Si `recordingReconnectWindowSeconds` est activé et que le kit SDK de diffusion web est utilisé, l’enregistrement vers le même préfixe S3 risque de ne pas fonctionner, car le kit SDK de diffusion web modifie dynamiquement les débits et les qualités.

## Fichiers de métadonnées JSON
<a name="r2s3-json-metadata"></a>

Lorsqu’un événement de changement d’état d’enregistrement se produit, une métrique Amazon CloudWatch correspondante est générée et un fichier de métadonnées est écrit dans le préfixe S3. (Consultez la section [Surveillance du streaming à faible latence Amazon IVS](stream-health.md).)

Ces métadonnées sont au format JSON. Elles contiennent les informations suivantes :


| Champ | Type | Obligatoire | Description | 
| --- | --- | --- | --- | 
| `channel_arn` | chaîne | Oui | ARN du canal diffusant le flux en direct. | 
| `media` | objet | Oui | Objet contenant les objets énumérés du contenu multimédia disponibles pour cet enregistrement. Valeurs valides : `"hls"`, `"thumbnails"`. | 
| [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/ivs/latest/LowLatencyUserGuide/record-to-s3.html) | objet | Oui | Champ énuméré qui décrit la sortie du format Apple HLS. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/ivs/latest/LowLatencyUserGuide/record-to-s3.html)  | entier | Conditionnel | Durée du contenu HLS enregistré en millisecondes. Celle-ci n’est disponible que lorsque `recording_status` est `"RECORDING_ENDED"` ou `"RECORDING_ENDED_WITH_FAILURE"`. Si un échec s’est produit avant l’enregistrement, la valeur est 0. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/ivs/latest/LowLatencyUserGuide/record-to-s3.html)  | chaîne | Oui | Chemin relatif depuis le préfixe S3 où le contenu HLS est stocké. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/ivs/latest/LowLatencyUserGuide/record-to-s3.html)  | chaîne | Oui |  Nom du fichier de la liste de lecture principale HLS.  | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/ivs/latest/LowLatencyUserGuide/record-to-s3.html)  | chaîne | Oui | Nom de la liste de lecture multivariante par plage d’octets HLS. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/ivs/latest/LowLatencyUserGuide/record-to-s3.html)  | objet | Oui | Tableau des rendus (variante HLS) d’objets de métadonnées. Il y a toujours au moins un rendu. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/ivs/latest/LowLatencyUserGuide/record-to-s3.html)  | chaîne | Oui | Chemin relatif depuis le préfixe S3 où le contenu HLS est stocké pour ce rendu. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/ivs/latest/LowLatencyUserGuide/record-to-s3.html)  | chaîne | Oui | Nom du fichier de la liste de lecture des médias pour ce rendu. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/ivs/latest/LowLatencyUserGuide/record-to-s3.html)  | chaîne | Oui | Nom de la liste de lecture par plage d’octets pour ce rendu. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/ivs/latest/LowLatencyUserGuide/record-to-s3.html)  | ent | Conditionnel | Hauteur de résolution en pixels de la vidéo encodée. Cette option n’est disponible que lorsque le rendu contient une piste vidéo. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/ivs/latest/LowLatencyUserGuide/record-to-s3.html)  | ent | Conditionnel | Largeur de résolution en pixels de la vidéo encodée. Cette option n’est disponible que lorsque le rendu contient une piste vidéo. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/ivs/latest/LowLatencyUserGuide/record-to-s3.html)  | objet | Conditionnel | Champ énuméré qui décrit la sortie des miniatures. Ce champ n’est disponible que lorsque `recordingMode` de la configuration de la miniature est `INTERVAL`. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/ivs/latest/LowLatencyUserGuide/record-to-s3.html)  | chaîne | Conditionnel | Chemin relatif depuis le préfixe S3 où le contenu des miniatures est stocké. Ce champ n'est disponible que lorsque `recordingMode` de la configuration de la miniature est `INTERVAL`. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/ivs/latest/LowLatencyUserGuide/record-to-s3.html)  | int | Oui | La hauteur de la miniature. Par défaut : résolution du rendu source. Cette valeur est affectée par la saisie par l’utilisateur dans la configuration d’enregistrement associée ; plus précisément, la valeur `thumbnailConfiguration.resolution `. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/ivs/latest/LowLatencyUserGuide/record-to-s3.html)  | int | Oui | La largeur de la miniature. Par défaut : résolution du rendu source. Cette valeur est affectée par la saisie par l’utilisateur dans la configuration d’enregistrement associée ; plus précisément, la valeur `thumbnailConfiguration.resolution`. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/ivs/latest/LowLatencyUserGuide/record-to-s3.html)  | objet | Oui | Champ de type énumératif décrivant le dernier affichage de la miniature. Ce champ n’est disponible que lorsque le `storage` de la configuration des miniatures comprend `LATEST`. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/ivs/latest/LowLatencyUserGuide/record-to-s3.html)  | int | Oui | La hauteur de la miniature. La résolution par défaut sera la résolution du rendu source. Cette valeur est affectée par la saisie par l’utilisateur dans la configuration d’enregistrement associée ; plus précisément, la valeur `thumbnailConfiguration.resolution`. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/ivs/latest/LowLatencyUserGuide/record-to-s3.html)  | int | Oui | La largeur de la miniature. La résolution par défaut sera la résolution du rendu source. Cette valeur est affectée par la saisie par l’utilisateur dans la configuration d’enregistrement associée ; plus précisément, la valeur `thumbnailConfiguration.resolution`. | 
| `recording_ended_at` | chaîne | Conditionnel | Horodatage RFC 3339 UTC à la fin de l’enregistrement. Disponible uniquement lorsque `recording_status` est `"RECORDING_ENDED"` ou `"RECORDING_ENDED_WITH_FAILURE"`. `recording_started_at` et `recording_ended_at` sont des horodatages lorsque ces événements sont générés et peuvent ne pas correspondre exactement aux horodatages du segment vidéo HLS. Pour déterminer avec précision la durée d’un enregistrement, utilisez le champ `duration_ms`.  | 
| `recording_started_at` | chaîne | Oui | Horodatage RFC 3339 UTC lorsque l’enregistrement a démarré. Veuillez lire la note ci-dessus relative à `recording_ended_at`.  | 
| `recording_status` | chaîne | Oui | Statut de l’enregistrement. Valeurs valides: `"RECORDING_STARTED"`, `"RECORDING_ENDED"`, `"RECORDING_ENDED_WITH_FAILURE"`. | 
| `recording_status_message` | chaîne | Conditionnel | Informations descriptives sur le statut. Disponible uniquement lorsque `recording_status` est `"RECORDING_ENDED"` ou `"RECORDING_ENDED_WITH_FAILURE"`. | 
| `version` | chaîne | Oui | Version du schéma des métadonnées. | 

### Exemple : recording\$1started.json
<a name="r2s3-json-metadata-recording-started"></a>

```
{
   "version": "v1",
   "channel_arn": "arn:aws:ivs:us-west-2:123456789012:channel/AsXego4U6tnj",
   "recording_started_at": "2020-06-12T12:53:26Z",
   "recording_status : "RECORDING_STARTED",
   "media": {
      "hls": {
         "path": "media/hls",
         "playlist": "master.m3u8",
         "byte_range_playlist": "byte-range-multivariant.m3u8",
         "renditions": [
            {
               "path": "480p30",
               "playlist": "playlist.m3u8",
               "byte_range_playlist": "byte-range-variant.m3u8",
               "resolution_height": 480,
               "resolution_width": 852
            },
            {
               "path": "360p30",
               "playlist": "playlist.m3u8",
               "byte_range_playlist": "byte-range-variant.m3u8",
               "resolution_height": 360,
               "resolution_width": 640
            },
            {
               "path": "160p30",
               "playlist": "playlist.m3u8",
               "byte_range_playlist": "byte-range-variant.m3u8",
               "resolution_height": 160,
               "resolution_width": 284
            },
            {
               "path": "720p60",
               "playlist": "playlist.m3u8",
               "byte_range_playlist": "byte-range-variant.m3u8",
               "resolution_height": 720,
               "resolution_width": 1280
            }
         ]
      },
      "thumbnails": {
         "path": "media/thumbnails",
         "resolution_height": 480,
         "resolution_width": 852
      },
      "latest_thumbnail": {
         "path": "media/latest_thumbnail/thumb.jpg",
         "resolution_height": 480,
         "resolution_width": 852
      }
   }
}
```

### Exemple : recording\$1ended.json
<a name="r2s3-json-metadata-recording-ended"></a>

```
{
   "version": "v1",
   "channel_arn": "arn:aws:ivs:us-west-2:123456789012:channel/AsXego4U6tnj",
   "recording_ended_at": "2020-06-14T12:53:20Z",
   "recording_started_at": "2020-06-12T12:53:26Z",
   "recording_status": "RECORDING_ENDED",
   "media": {
      "hls": {
         "duration_ms": 172794489,
         "path": "media/hls",
         "playlist": "master.m3u8",
         "byte_range_playlist": "byte-range-multivariant.m3u8",
         "renditions": [
            {
               "path": "480p30",
               "playlist": "playlist.m3u8",
               "byte_range_playlist": "byte-range-variant.m3u8",
               "resolution_height": 480,
               "resolution_width": 852
            },
            {
               "path": "360p30",
               "playlist": "playlist.m3u8",
               "byte_range_playlist": "byte-range-variant.m3u8",
               "resolution_height": 360,
               "resolution_width": 640
            },
            {
               "path": "160p30",
               "playlist": "playlist.m3u8",
               "byte_range_playlist": "byte-range-variant.m3u8",
               "resolution_height": 160,
               "resolution_width": 284
            },
            {
               "path": "720p60",
               "playlist": "playlist.m3u8",
               "byte_range_playlist": "byte-range-variant.m3u8",
               "resolution_height": 720,
               "resolution_width": 1280
            }
         ]
      },
      "thumbnails": {
         "path": "media/thumbnails",
         "resolution_height": 480,
         "resolution_width": 852
      },
      "latest_thumbnail": {
         "path": "media/latest_thumbnail/thumb.jpg",
         "resolution_height": 480,
         "resolution_width": 852
      }
   }
}
```

### Exemple : recording\$1failed.json
<a name="r2s3-json-metadata-recording-failed"></a>

```
{
   "version": "v1",
   "channel_arn": "arn:aws:ivs:us-west-2:123456789012:channel/AsXego4U6tnj",
   "recording_ended_at": "2020-06-14T12:53:20Z",
   "recording_started_at": "2020-06-12T12:53:26Z",
   "recording_status": "RECORDING_ENDED_WITH_FAILURE",
   "recording_status_message": "InternalServerException",
   "media": {
      "hls": {
         "duration_ms": 172794489,
         "path": "media/hls",
         "playlist": "master.m3u8",
         "renditions": [
            {
               "path": "480p30",
               "playlist": "playlist.m3u8",
               "resolution_height": 480,
               "resolution_width": 852
            },
            {
               "path": "720p60",
               "playlist": "playlist.m3u8",
               "resolution_height": 720,
               "resolution_width": 1280
            }
         ]
      },
      "thumbnails": {
         "path": "media/thumbnails",
         "resolution_height": 480,
         "resolution_width": 852
      },
      "latest_thumbnail": {
         "path": "media/latest_thumbnail/thumb.jpg",
         "resolution_height": 480,
         "resolution_width": 852
      }
   }
}
```

## Découverte des rendus d’un enregistrement
<a name="r2s3-recording-renditions"></a>

Lorsque vous diffusez du contenu sur un canal Amazon IVS, auto-record-to-s3 utilise la vidéo source pour générer plusieurs rendus. Lors de l’utilisation du [streaming à débit adaptatif](player.md), le lecteur Amazon IVS change automatiquement les rendus (débits binaires) selon les besoins afin d’optimiser la lecture en fonction des conditions réseau variables.

Chaque rendu généré pendant le streaming en direct est enregistré dans un chemin unique dans le préfixe d’enregistrement S3. Les détails de résolution, le chemin d’accès et les noms de fichiers de liste de lecture sont stockés dans un [fichier de métadonnées JSON](#r2s3-json-metadata) au début et à l’arrêt de l’enregistrement. Si la valeur `renditionSelection` de la configuration d’enregistrement est `ALL`, tous les rendus sont sélectionnés pour l’enregistrement. Si `renditionSelection` est `CUSTOM`, l’utilisateur doit sélectionner une ou plusieurs des options suivantes : `LOWEST_RESOLUTION`, `SD`, `HD` et FULL\$1HD. Vous trouverez ci-dessous les résolutions pour chaque option :

160 <= `LOWEST_RESOLUTION` <= 360

360 <= `SD` <= 480

480 <= `HD` <= 720

720 <= `FULL_HD` <= 1080

**Important :** *ne formulez pas* d’hypothèses sur le chemin de rendu statique ou la liste des rendus générés, car ceux-ci sont sujets à modification. *Ne partez pas* du principe qu’un rendu spécifique sera toujours disponible pour un enregistrement Amazon IVS. Pour déterminer les rendus, les résolutions et les chemins d’accès disponibles, reportez-vous aux fichiers de métadonnées.

Les fichiers `event/recording_started.json` ou `event/recording_ended.json` dans le préfixe d’enregistrement contiennent les chemins d’accès et les noms des fichiers multimédias dans le préfixe d’enregistrement. Tous les éléments `path` sont relatifs au chemin d’accès précédent dans la hiérarchie. Les éléments sous `media > hls` décrivent les ressources HLS, avec le nom de la liste de lecture principale et le chemin d’accès définis à ce niveau.

Voici un extrait de code Python qui montre comment générer un chemin de liste de lecture principale à l’aide du préfixe d’enregistrement S3 et du fichier de métadonnées :

```
def get_master_playlist(metadata_json, s3_recording_prefix):
   return s3_recording_prefix + '/' + metadata_json['media']['hls']['path'] + '/' + metadata_json['media']['hls']['playlist']
```

Les éléments sous `media > hls > renditions` décrivent la liste des rendus enregistrés. Les propriétés `resolution_height` et `resolution_width` peuvent être utilisées pour identifier la résolution vidéo. Les éléments`path` et `playlist` peuvent être utilisés pour modifier le chemin de la liste de la liste de lecture du rendu. Utilisez ces champs pour déterminer le rendu à utiliser pour tout post-traitement.

Pour découvrir la liste de lecture de rendu la plus élevée disponible pour un enregistrement, vous pouvez vous abonner aux événements EventBridge « IVS Recording State Change ». (Voir .) [Utilisation d’Amazon EventBridge avec IVS](eventbridge.md).) Voici un exemple de script Python qui illustre l’utilisation d’une fonction Lambda abonnée à ces événements.

```
import json
import boto3
s3 = boto3.resource('s3')

def get_highest_rendition_playlist(bucket_name, prefix_name):
   object_path = "{}/events/recording-started.json".format(prefix_name)
   object = s3.Object(bucket_name, object_path)
   body = str(object.get()['Body'].read().decode('utf-8'))
   metadata = json.loads(body)
   media_path = metadata["media"]["hls"]["path"]
   renditions = metadata["media"]["hls"]["renditions"]

   highest_rendition = None
   highest_rendition_size = 0

   for rendition in renditions:
       current_rendition_size = rendition["resolution_height"]
       if (current_rendition_size > highest_rendition_size):
           highest_rendition_size = current_rendition_size
           highest_rendition = rendition

   highest_rendition_playlist = media_path + '/' + highest_rendition['path'] + '/' + highest_rendition['playlist']
   return highest_rendition_playlist


def lambda_handler(event, context):
   prefix_name = event["detail"]["recording_s3_key_prefix"]
   bucket_name = event["detail"]["recording_s3_bucket_name"]
   rendition_playlist = get_highest_rendition_playlist(bucket_name, prefix_name)
   print("Highest rendition playlist: {}/{}".format(prefix_name, rendition_playlist))

   return {
       'statusCode': 200,
       'body': rendition_playlist
   }
```

## Lecture de contenu enregistré à partir de compartiments privés
<a name="r2s3-private-bucket-playback"></a>

Les objets enregistrés avec la fonctionnalité Enregistrement automatique vers Amazon S3 sont privés par défaut ; par conséquent, ces objets sont inaccessibles pour la lecture à l’aide de l’URL S3 directe. Si vous essayez d’ouvrir le manifeste principal HLS (fichier m3u8) pour la lecture à l’aide du lecteur Amazon IVS ou d’un autre lecteur, vous obtiendrez une erreur (par exemple, « Vous n’avez pas l’autorisation d’accéder à la ressource demandée »). Au lieu de cela, vous pouvez lire ces fichiers avec le CDN (réseau de diffusion de contenu) Amazon CloudFront.

### Distribution Amazon CloudFront
<a name="r2s3-cdn-oai"></a>

Les distributions CloudFront peuvent être configurées pour diffuser du contenu à partir de compartiments privés. Généralement, il est préférable d’utiliser cette configuration plutôt que d’avoir des compartiments ouvertement accessibles où les lectures contournent les contrôles proposés par CloudFront. Votre distribution peut être configurée pour diffuser à partir d’un compartiment privé en créant un contrôle d’accès d’origine (OAC), qui est un utilisateur CloudFront spécial qui dispose d’autorisations de lecture sur le compartiment d’origine privé. Vous pouvez créer l’OAC après avoir créé votre distribution, via la console ou l’API CloudFront. Consultez la section [Création d’un nouveau contrôle d’accès d’origine](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html#create-oac-overview-s3).

### Lecture depuis Amazon CloudFront
<a name="r2s3-cdn-playback"></a>

Une fois que vous avez configuré votre distribution à l’aide d’un OAC pour accéder à votre compartiment privé, vos fichiers vidéo doivent être disponibles pour consommation via l’URL CloudFront. Votre URL CloudFront est le **Nom de domaine de distribution** sur l’onglet **Détails** dans la console AWS CloudFront. Elle doit ressembler à ceci :

a1b23cdef4ghij.cloudfront.net.

Pour diffuser votre vidéo enregistrée via votre distribution, recherchez la clé d’objet de votre fichier `master.m3u8`. Elle doit ressembler à ceci :

```
ivs/v1/012345678912/a0bCDeFGH1IjK/2021/4/20/12/03/aBcdEFghIjkL/media/hls/master.m3u8
```

Ajoutez la clé d’objet à la fin de votre URL CloudFront. Votre URL finale ressemblera à ce qui suit :

```
https://a1b23cdef4ghij.cloudfront.net/ivs/v1/012345678912/a0bCDeFGH1IjK/2021/4/20/12/03/aBcdEFghIjkL/media/hls/master.m3u8
```

Pour lire depuis un navigateur Web, assurez-vous de configurer CORS à la fois dans CloudFront et dans le compartiment S3. Pour la configuration de CloudFront, suivez les instructions figurant dans la section [Création de stratégies de demandes d’origine](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/controlling-origin-requests.html#origin-request-create-origin-request-policy) pour joindre une stratégie de demande d’**Origine CORS-S3** et une stratégie d’en-tête de réponse **SimpleCORS** à la distribution CloudFront. Consultez la page d’exemple de console de configuration ci-dessous :

![\[Exemple de page de console de configuration. Nous vous recommandons d’utiliser une stratégie de cache et une stratégie de demande d’origine pour contrôler la clé de cache et les demandes d’origine.\]](http://docs.aws.amazon.com/fr_fr/ivs/latest/LowLatencyUserGuide/images/CORS_Configuration.png)


Pour la configuration S3 CORS, consultez la section [Configuration CORS](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ManageCorsUsing.html) pour créer des règles appropriées pour votre compartiment S3.

Vous pouvez maintenant lire votre vidéo enregistrée comme si vous la jouiez directement à partir d’un compartiment.

Pour plus d’informations, consultez la section [Restriction de l’accès à l’origine Amazon S3](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html).