

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 Android 生產者程式庫
<a name="producer-sdk-android"></a>

您可以使用 Amazon Kinesis Video Streams 提供的 Android 生產者程式庫，以最少的組態撰寫應用程式程式碼，將媒體資料從 Android 裝置傳送至 Kinesis 影片串流。

執行下列步驟，將程式碼與 Kinesis Video Streams 整合，讓您的應用程式可以開始將資料串流至 Kinesis 影片串流：

1. 建立 `KinesisVideoClient` 物件的執行個體。

1. 透過提供媒體資源資訊建立 `MediaSource` 物件。例如，當建立攝影機媒體資源時，您提供如識別攝影機和指定攝影機所使用之編碼的資訊。

   當您想要開始串流，您必須建立自訂媒體資源。

## 程序：使用 Android 生產者 SDK
<a name="producer-sdk-android-using"></a>

此程序示範如何在 Android 應用程式中使用 Kinesis Video Streams Android 生產者用戶端，將資料傳送至 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) 檢查、編輯和執行應用程式的程式碼。建議使用最新的穩定版本。

在範本程式碼中，您會提供 Amazon 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**，並記下此 ID 以供稍後使用。在 `awsconfiguration.json`檔案中，這是 `CognitoUserPool.Default.PoolId`。

1. 選取**應用程式整合**索引標籤，然後移至頁面底部。

1. 在**應用程式用戶端清單**區段中，選擇您剛建立**的應用程式用戶端名稱**。

   複製**用戶端 ID** 並記下此 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：連接身分提供者** - 在**使用者集區詳細資訊**區段中，完成下列欄位：
      + **使用者集區 ID** - 選取您先前建立的使用者集區。
      + **應用程式用戶端 ID** - 選取您先前建立的應用程式用戶端 ID。

      選取**下一步**。

   1. **步驟 4：設定屬性** - 在**身分集區名稱欄位中輸入名稱**。

      選取**下一步**。

   1. **步驟 5：檢閱並建立** - 檢閱每個區段中的選擇，然後選取**建立身分集區**。

1. 在**身分集**區頁面上，選取新的身分集區。

   複製**身分集區 ID**，並記下此 ID 以供稍後使用。在 `awsconfiguration.json`檔案中，這是 `CredentialsProvider.CognitoIdentity.Default.PoolId`。

1. 更新 IAM 角色的許可。

   1. 登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 的 IAM 主控台。

   1. 在左側導覽中，選擇**角色**。

   1. 尋找並選取您在上面建立的角色。
**注意**  
如有需要，請使用搜尋列。

   1. 選取連接的許可政策。

      選擇 **Edit** (編輯)。

   1. 選取 **JSON** 索引標籤，並以下列內容取代政策：

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

****  

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

------

      選取**下一步**。

   1. 如果尚未選取，請選取**此新版本設定為預設值**旁的方塊。

      選取**儲存變更**。

# 下載並設定 Android 生產者程式庫程式碼
<a name="producersdk-android-downloadcode"></a>

在 Android 生產者程式庫程序的本節中，您可以下載 Android 範例程式碼，並在 Android Studio 中開啟專案。

如需此範例的先決條件和其他詳細資訊，請參閱[使用 Android 生產者程式庫](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/producer-sdk-android.html)。



1. 建立目錄，然後從 GitHub 適用於 Android 的 AWS Mobile SDK 儲存庫複製 。

   ```
   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** (開放現有的 Android Studio 專案)。

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\$12**)：

   ```
   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>

您呼叫 `[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)` 操作建立 `[KinesisVideoClient](https://github.com/aws-amplify/aws-sdk-android/blob/main/aws-android-sdk-kinesisvideo/src/main/java/com/amazonaws/kinesisvideo/client/KinesisVideoClient.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 Android 程式庫提供 `MediaSource` 介面的`[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)`實作。此類別讀取其中一個裝置攝影機的資料。

在以下程式碼範例 (來自 `[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**)、**Android 應用程式**。在 **Name (名稱)** 欄位中，輸入 **AmazonKinesisVideoDemoApp**。在 **Module (模組)** 下拉式選單中，選擇 **AmazonKinesisVideoDemoApp**。選擇**確定**。

1. 選擇 **Run (執行)**、**Run (執行)**。

1. 在 **Select Deployment Target (選取部署目標)** 畫面中，選擇您的連線裝置，然後選擇 **OK (確定)**。

1. 在裝置上的 **AWSKinesisVideoDemoApp** 應用程式中，選擇 **Create new account (建立新帳戶)**。

1. 輸入 **USERNAME (使用者名稱)**、**Password (密碼)**，**Given name (名字)**、**Email address (電子郵件地址)** 和 **Phone number (電話號碼)** 的值，然後選擇 **Sign up (註冊)**。
**注意**  
這些值有下列限制：  
**密碼：**必須包含大小寫字母、數字和特殊字元。您可以在 [Amazon Cognito 主控台](https://console.aws.amazon.com/cognito/home)的使用者集區頁面中變更這些限制條件。
**電子郵件地址：**必須為有效的地址，讓您可以收到確認代碼。
**電話號碼：**格式須如下：**\$1*<Country code>**<Number>***，例如，**\$112065551212**。

1. 輸入您透過電子郵件收到的代碼，然後選擇**確認**。選擇**確定**。

1. 在下一頁中，保留預設值，然後選擇**串流**。

1. 登入 AWS 管理主控台 ，並在美國西部 （奧勒岡） 區域開啟 [Kinesis Video Streams 主控台](https://console.aws.amazon.com//kinesisvideo/home/)。

   在 **Manage Streams** (管理串流) 頁面中，選擇 **demo-stream** (示範串流)。

1. 串流視訊在內建播放器中播放。在出現視訊之前，您可能需要稍微等待畫面聚積 (在一般性頻寬和處理器的條件下最多 10 秒)。
**注意**  
如果裝置的畫面旋轉 (例如，從縱向到橫向)，應用程式會停止串流視訊。

建立串流的程式碼範例。當程式碼中的 `MediaSource` 開啟時，會開始將攝影機的畫面傳送到 `KinesisVideoClient`。用戶端接著會將資料傳送至名為**示範串流的 Kinesis 影片串流**。