Reprodução de transmissão ao vivo sob demanda com Amazon IVS (série de 3 partes) |
---|
2 Como arquivar mensagens de bate-papo da Web com registro de bate-papo do Amazon IVS |
3 Reprodução de transmissão ao vivo do Amazon IVS com reprodução de bate-papo |
Em nosso último post , vimos como gravar automaticamente streams ao vivo do Amazon Interactive Video Service (Amazon IVS) em um bucket do Amazon Simple Storage Service (Amazon S3). Esse recurso é uma ferramenta poderosa para plataformas de conteúdo gerado pelo usuário (UGC), pois é a primeira etapa no fornecimento de visualização sob demanda de transmissões ao vivo anteriores em um aplicativo. Mas a repetição de uma transmissão ao vivo é incompleta sem o contexto completo dos bate-papos interativos que ocorrem ao longo da transmissão. Nesta postagem, daremos o próximo passo para fornecer uma experiência sob demanda completa aprendendo como registrar mensagens de bate-papo do Amazon IVS.
Da mesma forma que a gravação automática no Amazon S3 exigia uma configuração de gravação, o registro de bate-papo também requer uma configuração que define os detalhes necessários para uma sala de bate-papo. Lembre-se de que você também pode precisar de permissões IAM adicionais, dependendo de sua escolha de destinos de registro.
Para criar uma configuração de log com o Amazon IVS Console, clique em Logging Configurations na barra lateral esquerda.
Na página da lista Configurações de log , clique em Criar configuração de log .
O registro de bate-papo do Amazon IVS oferece vários destinos para armazenamento das mensagens de bate-papo registradas. Podemos escolher entre Amazon CloudWatch, Amazon Kinesis Data Firehose ou Amazon S3 como destino de armazenamento para seus logs de bate-papo. Pessoalmente, considero o CloudWatch o destino mais conveniente, pois posso recuperar facilmente as mensagens de bate-papo por meio do SDK do CloudWatch. Portanto, vamos usá-lo para esta demonstração. Consulte a documentação se desejar utilizar um Amazon Kinesis Data Firehose ou Amazon S3 como destino em seu aplicativo.
Observação : pode haver um pequeno atraso entre o momento em que uma mensagem de bate-papo é postada e o momento em que ela aparece no seu destino de registro. Para Amazon S3, o atraso pode ser de até 5 minutos, e para Amazon CloudWatch e Amazon Kinesis Data Firehose pode ser de até 10 segundos.
Para criar a configuração para esta demonstração, insira um nome de configuração de log (nº 1), selecione CloudWatch como o destino (nº 2), selecione Criar um novo grupo de logs do CloudWatch (nº 3) e insira um nome de grupo de logs (nº 4) .
Insira quaisquer Tags opcionais e clique em Create logging configuration .
Assim como nas configurações de gravação, podemos aproveitar o AWS SDK para criar nossas configurações de log. Como estamos registrando no CloudWatch nesta postagem, precisaremos usar o CloudWatch Logs SDK para criar um log group .
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);
Agora podemos usar o cliente de bate-papo do Amazon IVS para criar uma configuração de log ( 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);
Isso produzirá uma saída semelhante à seguinte:
{ "$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" }
Também podemos, opcionalmente, criar uma configuração de registro por meio da AWS CLI. Novamente, teremos que criar o grupo de logs do CloudWatch e, em seguida, passar o nome do novo grupo de logs para a configuração de registro de bate-papo.
$ 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}
Agora podemos associar a configuração de log a uma sala de bate-papo existente do Amazon IVS. Selecione Salas em Bate-papo na barra lateral esquerda, escolha a sala à qual deseja associar a configuração e clique em Editar .
Na página de edição da sala, role para baixo e selecione Registrar mensagens e eventos automaticamente (#1). No menu suspenso Configurações de log (nº 2), procure e associe a configuração que criamos acima. Observe que você pode associar várias configurações a uma sala, portanto, se também quiser fazer logon em um Amazon Kinesis Data Firehose ou Amazon S3, você pode criar configurações separadas e associá-las à sua sala. Observe também que você pode criar uma nova configuração diretamente da página de edição da sala clicando no botão Criar configuração de registro (#3).
Associar uma configuração de log a uma sala de bate-papo existente do Amazon IVS por meio do SDK da AWS
Na produção, você provavelmente usará o SDK para associar sua configuração de log a uma sala de bate-papo nova ou existente. Para fazer isso, use CreateRoomCommand
( docs ) ou UpdateRoomCommand
( docs ). Aqui está um exemplo de atualização de uma sala de bate-papo existente com uma configuração de registro de bate-papo. Como esperado, precisaremos passar o ARN como o identifier
da sala de bate-papo e qualquer/todos os ARNs de configuração de registro de bate-papo em uma matriz para 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);
Observação: você pode especificar várias configurações de registro para uma sala de bate-papo. Isso permite que você use vários destinos, se desejar. A matriz de identificadores de registro de bate-papo que você passa por meio do SDK para
UpdateRoomCommand
substituirá todos os identificadores existentes, portanto, se você estiver adicionando uma configuração adicional, certifique-se de incluir todos os ARNs de configuração existentes para evitar removê-los.
Neste ponto, todas as novas mensagens postadas em uma sala de bate-papo do Amazon IVS serão registradas no(s) destino(s) especificado(s) pela(s) configuração(ões) de log anexada(s). Conforme mencionado acima, no caso do CloudWatch como um destino de log, podemos usar o CloudWatch SDK para recuperar nossos logs de bate-papo para um determinado período de tempo. Para fazer isso, precisamos do logGroupName , o carimbo de data/hora inicial e final (no formato de carimbo de data/hora Unix) e o logStreamNames . O logStreamName estará no formato: aws/IVSChatLogs/1.0/room_[suffix of chat room ARN]
. Portanto, para uma sala de bate-papo com um ARN de arn:aws:ivschat:us-east-1:[redacted]:room/0wgOPVl4ZRdu
, o logStreamName será aws/IVSChatLogs/1.0/room_0wgOPVl4ZRdu
.
Veja como usar o CloudWatchLogsClient
para construir um FilterLogEventsCommand
( docs ) que é usado para recuperar logs 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));
Como sei qual horário de início e término devo usar? Lembre-se de que o Amazon IVS envia eventos para EventBridge ao transmitir para um canal. Você pode usar um horário de início e término do fluxo se estiver tentando recuperar logs de bate-papo para um fluxo ao vivo específico do Amazon IVS.
Lembre-se de que o FilterLogEventsCommand
não pode retornar um número infinito de eventos. Você pode ter que verificar o FilterLogEventsCommandOutput
para a existência de um nextToken
e lidar com a paginação se seu período de tempo tiver mais eventos do que cabem em uma única resposta do SDK. Consulte os documentos do SDK para obter mais informações.
Por padrão, essa operação retorna tantos eventos de log quanto cabem em 1 MB (até 10.000 eventos de log) ou todos os eventos encontrados dentro do intervalo de tempo especificado. Se os resultados incluírem um token, isso significa que há mais eventos de log disponíveis. Você pode obter resultados adicionais especificando o token em uma chamada subsequente. Esta operação pode retornar resultados vazios enquanto houver mais eventos de log disponíveis por meio do token.
Neste ponto, podemos fazer o que precisarmos com o registro do bate-papo. Lembre-se de que o registro de bate-papo registrará todos os eventos publicados em uma sala de bate-papo do Amazon IVS, incluindo eventos personalizados e eventos relacionados à moderação de bate-papo. Se quisermos reproduzir um fluxo de bate-papo, provavelmente precisaremos analisar um pouco os eventos para limpar as mensagens moderadas e construir um fluxo de mensagens "reproduzível".
Mais sobre moderação de bate-papo : Se você ainda não os leu, confira minhas postagens de blog sobre moderação de bate-papo manual e automatizada com o bate-papo do Amazon IVS.
Uma função para analisar os eventos registrados pode ser semelhante a esta. Sua milhagem pode variar!
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 função retornará uma matriz que é adequada para fins de reprodução de bate-papo com mensagens moderadas removidas do registro de bate-papo. Aqui está um pequeno exemplo de como o fluxo de eventos pode parecer.
[ { "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" } ]
Nesta postagem, aprendemos como registrar mensagens postadas em uma sala de bate-papo do Amazon IVS. Em nossa próxima postagem, veremos como reunir transmissões ao vivo gravadas automaticamente e mensagens de bate-papo registradas em um aplicativo para criar uma experiência de usuário de replay "sob demanda" adequada.