Reproducción de transmisión en vivo bajo demanda con Amazon IVS (serie de 3 partes) |
---|
1 Grabación automática de transmisiones en vivo de Amazon IVS en S3 |
2 Cómo archivar mensajes de chat web con Amazon IVS Chat Logging |
3 Reproducción de transmisión en vivo de Amazon IVS con reproducción de chat |
En nuestra última publicación , analizamos cómo grabar automáticamente transmisiones en vivo de Amazon Interactive Video Service (Amazon IVS) en un depósito de Amazon Simple Storage Service (Amazon S3). Esa característica es una herramienta poderosa para las plataformas de contenido generado por el usuario (UGC), ya que es el primer paso para proporcionar visualización bajo demanda de transmisiones en vivo anteriores en una aplicación. Pero una reproducción de una transmisión en vivo está incompleta sin el contexto completo de los chats interactivos que ocurren junto con la transmisión. En esta publicación, daremos el siguiente paso para brindar una experiencia bajo demanda completa aprendiendo cómo registrar mensajes de chat de Amazon IVS.
Al igual que la grabación automática en Amazon S3 requería una configuración de grabación, el registro de chat también requiere una configuración que defina los detalles necesarios para una sala de chat. Tenga en cuenta que es posible que también necesite permisos de IAM adicionales según su elección de destinos de registro.
Para crear una configuración de registro con Amazon IVS Console, haga clic en Configuraciones de registro en la barra lateral izquierda.
En la página de lista de configuraciones de registro , haga clic en Crear configuración de registro .
El registro de chat de Amazon IVS ofrece varios destinos para el almacenamiento de los mensajes de chat registrados. Podemos elegir entre Amazon CloudWatch, Amazon Kinesis Data Firehose o Amazon S3 como destino de almacenamiento para sus registros de chat. Personalmente, creo que CloudWatch es el destino más conveniente, ya que puedo recuperar fácilmente los mensajes de chat a través del SDK de CloudWatch, así que usemos eso para esta demostración. Consulte la documentación si desea utilizar Amazon Kinesis Data Firehose o Amazon S3 como destino en su aplicación.
Nota : puede haber un ligero retraso entre el momento en que se publica un mensaje de chat y el momento en que aparece en su destino de registro. Para Amazon S3, el retraso puede ser de hasta 5 minutos y para Amazon CloudWatch y Amazon Kinesis Data Firehose puede ser de hasta 10 segundos.
Para crear la configuración para esta demostración, ingrese un nombre de configuración de registro (n.º 1), seleccione CloudWatch como destino (n.º 2), seleccione Crear un nuevo grupo de registro de CloudWatch (n.º 3) e ingrese un nombre de grupo de registro (n.º 4) .
Ingrese las etiquetas opcionales y luego haga clic en Crear configuración de registro .
Al igual que con las configuraciones de registro, podemos aprovechar el SDK de AWS para crear nuestras configuraciones de registro. Dado que estamos iniciando sesión en CloudWatch en esta publicación, necesitaremos usar el SDK de CloudWatch Logs para crear un grupo de registro .
import { CloudWatchLogsClient, CreateLogGroupCommand } from "@aws-sdk/client-cloudwatch-logs"; const cloudWatchLogsClient = new CloudWatchLogsClient(); const createLogGroupInput = { logGroupName: 'ivs-demo-chat-logging-group', }; const createLogGroupRequest = new CreateLogGroupCommand(createLogGroupInput); const createLogGroupResponse = await cloudWatchLogsClient.send(createLogGroupRequest); console.log(createLogGroupResponse);
Ahora podemos usar el cliente de chat de Amazon IVS para crear una configuración de registro ( docs ).
import { IvschatClient, CreateLoggingConfigurationCommand } from "@aws-sdk/client-ivschat"; const ivsChatClient = new IvschatClient(); const createLoggingConfigInput = { name: 'ivs-demo-chat-logging-config-sdk', destinationConfiguration: { cloudWatchLogs: { logGroupName: 'ivs-demo-chat-logging-group' } } }; const createLoggingConfigRequest = new CreateLoggingConfigurationCommand(createLoggingConfigInput); const createLoggingConfigResponse = await ivsChatClient.send(createLoggingConfigRequest); console.log(createLoggingConfigResponse);
Esto producirá una salida similar a la siguiente:
{ "$metadata": { "httpStatusCode": 200, "requestId": "[redacted]", "cfId": "[redacted]", "attempts": 1, "totalRetryDelay": 0 }, "arn": "arn:aws:ivschat:us-east-1:[redacted]:logging-configuration/[redacted]", "createTime": "2023-01-09T14:48:35.358Z", "destinationConfiguration": { "cloudWatchLogs": { "logGroupName": "ivs-demo-chat-logging-group" } }, "id": "[redacted]", "name": "ivs-demo-chat-logging-config-sdk", "state": "ACTIVE", "tags": {}, "updateTime": "2023-01-09T14:48:35.485Z" }
Opcionalmente, también podemos crear una configuración de registro a través de la CLI de AWS. Nuevamente, tendremos que crear el grupo de registro de CloudWatch y luego pasar el nombre del nuevo grupo de registro a la configuración de registro de chat.
$ aws logs \ create-log-group \ --log-group-name ivs-demo-logging-config-log-group $ aws ivschat \ create-logging-configuration \ --name ivs-demo-logging-config \ --destination-configuration cloudWatchLogs={logGroupName=ivs-demo-logging-config-log-group}
Ahora podemos asociar la configuración de registro con una sala de chat de Amazon IVS existente. Seleccione Salas en Chat en la barra lateral izquierda, elija la sala con la que desea asociar la configuración y luego haga clic en Editar .
En la página de edición de la sala, desplácese hacia abajo y seleccione Registrar automáticamente mensajes y eventos (#1). En el menú desplegable Configuraciones de registro (#2), busque y asocie la configuración que creamos anteriormente. Tenga en cuenta que puede asociar varias configuraciones con una sala, por lo que si también desea iniciar sesión en Amazon Kinesis Data Firehose o Amazon S3, puede crear configuraciones separadas y asociarlas con su sala. También tenga en cuenta que puede crear una nueva configuración directamente desde la página de edición de la sala haciendo clic en el botón Crear configuración de registro (#3).
Asociación de una configuración de registro con una sala de chat de Amazon IVS existente mediante el SDK de AWS
En producción, probablemente usará el SDK para asociar su configuración de registro con una sala de chat nueva o existente. Para hacerlo, use CreateRoomCommand
( docs ) o UpdateRoomCommand
( docs ). Este es un ejemplo de cómo actualizar una sala de chat existente con una configuración de registro de chat. Como era de esperar, tendremos que pasar el ARN como el identifier
de la sala de chat y todos los ARN de configuración de registro de chat en una matriz a loggingConfigurationIdentifiers
.
import { IvschatClient, UpdateRoomCommand } from "@aws-sdk/client-ivschat"; const ivsChatClient = new IvschatClient(); const updateChatRoomInput = { identifier: 'arn:aws:ivschat:us-east-1:[redacted]:room/[redacted]', loggingConfigurationIdentifiers: [ 'arn:aws:ivschat:us-east-1:v:logging-configuration/[redacted]', ] }; const updateChatRoomRequest = new UpdateRoomCommand(updateChatRoomInput); const updateChatRoomResponse = await ivsChatClient.send(updateChatRoomRequest); console.log(updateChatRoomResponse);
Nota: Puede especificar múltiples configuraciones de registro para una sala de chat. Esto le permite usar múltiples destinos, si lo desea. La matriz de identificadores de registro de chat que pasa a través del SDK a
UpdateRoomCommand
sobrescribirá cualquier identificador existente, por lo que si está agregando una configuración adicional, asegúrese de incluir los ARN de configuración existentes para evitar eliminarlos.
En este punto, todos los mensajes nuevos publicados en una sala de chat de Amazon IVS se registrarán en los destinos especificados por las configuraciones de registro adjuntas. Como se mencionó anteriormente, en el caso de CloudWatch como destino de registro, podemos usar el SDK de CloudWatch para recuperar nuestros registros de chat durante un período de tiempo determinado. Para hacer esto, necesitamos logGroupName , la marca de tiempo de inicio y finalización (en formato de marca de tiempo Unix) y logStreamNames . logStreamName tendrá el formato: aws/IVSChatLogs/1.0/room_[suffix of chat room ARN]
. Entonces, para una sala de chat con un ARN de arn:aws:ivschat:us-east-1:[redacted]:room/0wgOPVl4ZRdu
, logStreamName será aws/IVSChatLogs/1.0/room_0wgOPVl4ZRdu
.
Aquí se explica cómo usar CloudWatchLogsClient
para construir un FilterLogEventsCommand
( docs ) que se usa para recuperar registros de chat.
import { CloudWatchLogsClient, FilterLogEventsCommand } from "@aws-sdk/client-cloudwatch-logs"; const cloudwatchClient = new CloudWatchLogsClient(); const filterLogEventsInput = { logGroupName: 'demo-chat-log-cw-group', logStreamNames: ['aws/IVSChatLogs/1.0/room_0wgOPVl4ZRdu'], startTime: 1672929210000, endTime: 1672929330000, }; const filterLogEventsRequest = new FilterLogEventsCommand(filterLogEventsInput); const filterLogEventsResponse = await cloudwatchClient.send(filterLogEventsRequest); const events = filterLogEventsResponse.events.map(e => JSON.parse(e.message));
¿Cómo sé qué hora de inicio y finalización debo usar? Recuerde que Amazon IVS envía eventos a EventBridge cuando transmite a un canal. Puede usar una hora de inicio y finalización de la transmisión si intenta recuperar registros de chat para una transmisión en vivo específica de Amazon IVS.
Tenga en cuenta que FilterLogEventsCommand
no puede devolver una cantidad infinita de eventos. Es posible que deba verificar FilterLogEventsCommandOutput
para ver si existe un nextToken
y manejar la paginación si su período de tiempo tiene más eventos de los que caben en una sola respuesta del SDK. Consulte los documentos SDK para obtener más información.
De forma predeterminada, esta operación devuelve tantos eventos de registro como caben en 1 MB (hasta 10 000 eventos de registro) o todos los eventos encontrados dentro del intervalo de tiempo especificado. Si los resultados incluyen un token, eso significa que hay más eventos de registro disponibles. Puede obtener resultados adicionales especificando el token en una llamada posterior. Esta operación puede devolver resultados vacíos mientras haya más eventos de registro disponibles a través del token.
En este punto podemos hacer lo que necesitemos con el registro de chat. Recuerde, el registro de chat registrará todos los eventos publicados en una sala de chat de Amazon IVS, incluidos los eventos personalizados y los eventos relacionados con la moderación del chat. Si quisiéramos reproducir un flujo de chat, probablemente necesitemos analizar un poco los eventos para limpiar los mensajes moderados y construir un flujo de mensajes "reproducible".
Más información sobre la moderación de chat : si aún no las ha leído, consulte las publicaciones de mi blog sobre la moderación de chat automática y manual con el chat de Amazon IVS.
Una función para analizar los eventos registrados podría tener un aspecto similar a este. ¡Su experiencia puede ser diferente!
const parseEvents = (events) => { let parsedEvents = []; events.forEach(e => { switch (e.type) { case 'MESSAGE': parsedEvents.push(e); break; case 'EVENT': if (e.payload.EventName === 'aws:DELETE_MESSAGE') { const existingEventIdx = parsedEvents.findIndex(parsedEvent => { return parsedEvent.payload.Id === e.payload.Attributes.MessageID }); if (existingEventIdx > -1) { parsedEvents.splice(existingEventIdx, 1); } } break; } }); return parsedEvents; };
Esta función devolverá una matriz adecuada para fines de reproducción de chat con mensajes moderados eliminados del registro de chat. Aquí hay un pequeño ejemplo de cómo podría verse el flujo de eventos.
[ { "event_timestamp": "2023-01-05T14:33:32.894Z", "type": "MESSAGE", "payload": { "Type": "MESSAGE", "Id": "WhO6MW6iRdS5", "RequestId": "", "Attributes": { "username": "gleningp" }, "Content": "bbiab!", "SendTime": "2023-01-05T14:33:32.894089757Z", "Sender": { "UserId": "75758272-f3f2-4f65-83c5-9b8f144116b8", "Attributes": {} } }, "version": "1.0" }, { "event_timestamp": "2023-01-05T14:33:39.896Z", "type": "MESSAGE", "payload": { "Type": "MESSAGE", "Id": "VwEPwPV74GN3", "RequestId": "", "Attributes": { "username": "rpeirazzia" }, "Content": "perfect", "SendTime": "2023-01-05T14:33:39.896519733Z", "Sender": { "UserId": "704D6BF8-22D2-4A52-B6A7-BDEFB115ECE5", "Attributes": {} } }, "version": "1.0" }, { "event_timestamp": "2023-01-05T14:33:47.330Z", "type": "MESSAGE", "payload": { "Type": "MESSAGE", "Id": "00kqu1sPa6dF", "RequestId": "", "Attributes": { "username": "jmycroft2" }, "Content": "🔥🔥🔥", "SendTime": "2023-01-05T14:33:47.330983449Z", "Sender": { "UserId": "2F12AA2D-DF65-42CF-AE99-133A5A06F7B4", "Attributes": {} } }, "version": "1.0" } ]
En esta publicación, aprendimos cómo registrar mensajes publicados en una sala de chat de Amazon IVS. En nuestra próxima publicación, veremos cómo reunir transmisiones en vivo grabadas automáticamente y mensajes de chat registrados en una aplicación para crear una experiencia de usuario de reproducción "a pedido" adecuada.