

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

# 使用安卓制作人库
<a name="producer-sdk-android"></a>

您可以使用亚马逊 Kinesis Video Streams 提供的安卓制作器库来编写应用程序代码，只需最少的配置，即可将媒体数据从安卓设备发送到 Kinesis 视频流。

执行以下步骤将您的代码与 Kinesis Video Streams 集成，以便您的应用程序可以开始将数据流式传输到您的 Kinesis 视频流：

1. 创建 `KinesisVideoClient` 对象的实例。

1. 通过提供媒体源信息创建 `MediaSource` 对象。例如，当创建摄像头媒体源时，您需要提供相应信息，例如，识别摄像头并指定摄像头所用编码方面的信息。

   如果要开始流式处理，您必须创建自定义媒体源。

## 程序：使用安卓制作人 SDK
<a name="producer-sdk-android-using"></a>

此过程演示如何在安卓应用程序中使用 Kinesis Video Streams 安卓制作人客户端向你的 Kinesis 视频流发送数据。

该过程包括以下步骤：
+ [先决条件](producersdk-android-prerequisites.md)
+ [下载并配置 Android 制作器库代码](producersdk-android-downloadcode.md)
+ [检查代码](producersdk-android-writecode.md)
+ [运行并验证代码](producersdk-android-reviewcode.md)

# 先决条件
<a name="producersdk-android-prerequisites"></a>

建议使用 [Android Studio](https://developer.android.com/studio/index.html) 检查、编辑和运行应用程序代码。我们建议使用最新的稳定版本。

在示例代码中，您需要提供亚马逊 Cognito 凭证。

**Topics**
+ [设置用户池](#set-up-user-pool)
+ [设置身份池](#set-up-identity-pool)

## 设置用户池
<a name="set-up-user-pool"></a>

**设置用户池**

1. 登录 [Amazon Cognito 控制台](https://console.aws.amazon.com/cognito/home)并验证区域是否正确。

1. 在左侧导航栏中，选择 “**用户池**”。

1. 在 “**用户池**” 部分，选择 “**创建用户池**”。

1. 完成以下各节：

   1. **第 1 步：配置登录体验**-在 **Cognito 用户池登录**选项部分，选择相应的选项。

      选择**下一步**。

   1. **步骤 2：配置安全要求**-选择相应的选项。

      选择**下一步**。

   1. **第 3 步：配置注册体验**-选择相应的选项。

      选择**下一步**。

   1. **步骤 4：配置消息传送**-选择相应的选项。

      在 **IAM 角色选择**字段中，选择现有角色或创建新角色。

      选择**下一步**。

   1. **第 5 步：集成您的应用程序**-选择相应的选项。

      在 “**初始应用程序客户端**” 字段中，选择 “**机密客户端**”。

      选择**下一步**。

   1. **步骤 6：查看并创建**-查看您在前面部分中的选择，然后选择**创建用户池**。

1. 在 “**用户池**” 页面上，选择您刚刚创建的池。

   复制**用户池 ID** 并记下来以备后用。在`awsconfiguration.json`文件中，这是`CognitoUserPool.Default.PoolId`。

1. 选择 “**应用程序集成**” 选项卡，然后转到页面底部。

1. 在**应用程序客户端列表**部分，选择您刚刚创建的**应用程序客户端名称**。

   复制**客户端 ID** 并记下来以备后用。在`awsconfiguration.json`文件中，这是`CognitoUserPool.Default.AppClientId`。

1. 出示**客户机密**并记下来以备后用。在`awsconfiguration.json`文件中，这是`CognitoUserPool.Default.AppClientSecret`。

## 设置身份池
<a name="set-up-identity-pool"></a>

**设置身份池**

1. 登录 [Amazon Cognito 控制台](https://console.aws.amazon.com/cognito/home)并验证区域是否正确。

1. 在左侧导航栏中，选择 “**身份池**”。

1. 选择**创建身份池**。

1. 配置身份池。

   1. **步骤 1：配置身份池信任**-完成以下部分：
      + **用户访问权限**-选择**经过身份验证的访问权限**
      + **经过身份验证的身份源**-选择 **Amazon Cognito** 用户池

      选择**下一步**。

   1. **步骤 2：配置权限**-在 “**经过身份验证的角色**” 部分，填写以下字段：
      + **IAM 角色**-选择**创建新的 IAM 角色**
      + **IAM 角色名称**-输入名称并记下来供后续步骤使用。

      选择**下一步**。

   1. **步骤 3：Connect 身份提供商**-在 “**用户池详情**” 部分填写以下字段：
      + **用户池 ID**-选择您之前创建的用户池。
      + **应用程序客户端 ID**-选择您之前创建的应用程序客户端 ID。

      选择**下一步**。

   1. **步骤 4：配置属性**-在**身份池名称字段中键入名称**。

      选择**下一步**。

   1. **第 5 步：查看并创建**-查看您在每个部分中的选择，然后选择**创建身份池**。

1. 在**身份池**页面上，选择您的新身份池。

   复制**身份池 ID** 并记下来以备后用。在`awsconfiguration.json`文件中，这是`CredentialsProvider.CognitoIdentity.Default.PoolId`。

1. 更新 IAM 角色的权限。

   1. 登录 AWS 管理控制台 并打开 IAM 控制台，网址为[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

   1. 在左侧导航栏中，选择 “**角色**”。

   1. 找到并选择您在上面创建的角色。
**注意**  
如果需要，请使用搜索栏。

   1. 选择附加的权限策略。

      选择**编辑**。

   1. 选择 **JSON** 选项卡，然后将策略替换为以下内容：

------
#### [ JSON ]

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "cognito-identity:*",
                      "kinesisvideo:*"
                  ],
                  "Resource": [
                      "*"
                  ]
              }
          ]
      }
      ```

------

      选择**下一步**。

   1. 如果尚未选中 “将**此新版本设为默认版本”** 旁边的复选框。

      选择**保存更改**。

# 下载并配置 Android 制作器库代码
<a name="producersdk-android-downloadcode"></a>

在安卓制作人库程序的这一部分中，您将下载安卓示例代码并在 Android Studio 中打开该项目。

有关此示例的先决条件和其他详细信息，请参阅[使用 Android 制作人库](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/producer-sdk-android.html)。



1. 创建一个目录，然后 适用于 Android 的 AWS Mobile SDK 从 GitHub存储库中克隆该目录。

   ```
   git clone https://github.com/awslabs/aws-sdk-android-samples
   ```

1. 打开 [Android Studio](https://developer.android.com/studio/index.html)。

1. 在起始屏幕中，选择 **Open an existing Android Studio project**。

1. 导航到 `aws-sdk-android-samples/AmazonKinesisVideoDemoApp` 目录，选择 **OK**。

1. 打开 `AmazonKinesisVideoDemoApp/src/main/res/raw/awsconfiguration.json` 文件。

   在`CredentialsProvider`节点中，提供[先决条件](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/producer-sdk-android.html#producersdk-android-prerequisites)部分中**设置身份池**过程中的身份池 ID，并提供您的 AWS 区域 （例如**us-west-2**）。

   在`CognitoUserPool`节点中，提供[先决条件](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/producer-sdk-android.html#producersdk-android-prerequisites)部分中**设置用户池过程中的应用程序客户端密钥、应用程序客户端 ID 和池** ID，并提供您的 AWS 区域 （例如**us-west-2**）。

1. `awsconfiguration.json` 文件类似如下：

   ```
   {
     "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"
       }
     }
   }
   ```

1. `AmazonKinesisVideoDemoApp/src/main/java/com/amazonaws/kinesisvideo/demoapp/KinesisVideoDemoApp.java`使用您的地区更新（在以下示例中，将其设置为 **US\$1WEST\$1** 2）：

   ```
   public class KinesisVideoDemoApp extends Application {
       public static final String TAG = KinesisVideoDemoApp.class.getSimpleName();
       public static Regions KINESIS_VIDEO_REGION = Regions.US_WEST_2;
   ```

   有关 AWS 区域 常量的信息，请参阅[区域](https://aws-amplify.github.io/aws-sdk-android/docs/reference/com/amazonaws/regions/Regions.html)。

# 检查代码
<a name="producersdk-android-writecode"></a>

在 [Android 制作人库过程](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/producer-sdk-android.html)的这一部分中，您将研究示例代码。

Android 测试应用程序 (`AmazonKinesisVideoDemoApp`) 显示以下编码模式：
+ 创建 `KinesisVideoClient` 的实例。
+ 创建 `MediaSource` 的实例。
+ 开始流式处理。启动`MediaSource`，它就会开始向客户端发送数据。

以下各节提供了详细信息。



## 创建的实例 KinesisVideoClient
<a name="producersdk-android-review-code-create-client"></a>

您可以通过调用 `[KinesisVideoClient](https://github.com/aws-amplify/aws-sdk-android/blob/main/aws-android-sdk-kinesisvideo/src/main/java/com/amazonaws/kinesisvideo/client/KinesisVideoClient.java)` 操作来创建 `[createKinesisVideoClient](https://github.com/aws-amplify/aws-sdk-android/blob/main/aws-android-sdk-kinesisvideo/src/main/java/com/amazonaws/mobileconnectors/kinesisvideo/client/KinesisVideoAndroidClientFactory.java)` 对象。

```
mKinesisVideoClient = KinesisVideoAndroidClientFactory.createKinesisVideoClient(
                    getActivity(),
                    KinesisVideoDemoApp.KINESIS_VIDEO_REGION,
                    KinesisVideoDemoApp.getCredentialsProvider());
```

`KinesisVideoClient` 需要凭证以进行身份验证，才能进行网络调用。您传入了一个实例`AWSCredentialsProvider`，该实例会从您在上一节中修改`awsconfiguration.json`的文件中读取您的 Amazon Cognito 证书。

## 创建的实例 MediaSource
<a name="producersdk-android-review-code-create-mediasource"></a>

要向 Kinesis 视频流发送字节，必须生成数据。Amazon Kinesis Video Streams 提供了`[MediaSource](https://github.com/aws-amplify/aws-sdk-android/blob/main/aws-android-sdk-kinesisvideo/src/main/java/com/amazonaws/kinesisvideo/internal/client/mediasource/MediaSource.java)`代表数据源的接口。

例如，Kinesis Video Streams 安卓库提供了`[AndroidCameraMediaSource](https://github.com/aws-amplify/aws-sdk-android/blob/main/aws-android-sdk-kinesisvideo/src/main/java/com/amazonaws/mobileconnectors/kinesisvideo/mediasource/android/AndroidCameraMediaSource.java)`该接口的实现`MediaSource`。此类从设备的某个摄像头读取数据。

下面的代码示例 (摘自 `[fragment/StreamConfigurationFragment.java](https://github.com/awslabs/aws-sdk-android-samples/blob/main/AmazonKinesisVideoDemoApp/src/main/java/com/amazonaws/kinesisvideo/demoapp/fragment/StreamConfigurationFragment.java)` 文件) 创建媒体源配置：

```
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));
}
```

下面的代码示例 (摘自 `[fragment/StreamingFragment.java](https://github.com/awslabs/aws-sdk-android-samples/blob/main/AmazonKinesisVideoDemoApp/src/main/java/com/amazonaws/kinesisvideo/demoapp/fragment/StreamingFragment.java)` 文件) 创建媒体源：

```
mCameraMediaSource = (AndroidCameraMediaSource) mKinesisVideoClient
    .createMediaSource(mStreamName, mConfiguration);
```

## 启动媒体源
<a name="producersdk-android-review-code-start-mediasource"></a>

启动媒体源，以便开始生成数据并将数据发送到客户端。下面的代码示例摘自 `[fragment/StreamingFragment.java](https://github.com/awslabs/aws-sdk-android-samples/blob/main/AmazonKinesisVideoDemoApp/src/main/java/com/amazonaws/kinesisvideo/demoapp/fragment/StreamingFragment.java)` 文件：

```
mCameraMediaSource.start();
```



# 运行并验证代码
<a name="producersdk-android-reviewcode"></a>

要运行 Android [制作人库的 Android](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/producer-sdk-android.html) 示例应用程序，请执行以下操作。

1. 连接 Android 设备。

1. 依次选择 **Run**、**Run...**、**Edit configurations...**。

1. 选择加号图标 (**\$1**)，**安卓应用程序**。在**名称**字段中，输入 **AmazonKinesisVideoDemoApp**。在 “**模块**” 下拉列表中，选择**AmazonKinesisVideoDemoApp**。选择**确定**。

1. 选择 **Run**、**Run**。

1. 在 **Select Deployment Target** 屏幕中，选择连接的设备，然后选择 **OK**。

1. 在设备上的**AWSKinesisVideoDemoApp**应用程序中，选择**创建新帐户**。

1. 为 **USERNAME**、**Password**、**Given name**、**Email address** 和 **Phone number** 输入值，然后选择 **Sign up**。
**注意**  
这些值具有以下约束：  
**密码：**必须包含大小写字母、数字和特殊字符。您可以在 [Amazon Cognito](https://console.aws.amazon.com/cognito/home) 控制台的用户池页面中更改这些限制。
**电子邮件地址：**必须是有效地址，您才能收到确认码。
**Phone number (电话号码)：**必须采用以下格式：**\$1*<Country code>**<Number>***，例如 **\$112065551212**。

1. 输入您通过电子邮件收到的验证码，然后选择**确认**。选择**确定**。

1. 在下一页上，保留默认值，然后选择**直播**。

1. 登录 AWS 管理控制台 并打开美国西部（俄勒冈）地区的 [Kinesis Video Stream](https://console.aws.amazon.com//kinesisvideo/home/) s 控制台。

   在 **Manage Streams** 页面上，选择 **demo-stream**。

1. 流视频将在嵌入式播放器中播放。可能需要等待一小段积累帧的时间 (标准带宽和处理器条件下最多十秒)，视频才会出现。
**注意**  
如果设备的屏幕发生旋转 (例如，从纵向到横向)，则应用程序会停止流视频。

该代码示例会创建一个流。代码中的 `MediaSource` 启动后，就开始将帧从摄像头发送到 `KinesisVideoClient`。**然后，客户端将数据发送到名为 demo-stream 的 Kinesis 视频流。**