Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
Grabación automática en Amazon S3 (transmisión de baja latencia)
En esta sección se proporciona información sobre la función auto-record-to -S3 de la transmisión de baja latencia de Amazon IVS. Se trata el almacenamiento de datos para las transmisiones grabadas de Amazon IVS. Explicamos el contenido del almacenamiento y el esquema del archivo de metadatos. También se analiza la reproducción de su contenido grabado.
Para obtener más información sobre… | Consulte… |
---|---|
Configurar y detener la grabación de video |
Crear un canal con grabación opcional en la Introducción a Amazon IVS |
La API de |
|
Costes | Costos de Amazon IVS |
Prefijo S3
El prefijo S3 es una estructura de directorios única para cada transmisión en directo que se graba. Todos los archivos multimedia y metadatos para la transmisión en directo se escriben en este directorio. En el caso de los canales con la grabación habilitada, el prefijo S3 se genera cuando se inicia una sesión en directo y, en ese CloudWatch caso, se proporcionará al principio y al final de la grabación.
El prefijo S3 tiene el formato siguiente:
/ivs/v1/<aws_account_id>/<channel_id>/<year>/<month>/<day>/<hours>/<minutes>/<recording_id>
Donde:
-
aws_account_id
es el ID de su cuenta de AWS (generado al crear una cuenta de AWS), a partir del cual se crea el canal. -
channel_id
es la parte de ID de recurso del ARN del canal (la última parte del nombre de recurso de Amazon). Consulte ARN en el Glosario. -
<year>/<month>/<day>/<hours>/<minutes>
es una marca de tiempo UTC cuando se inicia la grabación. -
recording_id
es un ID único generado para cada sesión de grabación.
Por ejemplo:
ivs/v1/123456789012/AsXego4U6tnj/2020/6/23/20/12/j8Z9O91ndcVs
Grabación de contenidos
Cuando se inicia la grabación, los segmentos de video y los archivos de metadatos se escriben en el bucket de S3 configurado para el canal. Estos contenidos están disponibles para el procesamiento posterior o la reproducción como video bajo demanda.
Tenga en cuenta que, una vez que se inicia una transmisión en directo y se emite el EventBridge evento de inicio de grabación, los archivos de manifiesto y los segmentos de vídeo tardan un poco en escribirse. Le recomendamos que reproduzca o procese transmisiones grabadas solo después de que se envíe el evento Recording End. (Consulte Uso de Amazon EventBridge con IVS).
A continuación, se muestra una estructura de directorios de ejemplo y el contenido de una grabación de una sesión en vivo de Amazon IVS:
ivs/v1/123456789012/AsXego4U6tnj/2020/6/23/20/12/j8Z9O91ndcVs/ events recording-started.json recording-ended.json media hls thumbnails
La carpeta events
contiene los archivos de metadatos correspondientes al evento de grabación. Los archivos de metadatos JSON se generan cuando la grabación se inicia, finaliza correctamente o termina con errores:
-
events/recording-started.json
-
events/recording-ended.json
-
events/recording-failed.json
Una carpeta events
contendrá recording-started.json
y recording-ended.json
o recording-failed.json
.
Estos contienen metadatos relacionados con la sesión grabada y sus formatos de salida. Los detalles de JSON se dan a continuación.
La carpeta media
contiene todos los contenidos multimedia admitidos, en dos subcarpetas:
-
hls
contiene todos los archivos multimedia y de manifiesto generados durante la sesión en directo y se puede reproducir con el reproductor de Amazon IVS. Hay dos tipos de manifiestos de HLS en esta carpeta: el manifiesto maestro estándarmaster.m3u8
y el manifiesto activado por rango de bytesbyte-range-multivariant.m3u8
. Por lo tanto, cada carpeta de copia tiene ambos archivos:playlist.m3u8
ybyte-range-variant.m3u8
. (Consulte las listas de reproducción por rango de bytes a continuación). -
thumbnails
contiene miniaturas generadas durante la sesión en vivo. Las miniaturas se generan y se escriben en el bucket cada minuto. (Para cambiar este comportamiento, anule la propiedadthumbnailConfiguration
en una configuración de grabación.)
Importante: Los contenidos dentro de la carpeta media
se generan de forma dinámica y se determinan por las características de los primeros segmentos de video recibidos; el contenido de la carpeta puede no representar las características definitivas (por ejemplo, la calidad de la copia). No haga ninguna suposición sobre la ruta estática. Para descubrir las representaciones HLS disponibles y su ruta, utilice los archivos de metadatos JSON descritos en la siguiente sección.
Listas de reproducción por rango de bytes
La función auto-record-to -S3 admite la generación de listas de reproducción por rango de bytes
Miniaturas
La propiedad thumbnailConfiguration
en una configuración de grabación le permite habilitar o desactivar la grabación de miniaturas de una sesión en directo y modificar el intervalo en el que se generan las miniaturas para la sesión en directo. Los intervalos de miniaturas pueden oscilar entre 1 y 60 segundos; de forma predeterminada, la grabación de miniaturas está habilitada con un intervalo de 60 segundos. Para información detallada, consulte la Referencia de la API de Amazon IVS.
La configuración de miniaturas también puede incluir el campo storage
(SEQUENTIAL
o LATEST
) y una resolución (LOWEST_RESOLUTION
, SD
, HD
o FULL_HD
). A continuación, se muestran las resoluciones de cada opción:
160 <= LOWEST_RESOLUTION
<= 360
360 < SD
<= 480
480 < HD
<= 720
720 < FULL_HD
<= 1080
Fusionar transmisiones fragmentadas
La propiedad recordingReconnectWindowSeconds
de una configuración de grabación le permite especificar un período de tiempo (en segundos) durante el cual, si la transmisión se interrumpe y se inicia una nueva transmisión, Amazon IVS intenta grabar con el mismo prefijo S3 que la transmisión anterior. En otras palabras, si una transmisión se desconecta y, a continuación, se vuelve a conectar dentro del intervalo especificado, las múltiples transmisiones se consideran una sola transmisión y se combinan.
Eventos de cambio de estado de grabación de IVS en Amazon EventBridge: los eventos de Recording End y los archivos de metadatos JSON finalizados en grabación se retrasan al menos, recordingReconnectWindowSeconds
ya que Amazon IVS espera a que no se inicie una nueva transmisión.
Para obtener instrucciones acerca de cómo configurar la función fusionar transmisiones, consulte Paso 4: crear un canal con grabación opcional en Introducción a Amazon IVS.
Elegibilidad
Para que varias transmisiones se graben con el mismo prefijo S3, se deben cumplir ciertas condiciones para todas las transmisiones:
-
La duración debe ser la misma que la del vídeo.
-
La velocidad de fotogramas debe ser la misma.
-
La diferencia de velocidad de bits de las transmisiones posteriores debe ser inferior o igual al 50 % de la velocidad de bits de la transmisión original.
-
Los códecs de vídeo y audio deben ser los mismos.
Notas:
-
Se fusionan como máximo 20 transmisiones, después de las cuales se crea un nuevo prefijo S3.
-
Transcurridas 48 horas, se crea un nuevo prefijo S3. Por ejemplo, si la primera transmisión dura 48 horas y se inicia otra dentro del intervalo
recordingReconnectWindowSeconds
, la próxima no se fusiona en el primer prefijo S3. Cada transmisión debe comenzar 10 segundos o más después de la transmisión anterior.
Problema conocido
Si recordingReconnectWindowSeconds
está habilitado y se utiliza el SDK de transmisión web, es posible que la grabación en el mismo prefijo S3 no funcione, ya que el SDK de transmisión web cambia dinámicamente las velocidades de bits y las calidades.
Archivos de metadatos JSON
Cuando se produce un evento de cambio de estado de grabación, se genera la CloudWatch métrica de Amazon correspondiente y se escribe un archivo de metadatos con el prefijo S3. (Consulte Monitoreo de transmisión de baja latencia de Amazon IVS).
Estos metadatos están en formato JSON. Contiene la siguiente información.
Campo | Tipo | Obligatorio | Descripción |
---|---|---|---|
|
string | Sí | ARN del canal que emite la transmisión en directo. |
|
objeto | Sí | Objeto que contiene los objetos enumerados de contenido multimedia disponibles para esta grabación. Valores válidos: |
|
objeto | Sí | Campo enumerado que describe la salida del formato HLS de Apple. |
|
integer | Condicional | Duración del contenido HLS grabado en milisegundos. Esto solo está disponible cuando |
|
string | Sí | Ruta relativa del prefijo S3 donde se almacena el contenido HLS. |
|
string | Sí |
Nombre del archivo de lista de reproducción maestra HLS. |
|
cadena | Sí | Nombre de la lista de reproducción multivariante de rango de bytes de HLS. |
|
objeto | Sí | Matriz de copias (variante HLS) de objetos de metadatos. Siempre hay al menos una copia. |
|
string | Sí | Ruta relativa del prefijo S3 donde se almacena el contenido HLS para esta copia. |
|
string | Sí | Nombre del archivo de lista de reproducción multimedia para esta copia. |
|
cadena | Sí | Nombre de la lista de reproducción por rango de bytes para esta representación. |
|
int | Condicional | Altura de resolución de píxeles del video codificado. Solo está disponible cuando la copia contiene una pista de video. |
|
int | Condicional | Ancho de resolución de píxeles del video codificado. Solo está disponible cuando la copia contiene una pista de video. |
|
objeto | Condicional | Campo enumerado que describe la salida de miniaturas. Solo está disponible cuando la configuración de miniaturas para |
|
cadena | Condicional | Ruta relativa del prefijo S3 donde se almacena el contenido de miniaturas. Solo está disponible cuando la configuración de miniaturas para |
|
int | Sí | La altura de la miniatura. Predeterminado: resolución de la copia de origen. Este valor se ve afectado por la entrada del usuario en la configuración de grabación relacionada; específicamente, el valor |
|
int | Sí | El ancho de la miniatura. Predeterminado: resolución de la copia de origen. Este valor se ve afectado por la entrada del usuario en la configuración de grabación relacionada; específicamente, el valor |
|
objeto | Sí | Campo enumerado que describe la última salida de miniaturas. Solo está disponible cuando la configuración de miniaturas para |
|
int | Sí | La altura de la miniatura. El valor predeterminado será la resolución de la variante de representación de origen. Este valor se ve afectado por la entrada del usuario en la configuración de grabación relacionada; específicamente, el valor |
|
int | Sí | El ancho de la miniatura. El valor predeterminado será la resolución de la variante de representación de origen. Este valor se ve afectado por la entrada del usuario en la configuración de grabación relacionada; específicamente, el valor |
|
cadena | Condicional | Marca de tiempo UTC RFC 3339 cuando finalizó la grabación. Esto solo está disponible cuando
|
|
cadena | Sí | Marca de hora UTC RFC 3339 cuando se inició la grabación. Consulte la nota que figura arriba para |
|
cadena | Sí | El estado de la grabación. Valores válidos: |
|
cadena | Condicional | Información descriptiva sobre el estado. Esto solo está disponible cuando |
|
cadena | Sí | La versión del esquema de metadatos. |
Ejemplo: recording_started.json
{ "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 } } }
Ejemplo: recording_ended.json
{ "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 } } }
Ejemplo: recording_failed.json
{ "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 } } }
Descubrimiento de las copias de una grabación
Al transmitir contenido a un canal Amazon IVS, auto-record-to-s 3 utiliza el vídeo de origen para generar varias variantes de representación. Uso de transmisión de velocidad de bits adaptable (ABR), el reproductor de Amazon IVS cambia automáticamente las copias (velocidades de bits) según sea necesario para optimizar la reproducción en diferentes condiciones de red.
Cada copia generada durante la transmisión en directo se graba en una ruta única dentro del prefijo de grabación S3. El detalle de resolución, la ruta y los nombres de archivo de lista de reproducción se almacenan en un archivo de metadatos JSON durante el inicio y la finalización de la grabación. Si el valor renditionSelection
de la configuración de grabación es ALL
, se seleccionan todas las copias para grabarlas. Si renditionSelection
es CUSTOM
, el usuario debe seleccionar una o más de las siguientes opciones: LOWEST_RESOLUTION
, SD
, HD
y FULL_HD. A continuación, se muestran las resoluciones de cada opción:
160 <= LOWEST_RESOLUTION
<= 360
360 < SD
<= 480
480 < HD
<= 720
720 < FULL_HD
<= 1080
Importante: No haga suposiciones sobre la ruta de copia estática o la lista de copias generadas, ya que están sujetas a cambios. No suponga que siempre habrá disponible una copia específica para una grabación de Amazon IVS. Para determinar las copias, resoluciones y rutas disponibles, consulte los archivos de metadatos.
El archivo event/recording_started.json
o event/recording_ended.json
dentro del prefijo de grabación contiene las rutas y los nombres de los archivos multimedia dentro del prefijo de grabación. Todos los elementos path
son relativos a la ruta anterior en la jerarquía. Los elementos en media
> hls
describen los activos HLS, con el nombre y la ruta de la lista de reproducción maestra definidos en este nivel.
Aquí hay un fragmento de código de Python que muestra cómo generar una ruta de lista de reproducción maestra mediante el prefijo de grabación S3 y el archivo de metadatos:
def get_master_playlist(metadata_json, s3_recording_prefix): return s3_recording_prefix + '/' + metadata_json['media']['hls']['path'] + '/' + metadata_json['media']['hls']['playlist']
Los elementos en media > hls > renditions
describen la lista de copias grabadas. Las propiedades resolution_height
y resolution_width
se pueden utilizar para identificar la resolución de video. Los elementos path
y playlist
se pueden utilizar para derivar la ruta de la lista de reproducción de la copia. Utilice estos campos para determinar qué copia se va a utilizar para cualquier procesamiento posterior.
Para descubrir la lista de reproducción con mayor número de versiones disponible para una grabación, puede suscribirse a los eventos «IVS Recording State Change». EventBridge (Consulte Uso de Amazon EventBridge con IVS). A continuación, se muestra un script de Python de ejemplo que ilustra el uso de una función de Lambda suscrita a esos eventos.
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 }
Reproducción de contenido grabado desde buckets privados
Los objetos grabados con la característica de grabación automática en Amazon S3 son privados de forma predeterminada; por lo tanto, no se puede acceder a ellos para reproducirlos mediante la dirección URL directa de S3. Si intenta abrir el manifiesto maestro HLS (archivo m3u8) para su reproducción mediante el reproductor de Amazon IVS u otro reproductor, recibirá un error (por ejemplo, “You do not have permission to access the requested resource” [No tiene permiso para acceder al recurso solicitado]). En su lugar, puede reproducir estos archivos con Amazon CloudFront CDN (Content Delivery Network).
CloudFront Distribución en Amazon
CloudFront las distribuciones se pueden configurar para ofrecer contenido de depósitos privados. Por lo general, esto es preferible a tener depósitos de acceso abierto en los que las lecturas eviten los controles ofrecidos por ellos. CloudFront Puedes configurar tu distribución para que dé servicio desde un bucket privado creando un control de acceso de origen (OAC), que es un CloudFront usuario especial que tiene permisos de lectura en el bucket de origen privado. Puedes crear el OAC después de crear la distribución, a través de la CloudFront consola o la API. Consulte Creación de un nuevo control de acceso de origen.
Reproducción desde Amazon CloudFront
Una vez que hayas configurado tu distribución mediante un OAC para acceder a tu depósito privado, tus archivos de vídeo deberían estar disponibles para su consumo a través de la CloudFront URL. Su CloudFront URL es el nombre del dominio de distribución que aparece en la pestaña Detalles de la CloudFront consola de AWS. Debe tener un aspecto similar al siguiente:
a1b23cdef4ghij.cloudfront.net.
Para transmitir el video grabado a través de su distribución, busque la clave de objeto para su archivo master.m3u8
. Debe tener un aspecto similar al siguiente:
ivs/v1/012345678912/a0bCDeFGH1IjK/2021/4/20/12/03/aBcdEFghIjkL/media/hls/master.m3u8
Añada la clave de objeto al final de la CloudFront URL. Su URL final tendrá un aspecto similar al siguiente:
https://a1b23cdef4ghij.cloudfront.net/ivs/v1/012345678912/a0bCDeFGH1IjK/2021/4/20/12/03/aBcdEFghIjkL/media/hls/master.m3u8
Para reproducir desde un navegador web, asegúrese de configurar CORS tanto CloudFront en un bucket de S3. Para la CloudFront configuración, siga las instrucciones de Creación de políticas de solicitudes de origen para adjuntar una política de solicitudes de origen de CORS-S3 y una política de encabezados de respuesta de SimpleCORS a la distribución. CloudFront Consulte la página de ejemplo de la consola de configuración que aparece a continuación:
Para la configuración de CORS de S3, consulte Configuración de CORS para crear las reglas adecuadas para su bucket de S3.
Ahora puede reproducir el video grabado como si hiciera la reproducción directamente desde un bucket.
Para obtener más información, consulte Restricción del acceso a un origen de Amazon S3.