在我的上一篇文章中,我们研究了通过 Amazon CloudWatch SDK监控 Amazon Interactive Video Service (Amazon IVS) 实时流健康指标。健康监控是一个非常重要的主题,它对于保持直播应用程序的性能至关重要。另一个关键因素是观众分析。在这篇文章中,我们将探讨几种深入了解流媒体观众的方法。
这篇文章的大部分内容与我上一篇文章相似。这是因为查看器数据也存储在 CloudWatch 中,并且可以通过 SDK 检索。正如我们将在下面看到的,还有一种额外的方法可以计算直播流的当前观看者数量,这是一种获取可显示在前端的计数的简便方法。
注意:虽然这篇文章侧重于直播频道的观众,但您也可以检索有关您的 Amazon IVS 聊天室的指标,例如
ConcurrentChatConnections
和消息Delivered
。我们不会在这篇文章中介绍,但您可以查看文档以了解更多信息。
如果您只是想浏览一下查看器数据而不检索原始数据,则可以通过 CloudWatch 控制台查看您的ConcurrentViews
。首先,选择All metrics ,然后选择IVS 。
然后选中包含任何 Amazon IVS 通道的ConcurrentViews
的行中的复选框。
另一种查找流会话的并发视图的方法是通过 Amazon IVS 控制台。选择您的频道,然后从频道详细信息页面选择流 ID 。
流会话的详细信息将包含多个图表,其中一个包含会话的并发视图。
要将此数据集成到您自己的应用程序中,您可以通过 CloudWatch SDK 检索数据。与运行状况指标类似,您需要通道的ARN
、 StartTime
和EndTime
来检索ConcurrentViews
。
不是随机选择开始和结束时间,而是通过从实时流会话中选择开始和结束时间来动态获取这些时间可能是有意义的。您可以通过 Amazon IVS SDK 检索流会话列表(正如我们在上一篇文章中看到的那样)。
提醒:您始终需要一个
EndTime
,即使对于当前直播的流也是如此。对于直播,在使用 SDK 检索指标时,您始终可以使用当前时间作为EndTime
。
要通过适用于 JavaScript 的 AWS 开发工具包 (v3) 检索此数据,您需要安装@aws-sdk/client-cloudwatch
程序包并创建客户端实例 ( new CloudWatchClient()
)。创建客户端实例后,为所需的输入设置一些变量。
const startTime = new Date('2023-02-10T14:00:00.000Z'); const endTime = new Date('2023-02-10T14:30:00.000Z'); const arn = process.env.DEMO_CHANNEL_ARN;
接下来,创建一个输入对象。输入对象将包含StartTime
、 EndTime
和MetricDataQueries
数组。 queries 数组将包含一个对象,该对象指定MetricName
( ConcurrentViews
)、 Namespace
( AWS/IVS
) 和筛选依据的Dimensions
(在本例中为通道名称)。
const getMetricDataInput = { StartTime: startTime, EndTime: endTime, MetricDataQueries: [{ Id: "concurrentviews", MetricStat: { Metric: { MetricName: "ConcurrentViews", Namespace: "AWS/IVS", Dimensions: [{ Name: "Channel", Value: arn.split("/")[1] }] }, Period: 5, Stat: "Average", } }], MaxDatapoints: 100 };
现在发送请求并记录结果。
const getMetricDataRequest = new GetMetricDataCommand(getMetricDataInput); let metrics = await cloudWatchClient.send(getMetricDataRequest); console.log(metrics);
这会产生如下所示的输出(为简洁起见,删除了无关的 SDK 元数据):
{ "MetricDataResults": [ { "Id": "concurrentviews", "Label": "ConcurrentViews", "Timestamps": [ "2023-02-10T14:29:00.000Z", "2023-02-10T14:28:00.000Z", "2023-02-10T14:27:00.000Z", "2023-02-10T14:26:00.000Z", "2023-02-10T14:22:00.000Z" ], "Values": [ 3, 3, 3, 3, 10 ], "StatusCode": "PartialData" } ] }
您可以过滤、排序和输出此数据以生成对生成图表有用的格式。
const viewMetrics = metrics .MetricDataResults .find((metric) => metric.Id === 'concurrentviews'); const viewValues = viewMetrics.Values.reverse(); const viewData = []; viewMetrics .Timestamps .reverse() .forEach((t, i) => { viewData.push({ timestamp: t, concurrentviews: viewValues[i], }) }); console.log(JSON.stringify(viewData));
这会产生一个对象数组。
[ { "timestamp": "2023-02-10T14:22:00.000Z", "concurrentviews": "10.00" }, { "timestamp": "2023-02-10T14:26:00.000Z", "concurrentviews": "3.00" }, ... ]
您可以将此数据与我们最喜欢的图表库(或像我一样的通用在线图表生成器)一起使用。
在上一篇文章中,我们研究了直接通过 CloudWatch SDK 生成图像。此方法也适用于您的视图指标。
const startTime = new Date('2023-02-10T14:00:00.000Z'); const endTime = new Date('2023-02-10T14:25:00.000Z'); const arn = process.env.DEMO_CHANNEL_ARN; const cloudWatchClient = new CloudWatchClient(); const getMetricWidgetImageInput = { MetricWidget: JSON.stringify({ metrics: [ [ "AWS/IVS", "ConcurrentViews", "Channel", arn.split("/")[1] ] ], start: startTime, end: endTime, period: 5, stat: "Average" }) }; const getMetricWidgetImageRequest = new GetMetricWidgetImageCommand(getMetricWidgetImageInput); const metricImage = await cloudWatchClient.send(getMetricWidgetImageRequest);
它返回一个具有键MetricWidgetImage
对象,该对象包含一个包含图表图像的数组缓冲区 ( Uint8Array
)。
{ "MetricWidgetImage": { "0": 137, "1": 80, "2": 78, ... } }
要将此数组缓冲区转换为 base64 字符串:
const buffer = Buffer.from(metricImage.MetricWidgetImage); console.log(buffer.toString('base64'));
这给了我们:
iVBORw0KGgoAAAANSUhEUgAAAlgAAAGQCAIAAAD9V4nPAAAACXBIWXMA...
可以将其转换为如下所示的图像:
如上所述,您可以通过 AWS SDK 中的 Amazon IVS 客户端模块轻松获取频道上活动直播流的当前观看会话数。为此,请使用GetStream
方法。
import { GetStreamCommand, IvsClient } from "@aws-sdk/client-ivs"; const client = new IvsClient(); const getStreamCommandInput = { channelArn: process.env.DEMO_CHANNEL_ARN, }; const getStreamRequest = new GetStreamCommand(getStreamCommandInput); const getStreamResponse = await client.send(getStreamRequest); console.log(getStreamResponse);
产生如下输出。
{ "stream": { "channelArn": "arn:aws:ivs:us-east-1:[redacted]:channel/[redacted]", "health": "HEALTHY", "playbackUrl": "https://[redacted].us-east-1.playback.live-video.net/api/video/v1/us-east-1.[redacted].channel.x4aGUUxIp5Vw.m3u8", "startTime": "2023-02-10T15:46:36.000Z", "state": "LIVE", "streamId": "st-[redacted]", "viewerCount": 5 } }
请注意属性viewerCount
,它是当前直播流的观看会话的实时计数。
在本文中,我们了解了如何通过 CloudWatch 和 Amazon IVS SDK 检索 Amazon IVS 实时流的视图数据。要了解更多信息,请查看文档。
王冠