

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 通过 Amazon Kinesis Video Streams 和 AWS Fargate 构建视频处理管道
<a name="build-a-video-processing-pipeline-by-using-amazon-kinesis-video-streams-and-aws-fargate"></a>

*Piotr Chotkowski 和 Pushparaju Thangavel，Amazon Web Services*

## Summary
<a name="build-a-video-processing-pipeline-by-using-amazon-kinesis-video-streams-and-aws-fargate-summary"></a>

此模式演示了如何使用[Amazon Kinesis Video Streams](https://aws.amazon.com/kinesis/video-streams/) 和 [AWS Fargate](https://aws.amazon.com/fargate) 从视频流中提取帧并将其存储为图像文件，以便 [Amazon Simple Storage Service (Amazon S3](https://aws.amazon.com/s3/)) 进行进一步处理。 

该模式以 Java Maven 项目的形式提供了示例应用程序。此应用程序使用 [AWS Cloud Development Kit](https://aws.amazon.com/cdk/) (AWS CDK) 定义 AWS 基础设施。帧处理逻辑和基础设施定义均采用 Java 编程语言编写。您可将此示例应用程序用作开发自己的实时视频处理管道或构建机器学习管道的视频预处理步骤的基础。 

## 先决条件和限制
<a name="build-a-video-processing-pipeline-by-using-amazon-kinesis-video-streams-and-aws-fargate-prereqs"></a>

**先决条件**
+ 一个活跃的 AWS 账户
+ Java SE Development Kit (JDK) 11，已安装
+ [Apache Maven](https://maven.apache.org/)，已安装
+ [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/latest/guide/getting_started.html)，已安装
+ [AWS 命令行界面（AWS CLI）](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html)版本 2，已安装
+ [Docker](https://docs.docker.com/get-docker/)（构建 Docker 映像以在 AWS Fargate 任务定义中使用）

**限制**

该模式旨在作为概念证明，或作为进一步开发的基础。不应在生产部署中以当前形式使用它。

**产品版本**
+ [此模式已在 AWS CDK 版本 1.77.0 中进行了测试（参见 AWS CDK 版本）](https://docs.aws.amazon.com/cdk/api/latest/versions.html)
+ JDK 11
+ AWS CLI 版本 2

## 架构
<a name="build-a-video-processing-pipeline-by-using-amazon-kinesis-video-streams-and-aws-fargate-architecture"></a>

**目标技术堆栈**
+ Amazon Kinesis Video Streams
+ AWS Fargate 任务
+ Amazon Simple Queue Service（Amazon SQS）队列
+ 亚马逊 S3 存储桶

**目标架构**

![\[使用 Kinesis Video Streams 和 Fargate 构建视频处理管道的架构。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/9d1442c2-f3ee-47fd-8cce-90d9206ce4d4/images/a60e585f-27be-4dd6-897b-c38adf1d283f.png)


用户创建 Kinesis 视频流、上传视频并将包含有关输入 Kinesis 视频流和输出 S3 存储桶的详细信息的 JSON 消息发送到 SQS 队列。AWS Fargate 在容器中运行主应用程序，从 SQS 队列中提取消息并开始提取帧。每帧都保存在图像文件中，并存储在目标 S3 存储桶中。

**自动化和扩缩**

该示例应用程序可以在单个 AWS 区域内进行水平和垂直扩展。可以通过增加从 SQS 队列读取的已部署 AWS Fargate 任务的数量来实现水平扩展。垂直缩放可以通过增加应用程序中的帧分割和图像发布线程的数量来实现。在 AWS CDK 的[QueueProcessingFargateService](https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_aws-ecs-patterns.QueueProcessingFargateService.html)资源定义中，这些设置作为环境变量传递给应用程序。由于 AWS CDK 堆栈部署的性质，您无需额外努力即可在多个 AWS 区域和账户中部署此应用程序。

## 工具
<a name="build-a-video-processing-pipeline-by-using-amazon-kinesis-video-streams-and-aws-fargate-tools"></a>

**工具**
+ [AWS CDK](https://aws.amazon.com/cdk/) 是一个软件开发框架，用于使用编程语言（例如、、Python TypeScript JavaScript、Java 和 C\$1/Net）来定义您的云基础设施和资源。
+ [Amazon Kinesis Video Streams](https://aws.amazon.com/kinesis/video-streams/) 是一项完全托管的 Amazon Web Services，您可使用该服务将实时视频从各个设备流式传输到 Amazon Web Services Cloud，或者构建应用程序以进行实时视频处理或进行面向批处理的视频分析。
+ [AWS Fargate](https://aws.amazon.com/fargate) 是适用于容器的无服务器计算引擎。Fargate 无需配置和管理服务器，让您可专注于开发应用程序。
+ [Amazon S3](https://aws.amazon.com/s3/) 是一种对象存储服务，提供可扩展性、数据可用性、安全性和性能。
+ [Amazon SQS](https://aws.amazon.com/sqs/) 是一种完全托管的消息队列服务，使您能够分离和扩展微服务、分布式系统和无服务器应用程序。

**代码**
+ 随附示例应用程序项目 (`frame-splitter-code.zip`) 的 .zip 文件。

## 操作说明
<a name="build-a-video-processing-pipeline-by-using-amazon-kinesis-video-streams-and-aws-fargate-epics"></a>

### 部署基础设施
<a name="deploy-the-infrastructure"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 启动 Docker 守护程序。 | 在本地系统上启动 Docker 进程守护程序。AWS CDK 使用 Docker 构建 AWS Fargate 任务中使用的映象。继续执行下一步操作之前，必须运行 Docker。 | 开发人员、 DevOps 工程师 | 
| 构建项目。 | 下载 `frame-splitter-code` 示例应用程序（附件）并将其内容解压缩到本地计算机上的文件夹中。在部署基础设施之前，必须要先构建 [Java Maven](https://maven.apache.org/) 项目。在命令提示符处，导航至项目的根目录，然后通过运行以下命令来生成项目： <pre>mvn clean install</pre> | 开发人员、 DevOps 工程师 | 
| 引导 AWS CDK。 | （仅限首次使用 AWS CDK 的用户）如果这是您首次使用 AWS CDK，则可能需要通过运行 AWS CLI 命令来引导环境：<pre>cdk bootstrap --profile "$AWS_PROFILE_NAME" </pre>其中 `$AWS_PROFILE_NAME` 包含您的 AWS 凭证中的 AWS 个人资料的名称。或者，您可删除此参数以使用默认配置文件。有关更多信息，请参阅 [AWS CDK 文档](https://docs.aws.amazon.com/cdk/latest/guide/bootstrapping.html)。 | 开发人员、 DevOps 工程师 | 
| 部署 AWS CDK 堆栈。 | 在此步骤中，您将在 AWS 账户中创建所需基础设施资源（SQS 队列、S3 存储桶、AWS Fargate 任务定义），构建 AWS Fargate 任务所需 Docker 映像，然后部署应用程序。在命令提示符处，导航至项目的根目录，然后运行以下命令：<pre>cdk deploy --profile "$AWS_PROFILE_NAME" --all </pre>其中 `$AWS_PROFILE_NAME` 包含您的 AWS 凭证中的 AWS 个人资料的名称。或者，您可删除此参数以使用默认配置文件。确认部署。注意 CDK 部署输出中的**QueueUrl**和**存储桶**值；您将在以后的步骤中使用这些值。AWS CDK 创建资产，将其上传至您的 AWS 账户，然后创建所有基础设施资源。您可以在 [AWS CloudFormation 控制台](https://console.aws.amazon.com/cloudformation/)中观察资源创建过程。有关更多信息，请参阅 [AWS CloudFormation 文档](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)和 [AWS CDK 文档](https://docs.aws.amazon.com/cdk/latest/guide/hello_world.html#hello_world_tutorial_deploy)。 | 开发人员、 DevOps 工程师 | 
| 创建视频流 | 在此步骤中，您将创建 Kinesis 视频流，该视频流将用作视频处理的输入流。确保您已经安装并配置 AWS CLI。在 AWS CLI 中运行：<pre>aws kinesisvideo --profile "$AWS_PROFILE_NAME" create-stream --stream-name "$STREAM_NAME" --data-retention-in-hours "24" </pre>其中，`$AWS_PROFILE_NAME` 包含您的 AWS 凭证中的 AWS 配置文件名称（或删除此参数以使用默认配置文件），`$STREAM_NAME` 是任何有效的直播名称。 或者，您可按照 [Kinesis Video Streams](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/gs-createstream.html#gs-createstream-console) 文档中的步骤使用 Kinesis 控制台创建视频流。记下创建的流的 AWS Resource Name (ARN)；稍后您会需要它。 | 开发人员、 DevOps 工程师 | 

### 运行示例
<a name="run-an-example"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 将视频上传至流数据。 | 在示例 `frame-splitter-code` 应用程序的项目文件夹中，打开 `src/test/java/amazon/awscdk/examples/splitter` 文件夹中的 `ProcessingTaskTest.java` 文件。将 `profileName`** **和 `streamName`** **变量替换为您在前面的步骤中使用的值。若要将示例视频上传到您在上一步中创建的 Kinesis 视频流，请运行： <pre>amazon.awscdk.examples.splitter.ProcessingTaskTest#testExample test</pre>或者，您可使用 [Kinesis Video Streams](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/producer-sdk.html) 文档中描述的方法之一上传视频。 | 开发人员、 DevOps 工程师 | 
| 启动视频处理。 | 现在，您已将视频上传到 Kinesis 视频流，您可开始处理该视频了。要启动处理逻辑，您须向 AWS CDK 在部署期间创建的 SQS 队列发送一条包含详细信息的消息。要使用 AWS CLI 发送消息，请运行：<pre>aws sqs --profile "$AWS_PROFILE_NAME" send-message --queue-url QUEUE_URL --message-body MESSAGE </pre>其中`$AWS_PROFILE_NAME`包含您的 AWS 凭证中的 AWS 配置文件名称（删除此参数以使用默认配置文件），`QUEUE_URL`是 AWS CDK 输出中的**QueueUrl**值，`MESSAGE`是以下格式的 JSON 字符串： <pre>{ "streamARN": "STREAM_ARN", "bucket": "BUCKET_NAME", "s3Directory": "test-output" }</pre>其中，`STREAM_ARN` 是您在前面步骤中创建的视频流的 ARN，`BUCKET_NAME` 也是 AWS CDK 输出中的**存储桶**值。 发送此消息将启动视频处理。或者，您也可以使用 Amazon SQS 控制台发送消息，如 [Amazon SQS 文档](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-using-send-messages.html)中所述。 | 开发人员、 DevOps 工程师 | 
| 查看视频帧图像。 | 您可在 S3 输出存储桶 `s3://BUCKET_NAME/test-output` 中看到生成的图像，其中 `BUCKET_NAME` 是 AWS CDK 输出中的**存储桶**值。 | 开发人员、 DevOps 工程师 | 

## 相关资源
<a name="build-a-video-processing-pipeline-by-using-amazon-kinesis-video-streams-and-aws-fargate-resources"></a>
+ [AWS CDK 文档](https://docs.aws.amazon.com/cdk/latest/guide/home.html)
+ [AWS CDK API 参考](https://docs.aws.amazon.com/cdk/api/latest/docs/aws-construct-library.html)
+ [AWS CDK 入门研讨会](https://cdkworkshop.com/)
+ [Amazon Kinesis Video Streams 文档](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/what-is-kinesis-video.html)
+ [示例：使用识别视频流中的对象 SageMaker](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/examples-sagemaker.html)
+ [示例：解析和渲染 Kinesis 视频流片段](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/examples-renderer.html)
+ [使用 Amazon Kinesis Video Streams 和亚马逊实时大规模分析直播视频（AWS Machin SageMaker](https://aws.amazon.com/blogs/machine-learning/analyze-live-video-at-scale-in-real-time-using-amazon-kinesis-video-streams-and-amazon-sagemaker/) e Learning 博客文章）
+ [AWS Fargate 入门](https://aws.amazon.com/fargate/getting-started/)

## 附加信息
<a name="build-a-video-processing-pipeline-by-using-amazon-kinesis-video-streams-and-aws-fargate-additional"></a>

**选择 IDE**

我们建议您使用自己喜欢的 Java IDE 构建和探索此项目。 

**清理**

运行完此示例后，请移除所有已部署的资源，以免产生额外的 AWS 基础设施成本。 

要删除基础设施和视频流，请在 AWS CLI 中使用以下两个命令：

```
cdk destroy --profile "$AWS_PROFILE_NAME" --all
```

```
aws kinesisvideo --profile "$AWS_PROFILE_NAME" delete-stream --stream-arn "$STREAM_ARN"
```

或者，您可以手动删除资源，方法是使用 AWS CloudFormation 控制台移除 AWS CloudFormation 堆栈，使用 Kinesis 控制台移除 Kinesis 视频流。请注意，`cdk destroy` 不会移除输出 S3 存储桶或 Amazon Elastic Container Registry (Amazon ECR) 存储库 (`aws-cdk/assets`) 中的图像。您必须手动将其移除。

## 附件
<a name="attachments-9d1442c2-f3ee-47fd-8cce-90d9206ce4d4"></a>

要访问与此文档相关联的其他内容，请解压以下文件：[attachment.zip](samples/p-attach/9d1442c2-f3ee-47fd-8cce-90d9206ce4d4/attachments/attachment.zip)