# 前言
近两年,由于疫情等的因素影响,音视频技术相当火热。很多云厂商都推出了自己音视频相关的很多服务,亚马逊云也不例外,除了 Chime 以外,还有一款产品 Kinesis Video Streams(KVS)。据亚马逊云科技 AIoT 产品专家表示,[Amazon Kinesis Video Streams](https://aws.amazon.com/cn/kinesis/video-streams/?trk=cndc-detail)(KVS)是 Amazon IoT 产品家族中的王牌产品之一,其主要功能之一,是获取、封装和存储视频流用于播放、分析和[机器学习](https://aws.amazon.com/cn/machine-learning/?trk=cndc-detail);其二,则是1秒以内的超低延时实时音视频服务。
# 正文
本文将通过一个案例来介绍一下亚马逊云的 Kinesis Video Streams(KVS)产品,具体内容是基于亚马逊云的 KVS 使用一款老旧的安卓手机实现一个视频监控系统。
## 一、Amazon KVS 简介
在正式开始前,我们首先介绍一下 KVS。Amazon KVS 是一项完全托管的亚马逊云科技服务,KVS 支持捕获来自数百万种源的海量实时视频数据传输到 Amazon云,比如智能手机、安全摄像头、网络摄像头、车载摄像头、无人机等。Amazon KVS 有如下几个优势:
(1)可以为海量设备提供实时视频传输服务;
(2)通过与 [Amazon Rekognition](https://aws.amazon.com/cn/rekognition/?trk=cndc-detail) 等托管服务集成可以非常方便的构建智能视觉应用;
(3)使用 KVS HTTP 实时流 (HLS) 可以轻松地将 KVS 中的实时和录制媒体流式传输到浏览器或者移动应用程序;
(4)KVS 支持使用 IAM 控制对流的访问,并且提供对静态与动态数据的安全保护;
(5)KVS 使用 S3 作为底层数据存储,借助 KVS能够根据设备和服务生成的时间戳,快速搜索和检索视频片段。
## 二、帐号注册
体验 KVS,需要先注册一个亚马逊云的账户,填写用户名、密码、个人、公司等信息后,完成注册,具体操作如下:
https://dev.amazoncloud.cn/user/register?trk=cndc-detail
![image.png](https://dev-media.amazoncloud.cn/098f13dda8554fc8b4f7a52249a74b70_image.png "image.png")
注册完成后并更新必要的信息,比如帐号,操作完成后如下图所示:
![image.png](https://dev-media.amazoncloud.cn/61dbdad2228e43999b77db36dd6b42be_image.png "image.png")
## 三、创建媒体流
进入 Amazon 的 KVS 管理控制台,打开控制面板,点击“创建视频流”按钮,如下图所示:
![image.png](https://dev-media.amazoncloud.cn/6bbdbb1b5fbf441dbfc374c720524473_image.png "image.png")
进入新的创建视频流页面,如下图所示,输入视频流名称等信息。
![image.png](https://dev-media.amazoncloud.cn/b57a5304fd2c4c2ead97d4e5c2870c99_image.png "image.png")
## 四、下载开发工具包
媒体流创建好之后,就可以下载对应平台的开发工具包了。
![image.png](https://dev-media.amazoncloud.cn/c7c5c505eed54edcb2a32dbaa502d2b6_image.png "image.png")
因为终端设备是一款老旧的安卓手机,所以下载 Android 开发包。在生成工具包之前,需要先配置 cognito user pool和identify pool 信息,这样下载的工具包就可以直接使用了。
## 五、生成监控终端 APP
1. 下载工程代码
执行如下命令同步仓库代码:
`\$ git clone https://github.com/awslabs/aws-sdk-android-samples`
然后,修改配置文件 AmazonKinesisVideoDemoApp/src/main/res/raw/awsconfiguration.json ,参考内容如下:
```js
{
"Version": "1.0",
"CredentialsProvider": {
"CognitoIdentity": {
"Default": {
"PoolId": "us-west-2:01234567-89ab-cdef-0123-456789abcdef",
"Region": "us-west-2"
}
}
},
"IdentityManager": {
"Default": {}
},
"CognitoUserPool": {
"Default": {
"AppClientSecret": "abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmno",
"AppClientId": "0123456789abcdefghijklmnop",
"PoolId": "us-west-2_qRsTuVwXy",
"Region": "us-west-2"
}
}
}
```
2. 关键代码
接下来,我们简单介绍几段关键代码,首先我们需要创建一个 KVS 实例,它是所有音视频服务能力的提供者。这一点和其他所有 PaaS 服务提供商的方案是一致的,都是必不可少的一步,示例代码如下:
```js
mKinesisVideoClient = KinesisVideoAndroidClientFactory.createKinesisVideoClient(
getActivity(),
KinesisVideoDemoApp.KINESIS_VIDEO_REGION,
KinesisVideoDemoApp.getCredentialsProvider());
```
然后,创建一个 MediaSource 实例,代码如下:
```js
private AndroidCameraMediaSourceConfiguration getCurrentConfiguration() {
return new AndroidCameraMediaSourceConfiguration(
AndroidCameraMediaSourceConfiguration.builder()
.withCameraId(mCamerasDropdown.getSelectedItem().getCameraId())
.withEncodingMimeType(mMimeTypeDropdown.getSelectedItem().getMimeType())
.withHorizontalResolution(mResolutionDropdown.getSelectedItem().getWidth())
.withVerticalResolution(mResolutionDropdown.getSelectedItem().getHeight())
.withCameraFacing(mCamerasDropdown.getSelectedItem().getCameraFacing())
.withIsEncoderHardwareAccelerated(
mCamerasDropdown.getSelectedItem().isEndcoderHardwareAccelerated())
.withFrameRate(FRAMERATE_20)
.withRetentionPeriodInHours(RETENTION_PERIOD_48_HOURS)
.withEncodingBitRate(BITRATE_384_KBPS)
.withCameraOrientation(-mCamerasDropdown.getSelectedItem().getCameraOrientation())
.withNalAdaptationFlags(StreamInfo.NalAdaptationFlags.NAL_ADAPTATION_ANNEXB_CPD_AND_FRAME_NALS)
.withIsAbsoluteTimecode(false));
}
......
mCameraMediaSource = (AndroidCameraMediaSource) mKinesisVideoClient
.createMediaSource(mStreamName, mConfiguration);
```
最后,开始采集并发送数据,这一步需要用到上一步的MediaSource实例,本质上就是启动一个线程完成视频采集和媒体数据的发送任务,示例代码如下:
`mCameraMediaSource.start();`
3. 安装 App
使用 Android Studio 编译打包,并安装到安卓手机上。
## 六、效果展示
开发 Amazon KVS 控制后台,在媒体流中打开视频预览窗口,最开始会自动搜索视频流,如下图所示:
![image.png](https://dev-media.amazoncloud.cn/fd6eac3a414846e098c1379f6fa7f4f2_image.png "image.png")
等视频内容加载出来之后如下图所示:
![image.png](https://dev-media.amazoncloud.cn/771c523bdad0495c9b9b918bd1b169c3_image.png "image.png")
至此,亚马逊云的 KVS 产品就算体验完了,整体上感觉还是非常简单的,只是账号注册和工程配置比较繁琐一些。其实,个人建议可以提供若干个公共的试用账号来让大家完成 demo 体验,否则,前边的流程太复杂容易劝退新用户。
*审核人:snxzheng*