

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

# 在串流影片中搜尋集合中的人臉
<a name="collections-streaming"></a>

您可以使用 Amazon Rekognition Video 來偵測及辨識串流影片中的人臉。使用 Amazon Rekognition Video，您可以建立串流處理器 ( [CreateStreamProcessor ](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_CreateStreamProcessor.html) )，以開始和管理串流視訊的分析。

為了偵測影片串流中的已知人臉 (人臉搜尋)，Amazon Rekognition Video 使用 Amazon Kinesis Video Streams 來接收和處理影片串流。分析結果會從 Amazon Rekognition Video 輸出至 Kinesis 資料串流，再由您的使用者端應用程式讀取。

若要搭配串流影片使用 Amazon Rekognition Video，您的應用程式需要實作下列專案：
+ Kinesis video stream，用於將串流影片傳送至 Amazon Rekognition Video。如需詳細資訊，請參閱 [Amazon Kinesis Video Streams 開發人員指南](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/what-is-kinesis-video.html)。
+ Amazon Rekognition Video 串流處理器用於管理串流影片的分析。如需詳細資訊，請參閱 [Amazon Rekognition Video 串流處理器操作概觀](streaming-video.md#using-rekognition-video-stream-processor)。
+ Kinesis 資料串流消費者可讀取 Amazon Rekognition Video 傳送至 Kinesis 資料串流的分析結果。如需詳細資訊，請參閱 [Kinesis 資料串流消费者](https://docs.aws.amazon.com/streams/latest/dev/amazon-kinesis-consumers.html)。

本節包含撰寫建立 Kinesis 影片串流和其他必要資源的應用程式、將影片串流至 Amazon Rekognition Video，以及接收分析結果的相關資訊。

**Topics**
+ [設定您的 Amazon Rekognition Video 和 Amazon Kinesis 資源](setting-up-your-amazon-rekognition-streaming-video-resources.md)
+ [在串流影片中搜尋人臉。](rekognition-video-stream-processor-search-faces.md)
+ [使用 GStreamer 外掛程式進行串流](streaming-using-gstreamer-plugin.md)
+ [串流影片故障診斷](streaming-video-troubleshooting.md)

# 設定您的 Amazon Rekognition Video 和 Amazon Kinesis 資源
<a name="setting-up-your-amazon-rekognition-streaming-video-resources"></a>

 下列程序說明佈建 Kinesis 影片串流所採取的步驟，以及用來辨識串流影片中人臉的其他資源。

## 先決條件
<a name="streaming-video-prerequisites"></a>

若要執行此程序，您需要 適用於 Java 的 AWS SDK 安裝 。如需詳細資訊，請參閱[Amazon Rekognition 入門](getting-started.md)。 AWS 帳戶 您使用的 必須具有 Amazon Rekognition API 的存取許可。如需詳細資訊，請參閱 *IAM 使用者指南*中的 [Amazon Rekognition 定義的動作](https://docs.aws.amazon.com/IAM/latest/UserGuide/list_amazonrekognition.html#amazonrekognition-actions-as-permissions)。

**辨識影片串流中的臉部 (AWS 開發套件)**

1. 如果您尚未建立 IAM 服務角色，請建立 IAM 服務角色，讓 Amazon Rekognition Video 有權存取您的 Kinesis 影片串流和 Kinesis 資料串流。請記下 ARN。如需詳細資訊，請參閱 [使用 AmazonRekognitionServiceRole 提供對串流的存取權](api-streaming-video-roles.md#api-streaming-video-roles-all-stream)。

1. [建立集合](create-collection-procedure.md)並記下您所使用的集合識別符。

1. [將您要搜尋之臉部的索引建立](add-faces-to-collection-procedure.md)至您於步驟 2 中建立的集合。

1. [建立 Kinesis 資料串流](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/gs-createstream.html)，並記下串流的 Amazon Resource Name (ARN)。

1. [建立 Kinesis 資料串流](https://docs.aws.amazon.com/streams/latest/dev/learning-kinesis-module-one-create-stream.html)。在串流名稱前面加上*AmazonRekognition*並記下串流的 ARN。

然後，您可以[建立人臉搜尋串流處理器](rekognition-video-stream-processor-search-faces.md#streaming-video-creating-stream-processor)，並使用您選擇的[串流處理器名稱啟動](rekognition-video-stream-processor-search-faces.md#streaming-video-starting-stream-processor)串流處理器。

**注意**  
 只有在驗證可以將媒體匯入 Kinesis 影片串流後，才應啟動串流處理器。

## 將影片串流式傳輸到 Amazon Rekognition Video
<a name="video-streaming-kinesisvideostreams-stream"></a>

若要將影片串流傳輸至 Amazon Rekognition Video，您可以使用 Amazon Kinesis Video Streams SDK 來建立和使用 Kinesis 影片串流。`PutMedia` 操作會將影片資料*片段*​寫入 Amazon Rekognition Video 所取用的 Kinesis 影片串流。每個影片資料片段的長度通常是 2 至 10 秒，並包含一連串獨立的影片影格。Amazon Rekognition Video 支援 H.264 編碼影片，包含三種影格類型 (I、B 與 P)。如需詳細資訊，請參閱 [I 影格](https://en.wikipedia.org/wiki/Inter_frame)。片段中的第一個影格必須是 I 影格。I 影格可以與任何其他影格分開解碼。

當影片資料進入 Kinesis 影片串流時，會指派唯一號碼給片段。如需範例，請參閱 [PutMedia API 範例](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/examples-putmedia.html)。
+  如果您是從 Matroska (MKV) 編碼來源串流，請使用 [PutMedia](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/API_dataplane_PutMedia.html) 操作將來源影片串流寫入您建立的 Kinesis 影片串流。如需詳細資訊，請參閱 [PutMedia API 範例](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/examples-putmedia.html)。
+  如果您是從裝置相機獲得串流，請參閱 [使用 GStreamer 外掛程式進行串流](streaming-using-gstreamer-plugin.md)。

# 讓 Amazon Rekognition Video 有權存取您的資源
<a name="api-streaming-video-roles"></a>

您可以使用 AWS Identity and Access Management (IAM) 服務角色，讓 Amazon Rekognition Video 能夠讀取 Kinesis 影片串流。如果您使用的是人臉搜尋串流處理器，則可以使用 IAM 服務角色讓 Amazon Rekognition Video 有權寫入 Kinesis 資料串流。如果您使用的是安全監控串流處理器，則可以使用 IAM 角色讓 Amazon Rekognition Video 有權存取 Amazon S3 儲存貯體和 Amazon SNS 主題。

## 提供人臉搜尋串流處理器的存取權
<a name="api-streaming-video-roles-single-stream"></a>

您可以建立許可政策，其允許 Amazon Rekognition Video 對 Kinesis 影片串流和 Kinesis 資料串流的存取。

**對 Amazon Rekognition Video 提供人臉搜尋串流處理器的存取權**

1. [使用 IAM JSON 政策編輯器建立新的許可政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html#access_policies_create-json-editor)，並使用下列政策。以所需的 Kinesis 影片串流 ARN 取代 `video-arn`。如果您使用的是人臉搜尋串流處理器，請以所需的 Kinesis 資料串流 ARN 取代 `data-arn`。

1. [建立 IAM 服務角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html?icmpid=docs_iam_console)，或更新現有的 IAM 服務角色。請使用下列資訊來建立 IAM 服務角色：

   1. 針對服務名稱選擇 **Rekognition**。

   1. 為服務角色使用案例選擇 **Rekognition**。

   1. 連接您在步驟 1 中建立的許可政策。

1. 請記下服務角色的 ARN。您需要此資訊才可開始影片分析操作。

## 使用 AmazonRekognitionServiceRole 提供對串流的存取權
<a name="api-streaming-video-roles-all-stream"></a>

 作為設定 Kinesis 影片串流和資料串流存取權的替代選項，可以使用 `AmazonRekognitionServiceRole` 许可政策。IAM 提供 *Rekognition* 服務角色使用案例，配合 `AmazonRekognitionServiceRole` 許可政策使用時，擁有對多個 Kinesis 資料串流的寫入權和對所有 Kinesis 影片串流的讀取權。若要讓 Amazon Rekognition Video 寫入多個 Kinesis 資料串流，您可以在 Kinesis 資料串流的名稱前面加上*AmazonRekognition* (例如，`AmazonRekognitionMyDataStreamName`)。

**讓 Amazon Rekognition Video 有權存取您的 Kinesis 影片串流和 Kinesis 資料串流**

1. [建立 IAM 服務角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html?icmpid=docs_iam_console)。請使用下列資訊來建立 IAM 服務角色：

   1. 針對服務名稱選擇 **Rekognition**。

   1. 為服務角色使用案例選擇 **Rekognition**。

   1. 選擇 **AmazonRekognitionServiceRole** 許可政策，該政策提供 Amazon Rekognition Video 對字首為 *AmazonRekognition* 之 Kinesis 資料串流的寫入存取，以及對您所有 Kinesis 影片串流的讀取存取。

1. 為了確保您的 AWS 帳戶 安全，請將 Rekognition 的存取範圍限制為您正在使用的資源。這可以通過將信任政策附加到您的 IAM 服務角色來完成。如需如何執行此作業的資訊，請參閱 [預防跨服務混淆代理人](cross-service-confused-deputy-prevention.md)。

1. 記下服務角色的 Amazon Resource Name (ARN)。您需要此資訊才可開始影片分析操作。

# 在串流影片中搜尋人臉。
<a name="rekognition-video-stream-processor-search-faces"></a>

Amazon Rekognition Video 可在集合中搜尋與串流影片中偵測到之人臉相符的人臉。如需集合的詳細資訊，請參閱 [在集合中搜尋人臉](collections.md)。

**Topics**
+ [建立 Amazon Rekognition Video 人臉搜尋串流處理器](#streaming-video-creating-stream-processor)
+ [啟動 Amazon Rekognition Video 人臉搜尋串流處理器](#streaming-video-starting-stream-processor)
+ [使用串流處理器進行人臉搜尋 (Java V2 範例)](#using-stream-processors-v2)
+ [使用串流處理器進行人臉搜尋 (Java V1 範例)](#using-stream-processors)
+ [讀取串流影片分析結果](streaming-video-kinesis-output.md)
+ [使用 Kinesis Video Streams 本機顯示 Rekognition 結果](displaying-rekognition-results-locally.md)
+ [了解 Kinesis 人臉辨識 JSON 影格記錄](streaming-video-kinesis-output-reference.md)

下圖顯示 Amazon Rekognition Video 如何偵測及辨識串流影片中的人臉。

![\[使用 Amazon Rekognition Video 從 Amazon Kinesis 處理影片串流的工作流程圖表。\]](http://docs.aws.amazon.com/zh_tw/rekognition/latest/dg/images/VideoRekognitionStream.png)


## 建立 Amazon Rekognition Video 人臉搜尋串流處理器
<a name="streaming-video-creating-stream-processor"></a>

您必須先建立 Amazon Rekognition Video 串流處理器 ([CreateStreamProcessor](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_CreateStreamProcessor.html))，才能分析串流影片。串流處理器包含 Kinesis 資料串流和 Kinesis 影片串流的相關資訊。其也會包含集合的識別符，該集合含有您要在輸入串流影片中辨識的人臉。您也可以指定串流處理器的名稱。以下是 `CreateStreamProcessor` 要求的 JSON 範例。

```
{
       "Name": "streamProcessorForCam",
       "Input": {
              "KinesisVideoStream": {
                     "Arn": "arn:aws:kinesisvideo:us-east-1:nnnnnnnnnnnn:stream/inputVideo"
              }
       },
       "Output": {
              "KinesisDataStream": {
                     "Arn": "arn:aws:kinesis:us-east-1:nnnnnnnnnnnn:stream/outputData"
              }
       },
       "RoleArn": "arn:aws:iam::nnnnnnnnnnn:role/roleWithKinesisPermission",
       "Settings": {
              "FaceSearch": {
                     "CollectionId": "collection-with-100-faces",
                     "FaceMatchThreshold": 85.5
              }
       }
}
```

以下是 `CreateStreamProcessor` 的回應範例。

```
{
       “StreamProcessorArn”: “arn:aws:rekognition:us-east-1:nnnnnnnnnnnn:streamprocessor/streamProcessorForCam”
}
```

## 啟動 Amazon Rekognition Video 人臉搜尋串流處理器
<a name="streaming-video-starting-stream-processor"></a>

您可以透過呼叫 [StartStreamProcessor](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_StartStreamProcessor.html) 並提供您在 `CreateStreamProcessor` 中指定的串流處理器名稱，來開始分析串流影片。以下是 `StartStreamProcessor` 要求的 JSON 範例。

```
{
       "Name": "streamProcessorForCam"
}
```

如果串流處理器成功啟動，就會傳回 HTTP 200 回應，以及空的 JSON 內文。

## 使用串流處理器進行人臉搜尋 (Java V2 範例)
<a name="using-stream-processors-v2"></a>

下列範例程式碼示範如何使用適用於 Java 的 AWS SDK 第 2 版呼叫各種串流處理器操作，例如 [CreateStreamProcessor](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_CreateStreamProcessor.html) 和 [StartStreamProcessor](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_StartStreamProcessor.html)。

此程式碼取自 AWS 文件開發套件範例 GitHub 儲存庫。請參閱[此處](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/javav2/example_code/rekognition/src/main/java/com/example/rekognition/CreateStreamProcessor.java)的完整範例。

```
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.rekognition.RekognitionClient;
import software.amazon.awssdk.services.rekognition.model.CreateStreamProcessorRequest;
import software.amazon.awssdk.services.rekognition.model.CreateStreamProcessorResponse;
import software.amazon.awssdk.services.rekognition.model.FaceSearchSettings;
import software.amazon.awssdk.services.rekognition.model.KinesisDataStream;
import software.amazon.awssdk.services.rekognition.model.KinesisVideoStream;
import software.amazon.awssdk.services.rekognition.model.ListStreamProcessorsRequest;
import software.amazon.awssdk.services.rekognition.model.ListStreamProcessorsResponse;
import software.amazon.awssdk.services.rekognition.model.RekognitionException;
import software.amazon.awssdk.services.rekognition.model.StreamProcessor;
import software.amazon.awssdk.services.rekognition.model.StreamProcessorInput;
import software.amazon.awssdk.services.rekognition.model.StreamProcessorSettings;
import software.amazon.awssdk.services.rekognition.model.StreamProcessorOutput;
import software.amazon.awssdk.services.rekognition.model.StartStreamProcessorRequest;
import software.amazon.awssdk.services.rekognition.model.DescribeStreamProcessorRequest;
import software.amazon.awssdk.services.rekognition.model.DescribeStreamProcessorResponse;

/**
 * Before running this Java V2 code example, set up your development
 * environment, including your credentials.
 * <p>
 * For more information, see the following documentation topic:
 * <p>
 * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html
 */
public class CreateStreamProcessor {
    public static void main(String[] args) {
        final String usage = """
                
                Usage:    <role> <kinInputStream> <kinOutputStream> <collectionName> <StreamProcessorName>
                
                Where:
                   role - The ARN of the AWS Identity and Access Management (IAM) role to use. \s
                   kinInputStream - The ARN of the Kinesis video stream.\s
                   kinOutputStream - The ARN of the Kinesis data stream.\s
                   collectionName - The name of the collection to use that contains content. \s
                   StreamProcessorName - The name of the Stream Processor. \s
                """;

        if (args.length != 5) {
            System.out.println(usage);
            System.exit(1);
        }

        String role = args[0];
        String kinInputStream = args[1];
        String kinOutputStream = args[2];
        String collectionName = args[3];
        String streamProcessorName = args[4];

        Region region = Region.US_EAST_1;
        RekognitionClient rekClient = RekognitionClient.builder()
                .region(region)
                .build();

        processCollection(rekClient, streamProcessorName, kinInputStream, kinOutputStream, collectionName,
                role);
        startSpecificStreamProcessor(rekClient, streamProcessorName);
        listStreamProcessors(rekClient);
        describeStreamProcessor(rekClient, streamProcessorName);
        deleteSpecificStreamProcessor(rekClient, streamProcessorName);
    }

    public static void listStreamProcessors(RekognitionClient rekClient) {
        ListStreamProcessorsRequest request = ListStreamProcessorsRequest.builder()
                .maxResults(15)
                .build();

        ListStreamProcessorsResponse listStreamProcessorsResult = rekClient.listStreamProcessors(request);
        for (StreamProcessor streamProcessor : listStreamProcessorsResult.streamProcessors()) {
            System.out.println("StreamProcessor name - " + streamProcessor.name());
            System.out.println("Status - " + streamProcessor.status());
        }
    }

    private static void describeStreamProcessor(RekognitionClient rekClient, String StreamProcessorName) {
        DescribeStreamProcessorRequest streamProcessorRequest = DescribeStreamProcessorRequest.builder()
                .name(StreamProcessorName)
                .build();

        DescribeStreamProcessorResponse describeStreamProcessorResult = rekClient
                .describeStreamProcessor(streamProcessorRequest);
        System.out.println("Arn - " + describeStreamProcessorResult.streamProcessorArn());
        System.out.println("Input kinesisVideo stream - "
                + describeStreamProcessorResult.input().kinesisVideoStream().arn());
        System.out.println("Output kinesisData stream - "
                + describeStreamProcessorResult.output().kinesisDataStream().arn());
        System.out.println("RoleArn - " + describeStreamProcessorResult.roleArn());
        System.out.println(
                "CollectionId - "
                        + describeStreamProcessorResult.settings().faceSearch().collectionId());
        System.out.println("Status - " + describeStreamProcessorResult.status());
        System.out.println("Status message - " + describeStreamProcessorResult.statusMessage());
        System.out.println("Creation timestamp - " + describeStreamProcessorResult.creationTimestamp());
        System.out.println("Last update timestamp - " + describeStreamProcessorResult.lastUpdateTimestamp());
    }

    private static void startSpecificStreamProcessor(RekognitionClient rekClient, String StreamProcessorName) {
        try {
            StartStreamProcessorRequest streamProcessorRequest = StartStreamProcessorRequest.builder()
                    .name(StreamProcessorName)
                    .build();

            rekClient.startStreamProcessor(streamProcessorRequest);
            System.out.println("Stream Processor " + StreamProcessorName + " started.");

        } catch (RekognitionException e) {
            System.out.println(e.getMessage());
            System.exit(1);
        }
    }

    private static void processCollection(RekognitionClient rekClient, String StreamProcessorName,
                                          String kinInputStream, String kinOutputStream, String collectionName, String role) {
        try {
            KinesisVideoStream videoStream = KinesisVideoStream.builder()
                    .arn(kinInputStream)
                    .build();

            KinesisDataStream dataStream = KinesisDataStream.builder()
                    .arn(kinOutputStream)
                    .build();

            StreamProcessorOutput processorOutput = StreamProcessorOutput.builder()
                    .kinesisDataStream(dataStream)
                    .build();

            StreamProcessorInput processorInput = StreamProcessorInput.builder()
                    .kinesisVideoStream(videoStream)
                    .build();

            FaceSearchSettings searchSettings = FaceSearchSettings.builder()
                    .faceMatchThreshold(75f)
                    .collectionId(collectionName)
                    .build();

            StreamProcessorSettings processorSettings = StreamProcessorSettings.builder()
                    .faceSearch(searchSettings)
                    .build();

            CreateStreamProcessorRequest processorRequest = CreateStreamProcessorRequest.builder()
                    .name(StreamProcessorName)
                    .input(processorInput)
                    .output(processorOutput)
                    .roleArn(role)
                    .settings(processorSettings)
                    .build();

            CreateStreamProcessorResponse response = rekClient.createStreamProcessor(processorRequest);
            System.out.println("The ARN for the newly create stream processor is "
                    + response.streamProcessorArn());

        } catch (RekognitionException e) {
            System.out.println(e.getMessage());
            System.exit(1);
        }
    }

    private static void deleteSpecificStreamProcessor(RekognitionClient rekClient, String StreamProcessorName) {
        rekClient.stopStreamProcessor(a -> a.name(StreamProcessorName));
        rekClient.deleteStreamProcessor(a -> a.name(StreamProcessorName));
        System.out.println("Stream Processor " + StreamProcessorName + " deleted.");
    }
}
```

## 使用串流處理器進行人臉搜尋 (Java V1 範例)
<a name="using-stream-processors"></a>

下列範例程式碼示範如何使用 Java V1 呼叫各種串流處理器作業，例如，例如[CreateStreamProcessor](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_CreateStreamProcessor.html)和[StartStreamProcessor](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_StartStreamProcessor.html)。範例包含串流處理器管理員類別 (StreamManager)，可提供方法呼叫串流處理器操作。入門課程 (Starter) 建立 StreamManager 物件並呼叫多個操作。

**設定範例：**

1. 設定數值的 Starter 類別成員欄位至您所需的數值。

1. 在 Starter 類別函數 `main`，移除所需的函數呼叫。

### Starter 類別
<a name="streaming-started"></a>

```
//Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved.
//PDX-License-Identifier: MIT-0 (For details, see https://github.com/awsdocs/amazon-rekognition-developer-guide/blob/master/LICENSE-SAMPLECODE.)

// Starter class. Use to create a StreamManager class
// and call stream processor operations.
package com.amazonaws.samples;
import com.amazonaws.samples.*;

public class Starter {

	public static void main(String[] args) {
		
		
    	String streamProcessorName="Stream Processor Name";
    	String kinesisVideoStreamArn="Kinesis Video Stream Arn";
    	String kinesisDataStreamArn="Kinesis Data Stream Arn";
    	String roleArn="Role Arn";
    	String collectionId="Collection ID";
    	Float matchThreshold=50F;

		try {
			StreamManager sm= new StreamManager(streamProcessorName,
					kinesisVideoStreamArn,
					kinesisDataStreamArn,
					roleArn,
					collectionId,
					matchThreshold);
			//sm.createStreamProcessor();
			//sm.startStreamProcessor();
			//sm.deleteStreamProcessor();
			//sm.deleteStreamProcessor();
			//sm.stopStreamProcessor();
			//sm.listStreamProcessors();
			//sm.describeStreamProcessor();
		}
		catch(Exception e){
			System.out.println(e.getMessage());
		}
	}
}
```

### StreamManager 類別
<a name="streaming-manager"></a>

```
//Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved.
//PDX-License-Identifier: MIT-0 (For details, see https://github.com/awsdocs/amazon-rekognition-developer-guide/blob/master/LICENSE-SAMPLECODE.)

// Stream manager class. Provides methods for calling
// Stream Processor operations.
package com.amazonaws.samples;

import com.amazonaws.services.rekognition.AmazonRekognition;
import com.amazonaws.services.rekognition.AmazonRekognitionClientBuilder;
import com.amazonaws.services.rekognition.model.CreateStreamProcessorRequest;
import com.amazonaws.services.rekognition.model.CreateStreamProcessorResult;
import com.amazonaws.services.rekognition.model.DeleteStreamProcessorRequest;
import com.amazonaws.services.rekognition.model.DeleteStreamProcessorResult;
import com.amazonaws.services.rekognition.model.DescribeStreamProcessorRequest;
import com.amazonaws.services.rekognition.model.DescribeStreamProcessorResult;
import com.amazonaws.services.rekognition.model.FaceSearchSettings;
import com.amazonaws.services.rekognition.model.KinesisDataStream;
import com.amazonaws.services.rekognition.model.KinesisVideoStream;
import com.amazonaws.services.rekognition.model.ListStreamProcessorsRequest;
import com.amazonaws.services.rekognition.model.ListStreamProcessorsResult;
import com.amazonaws.services.rekognition.model.StartStreamProcessorRequest;
import com.amazonaws.services.rekognition.model.StartStreamProcessorResult;
import com.amazonaws.services.rekognition.model.StopStreamProcessorRequest;
import com.amazonaws.services.rekognition.model.StopStreamProcessorResult;
import com.amazonaws.services.rekognition.model.StreamProcessor;
import com.amazonaws.services.rekognition.model.StreamProcessorInput;
import com.amazonaws.services.rekognition.model.StreamProcessorOutput;
import com.amazonaws.services.rekognition.model.StreamProcessorSettings;

public class StreamManager {

    private String streamProcessorName;
    private String kinesisVideoStreamArn;
    private String kinesisDataStreamArn;
    private String roleArn;
    private String collectionId;
    private float matchThreshold;

    private AmazonRekognition rekognitionClient;
    

    public StreamManager(String spName,
    		String kvStreamArn,
    		String kdStreamArn,
    		String iamRoleArn,
    		String collId,
    		Float threshold){
    	streamProcessorName=spName;
    	kinesisVideoStreamArn=kvStreamArn;
    	kinesisDataStreamArn=kdStreamArn;
    	roleArn=iamRoleArn;
    	collectionId=collId;
    	matchThreshold=threshold;
    	rekognitionClient=AmazonRekognitionClientBuilder.defaultClient();
    	
    }
    
    public void createStreamProcessor() {
    	//Setup input parameters
        KinesisVideoStream kinesisVideoStream = new KinesisVideoStream().withArn(kinesisVideoStreamArn);
        StreamProcessorInput streamProcessorInput =
                new StreamProcessorInput().withKinesisVideoStream(kinesisVideoStream);
        KinesisDataStream kinesisDataStream = new KinesisDataStream().withArn(kinesisDataStreamArn);
        StreamProcessorOutput streamProcessorOutput =
                new StreamProcessorOutput().withKinesisDataStream(kinesisDataStream);
        FaceSearchSettings faceSearchSettings =
                new FaceSearchSettings().withCollectionId(collectionId).withFaceMatchThreshold(matchThreshold);
        StreamProcessorSettings streamProcessorSettings =
                new StreamProcessorSettings().withFaceSearch(faceSearchSettings);

        //Create the stream processor
        CreateStreamProcessorResult createStreamProcessorResult = rekognitionClient.createStreamProcessor(
                new CreateStreamProcessorRequest().withInput(streamProcessorInput).withOutput(streamProcessorOutput)
                        .withSettings(streamProcessorSettings).withRoleArn(roleArn).withName(streamProcessorName));

        //Display result
        System.out.println("Stream Processor " + streamProcessorName + " created.");
        System.out.println("StreamProcessorArn - " + createStreamProcessorResult.getStreamProcessorArn());
    }

    public void startStreamProcessor() {
        StartStreamProcessorResult startStreamProcessorResult =
                rekognitionClient.startStreamProcessor(new StartStreamProcessorRequest().withName(streamProcessorName));
        System.out.println("Stream Processor " + streamProcessorName + " started.");
    }

    public void stopStreamProcessor() {
        StopStreamProcessorResult stopStreamProcessorResult =
                rekognitionClient.stopStreamProcessor(new StopStreamProcessorRequest().withName(streamProcessorName));
        System.out.println("Stream Processor " + streamProcessorName + " stopped.");
    }

    public void deleteStreamProcessor() {
        DeleteStreamProcessorResult deleteStreamProcessorResult = rekognitionClient
                .deleteStreamProcessor(new DeleteStreamProcessorRequest().withName(streamProcessorName));
        System.out.println("Stream Processor " + streamProcessorName + " deleted.");
    }

    public void describeStreamProcessor() {
        DescribeStreamProcessorResult describeStreamProcessorResult = rekognitionClient
                .describeStreamProcessor(new DescribeStreamProcessorRequest().withName(streamProcessorName));

        //Display various stream processor attributes.
        System.out.println("Arn - " + describeStreamProcessorResult.getStreamProcessorArn());
        System.out.println("Input kinesisVideo stream - "
                + describeStreamProcessorResult.getInput().getKinesisVideoStream().getArn());
        System.out.println("Output kinesisData stream - "
                + describeStreamProcessorResult.getOutput().getKinesisDataStream().getArn());
        System.out.println("RoleArn - " + describeStreamProcessorResult.getRoleArn());
        System.out.println(
                "CollectionId - " + describeStreamProcessorResult.getSettings().getFaceSearch().getCollectionId());
        System.out.println("Status - " + describeStreamProcessorResult.getStatus());
        System.out.println("Status message - " + describeStreamProcessorResult.getStatusMessage());
        System.out.println("Creation timestamp - " + describeStreamProcessorResult.getCreationTimestamp());
        System.out.println("Last update timestamp - " + describeStreamProcessorResult.getLastUpdateTimestamp());
    }

    public void listStreamProcessors() {
        ListStreamProcessorsResult listStreamProcessorsResult =
                rekognitionClient.listStreamProcessors(new ListStreamProcessorsRequest().withMaxResults(100));

        //List all stream processors (and state) returned from Rekognition
        for (StreamProcessor streamProcessor : listStreamProcessorsResult.getStreamProcessors()) {
            System.out.println("StreamProcessor name - " + streamProcessor.getName());
            System.out.println("Status - " + streamProcessor.getStatus());
        }
    }
}
```

# 讀取串流影片分析結果
<a name="streaming-video-kinesis-output"></a>

您可以使用 Amazon Kinesis Data Streams Client Library 取用傳送至 Amazon Kinesis Data Streams 輸出串流的分析結果。如需詳細資訊，請參閱[從 Kinesis 資料串流讀取資料](https://docs.aws.amazon.com/streams/latest/dev/building-consumers.html)。Amazon Rekognition Video 會將每個已分析影格的 JSON 影格記錄放入 Kinesis 輸出串流。Amazon Rekognition Video 不會分析透過 Kinesis 影片串流傳遞給其的每個影格。

傳送至 Kinesis 資料串流的影格記錄包含有關影格所在之 Kinesis 影片串流片段、影格在片段中的位置，以及影格中已辨識之人臉的資訊。它也包含串流處理器的狀態資訊。如需詳細資訊，請參閱 [了解 Kinesis 人臉辨識 JSON 影格記錄](streaming-video-kinesis-output-reference.md)。

Amazon Kinesis Video Streams 剖析器程式庫包含範例測試，這些測試會使用 Amazon Rekognition Video 結果，並將其與原始 Kinesis 影片串流整合。如需詳細資訊，請參閱 [使用 Kinesis Video Streams 本機顯示 Rekognition 結果](displaying-rekognition-results-locally.md)。

Amazon Rekognition Video 訊將 Amazon Rekognition Video 訊分析資訊串流到 Kinesis 資料串流。以下是單一記錄的 JSON 範例。

```
{
  "InputInformation": {
    "KinesisVideo": {
      "StreamArn": "arn:aws:kinesisvideo:us-west-2:nnnnnnnnnnnn:stream/stream-name",
      "FragmentNumber": "91343852333289682796718532614445757584843717598",
      "ServerTimestamp": 1510552593.455,
      "ProducerTimestamp": 1510552593.193,
      "FrameOffsetInSeconds": 2
    }
  },
  "StreamProcessorInformation": {
    "Status": "RUNNING"
  },
  "FaceSearchResponse": [
    {
      "DetectedFace": {
        "BoundingBox": {
          "Height": 0.075,
          "Width": 0.05625,
          "Left": 0.428125,
          "Top": 0.40833333
        },
        "Confidence": 99.975174,
        "Landmarks": [
          {
            "X": 0.4452057,
            "Y": 0.4395594,
            "Type": "eyeLeft"
          },
          {
            "X": 0.46340984,
            "Y": 0.43744427,
            "Type": "eyeRight"
          },
          {
            "X": 0.45960626,
            "Y": 0.4526856,
            "Type": "nose"
          },
          {
            "X": 0.44958648,
            "Y": 0.4696949,
            "Type": "mouthLeft"
          },
          {
            "X": 0.46409217,
            "Y": 0.46704912,
            "Type": "mouthRight"
          }
        ],
        "Pose": {
          "Pitch": 2.9691637,
          "Roll": -6.8904796,
          "Yaw": 23.84388
        },
        "Quality": {
          "Brightness": 40.592964,
          "Sharpness": 96.09616
        }
      },
      "MatchedFaces": [
        {
          "Similarity": 88.863960,
          "Face": {
            "BoundingBox": {
              "Height": 0.557692,
              "Width": 0.749838,
              "Left": 0.103426,
              "Top": 0.206731
            },
            "FaceId": "ed1b560f-d6af-5158-989a-ff586c931545",
            "Confidence": 99.999201,
            "ImageId": "70e09693-2114-57e1-807c-50b6d61fa4dc",
            "ExternalImageId": "matchedImage.jpeg"
          }
        }
      ]
    }
  ]
}
```

在 JSON 範例中，請注意下列事項：
+ **InputInformation**：用來將影片串流到 Amazon Rekognition Video 的 Kinesis 影片串流的相關資訊。如需詳細資訊，請參閱 [InputInformation](streaming-video-kinesis-output-reference.md#streaming-video-kinesis-output-reference-inputinformation)。
+ **StreamProcessorInformation**：Amazon Rekognition Video 串流處理器的狀態資訊。唯一可用於 `Status` 欄位的值是 RUNNING。如需詳細資訊，請參閱 [StreamProcessorInformation](streaming-video-kinesis-output-reference-streamprocessorinformation.md)。
+ **FaceSearchResponse**：包含串流影片中與輸入集合中人臉相符之人臉的資訊。[FaceSearchResponse](streaming-video-kinesis-output-reference.md#streaming-video-kinesis-output-reference-facesearchresponse) 包含 [DetectedFace](streaming-video-kinesis-output-reference.md#streaming-video-kinesis-output-reference-detectedface) 物件，是在用於分析的影片影格中偵測到的人臉。對於每個偵測到的人臉，陣列 `MatchedFaces` 皆包含在輸入集合中找到之相符人臉物件的陣列 ([MatchedFace](streaming-video-kinesis-output-reference.md#streaming-video-kinesis-output-reference-facematch))，以及相似度分數。

## 將 Kinesis 影片串流對應至 Kinesis 資料串流
<a name="mapping-streams"></a>

您可能會想要將 Kinesis 影片串流影格對應至已發送至 Kinesis 資料串流的影格。例如，在串流影片顯示期間，您可能想要在已辨識的人臉周圍顯示方塊。週框方塊座標會做為 Kinesis 人臉辨識記錄的一部分傳送至 Kinesis 資料串流。若要正確顯示週框方塊，您需要將隨 Kinesis 人臉辨識記錄傳送的時間資訊，與來源 Kinesis 影片串流中相應的影格相對應。

您用來將 Kinesis 影片串流對應至 Kinesis 資料串流的技術取決於您要串流即時媒體 (例如即時串流影片)，還是要串流封存媒體 (例如已儲存影片)。

### 串流即時媒體時的對應
<a name="mapping-streaming-video"></a>

**若要將 Kinesis 影片串流影格對應至 Kinesis 資料串流影格**

1. 將 `FragmentTimeCodeType`PutMedia[ 操作的輸入參數 ](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/API_dataplane_PutMedia.html) 設定為 `RELATIVE`。

1. 呼叫 `PutMedia`，將即時媒體傳遞至 Kinesis 影片串流。

1. 當您從 Kinesis 資料串流收到 Kinesis 人臉辨識記錄時，請儲存來自 [KinesisVideo](streaming-video-kinesis-output-reference.md#streaming-video-kinesis-output-reference-kinesisvideostreams-kinesisvideo) 欄位中 `ProducerTimestamp` 與 `FrameOffsetInSeconds` 的值。

1. 將 `ProducerTimestamp` 與 `FrameOffsetInSeconds` 欄位值相加，藉此計算對應至 Kinesis 影片串流影格的時間戳記。

### 串流封存媒體時的對應
<a name="map-stored-video"></a>

**若要將 Kinesis 影片串流影格對應至 Kinesis 資料串流影格**

1. 呼叫 [PutMedia](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/API_dataplane_PutMedia.html)，將封存媒體傳遞至 Kinesis 影片串流。

1. 當您從 `PutMedia` 操作回應收到 `Acknowledgement` 物件時，請储存[承載](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/API_dataplane_PutMedia.html#API_dataplane_PutMedia_ResponseSyntax)欄位中的 `FragmentNumber` 欄位值。`FragmentNumber` 是 MKV 叢集的片段数目。

1. 當您從 Kinesis 資料串流收到 Kinesis 人臉辨識記錄時，請储存來自 [KinesisVideo](streaming-video-kinesis-output-reference.md#streaming-video-kinesis-output-reference-kinesisvideostreams-kinesisvideo) 欄位的 `FrameOffsetInSeconds` 欄位值。

1. 使用您在步驟 2 與 3 中儲存的 `FrameOffsetInSeconds` 與 `FragmentNumber` 值來計算對應。`FrameOffsetInSeconds` 是具有特定 `FragmentNumber` 之片段的位移，其會傳送至 Amazon Kinesis Data Streams。如需取得指定片段號碼之影片影格的詳細資訊，請參閱 [Amazon Kinesis Video Streams 的已封存媒體](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/API_Operations_Amazon_Kinesis_Video_Streams_Archived_Media.html)。

# 使用 Kinesis Video Streams 本機顯示 Rekognition 結果
<a name="displaying-rekognition-results-locally"></a>

 您可以使用 [KinesisVideo：Rekognition 範例](https://github.com/aws/amazon-kinesis-video-streams-parser-library#kinesisvideo---rekognition-examples)中的 Amazon Kinesis Video Streams 解析器程式庫的範例測試，查看您 Amazon Kinesis Video Streams 摘要中顯示的 Amazon Rekognition Video 結果。`KinesisVideoRekognitionIntegrationExample` 會在偵測到的人臉上顯示邊界方框，並透過 JFrame 在本機上轉譯影片。此程序假設您已成功將媒體輸入從裝置攝影機連接到 Kinesis 影片串流，並啟動 Amazon Rekognition 串流處理器。如需詳細資訊，請參閱 [使用 GStreamer 外掛程式進行串流](streaming-using-gstreamer-plugin.md)。

## 步驟 1：安裝 Kinesis 影片串流剖析程式庫
<a name="step-1-install-parser-library"></a>

 若要建立目錄並下載 Github 儲存庫，請執行下列命令：

```
$ git clone https://github.com/aws/amazon-kinesis-video-streams-parser-library.git
```

 導航到庫目錄並執行以下 Maven 命令以執行全新安裝：

```
$ mvn clean install
```

## 步驟 2：設定 Kinesis 影片串流和 Rekognition 整合範例測試
<a name="step-2-configure-kinesis-video-rekognition-example-test"></a>

 開啟 `KinesisVideoRekognitionIntegrationExampleTest.java` 檔案。刪除類標題後的 `@Ignore` 權利。使用來自 Amazon Kinesis 和 Amazon Rekognition 資源的資訊填入資料欄位。如需詳細資訊，請參閱 [設定您的 Amazon Rekognition Video 和 Amazon Kinesis 資源](setting-up-your-amazon-rekognition-streaming-video-resources.md)。如果您要將影片串流至 Kinesis 影片串流，請移除 `inputStream` 參數。

 請參閱以下程式碼範例。

```
RekognitionInput rekognitionInput = RekognitionInput.builder()
  .kinesisVideoStreamArn("arn:aws:kinesisvideo:us-east-1:123456789012:stream/rekognition-test-video-stream")
  .kinesisDataStreamArn("arn:aws:kinesis:us-east-1:123456789012:stream/AmazonRekognition-rekognition-test-data-stream")
  .streamingProcessorName("rekognition-test-stream-processor")
  // Refer how to add face collection :
  // https://docs.aws.amazon.com/rekognition/latest/dg/add-faces-to-collection-procedure.html
  .faceCollectionId("rekognition-test-face-collection")
  .iamRoleArn("rekognition-test-IAM-role")
  .matchThreshold(0.95f)
  .build();                
            
KinesisVideoRekognitionIntegrationExample example = KinesisVideoRekognitionIntegrationExample.builder()
  .region(Regions.US_EAST_1)
  .kvsStreamName("rekognition-test-video-stream")
  .kdsStreamName("AmazonRekognition-rekognition-test-data-stream")
  .rekognitionInput(rekognitionInput)
  .credentialsProvider(new ProfileCredentialsProvider())
  // NOTE: Comment out or delete the inputStream parameter if you are streaming video, otherwise
  // the test will use a sample video. 
  //.inputStream(TestResourceUtil.getTestInputStream("bezos_vogels.mkv"))
  .build();
```

## 步驟 3：執行 Kinesis Video Streams 和 Rekognition 整合範例測試
<a name="step-3-run-kinesis-video-rekognition-example-test"></a>

 如果您要串流到 Kinesis 影片串流，請確保 Kinesis 影片串流正在接收媒體輸入，並在執行 Amazon Rekognition Video 串流處理器的情況下開始分析串流。如需詳細資訊，請參閱 [Amazon Rekognition Video 串流處理器操作概觀](streaming-video.md#using-rekognition-video-stream-processor)。執行該 `KinesisVideoRekognitionIntegrationExampleTest` 類作為一個 JUnit 測試。短暫的延遲後，會開啟一個新視窗，其中包含 Kinesis 影片串流中的影片，並在偵測到的人臉上繪製邊框。

**注意**  
 此範例中使用的集合中的人臉必須具有以此格式指定的外部影像 ID (檔案名稱)，才能讓邊界方框標籤顯示有意義的文字：PersonName1 (受信任)、PersonName2 (入侵)、PersonName3 (中立)等。這些標籤也可以進行顏色編碼，並且可以在 FaceType.java 檔案中進行自訂。

# 了解 Kinesis 人臉辨識 JSON 影格記錄
<a name="streaming-video-kinesis-output-reference"></a>

您可以使用 Amazon Rekognition Video 來辨識串流影片中的人臉。對於每個已分析的影格，Amazon Rekognition Video 都會將 JSON 影格記錄輸出至 Kinesis 資料串流。Amazon Rekognition Video 不會分析透過 Kinesis 影片串流傳遞給其的每個影格。

JSON 影格記錄包含輸入與輸出串流的資訊、串流處理器的狀態，以及已分析影格中所辨識之臉部的資訊。本節包含 JSON 影格記錄的參考資訊。

以下是適用於 Kinesis 資料串流記錄的 JSON 語法。如需詳細資訊，請參閱 [處理串流影片事件](streaming-video.md)。

**注意**  
Amazon Rekognition Video API 的運作原理是將輸入流中的人臉與一組人臉進行比較，並傳回最接近找到的符合專案以及相似性分數。

```
{
    "InputInformation": {
        "KinesisVideo": {
            "StreamArn": "string",
            "FragmentNumber": "string",
            "ProducerTimestamp": number,
            "ServerTimestamp": number,
            "FrameOffsetInSeconds": number
        }
    },
    "StreamProcessorInformation": {
        "Status": "RUNNING"
    },
    "FaceSearchResponse": [
        {
            "DetectedFace": {
                "BoundingBox": {
                    "Width": number,
                    "Top": number,
                    "Height": number,
                    "Left": number
                },
                "Confidence": number,
                "Landmarks": [
                    {
                        "Type": "string",
                        "X": number,
                        "Y": number
                    }
                ],
                "Pose": {
                    "Pitch": number,
                    "Roll": number,
                    "Yaw": number
                },
                "Quality": {
                    "Brightness": number,
                    "Sharpness": number
                }
            },
            "MatchedFaces": [
                {
                    "Similarity": number,
                    "Face": {
                        "BoundingBox": {
                            "Width": number,
                            "Top": number,
                            "Height": number,
                            "Left": number
                        },
                        "Confidence": number,
                        "ExternalImageId": "string",
                        "FaceId": "string",
                        "ImageId": "string"
                    }
                }
            ]
        }
    ]
}
```

## JSON 記錄
<a name="streaming-video-kinesis-output-reference-processorresult"></a>

JSON 記錄包含 Amazon Rekognition Video 所處理之影格的資訊。此記錄包括串流影片的資訊、已分析影格的狀態，以及影格中所辨識之臉部的資訊。

**InputInformation**

有關用於將影片串流至 Amazon Rekognition Video 的 Kinesis 影片串流的相關資訊。

類型：[InputInformation](#streaming-video-kinesis-output-reference-inputinformation) 物件

**StreamProcessorInformation**

Amazon Rekognition Video 串流處理器的資訊。這包括串流處理器目前狀態的狀態資訊。

類型：[StreamProcessorInformation](streaming-video-kinesis-output-reference-streamprocessorinformation.md) 物件 

**FaceSearchResponse**

關於串流影片影格內偵測到的臉部與輸入集合中之相符臉部的資訊。

類型：[FaceSearchResponse](#streaming-video-kinesis-output-reference-facesearchresponse) 物件陣列

## InputInformation
<a name="streaming-video-kinesis-output-reference-inputinformation"></a>

Amazon Rekognition Video 使用之來源影片串流的資訊。如需詳細資訊，請參閱 [處理串流影片事件](streaming-video.md)。

**KinesisVideo**

類型：[KinesisVideo](#streaming-video-kinesis-output-reference-kinesisvideostreams-kinesisvideo) 物件

## KinesisVideo
<a name="streaming-video-kinesis-output-reference-kinesisvideostreams-kinesisvideo"></a>

將來源影片匯入 Amazon Rekognition Video 的 Kinesis 影片串流的相關資訊。如需詳細資訊，請參閱 [處理串流影片事件](streaming-video.md)。

**StreamArn**

Kinesis 資料串流的 Amazon Resource Name (ARN)。

類型：字串 

**FragmentNumber**

包含此記錄代表之影格的串流影片片段。

類型：字串

**ProducerTimestamp**

片段的生產者端 Unix 時間戳記。如需詳細資訊，請參閱 [PutMedia](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/API_dataplane_PutMedia.html)。

類型：數字

**ServerTimestamp**

片段的伺服器端 Unix 時間戳記。如需詳細資訊，請參閱 [PutMedia](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/API_dataplane_PutMedia.html)。

類型：數字

**FrameOffsetInSeconds**

片段內影格的位移 (以秒為單位)。

類型：數字 

# StreamProcessorInformation
<a name="streaming-video-kinesis-output-reference-streamprocessorinformation"></a>

串流處理器的狀態資訊。

**狀態**

串流處理器目前的狀態。唯一可能的值為「RUNNING」。

類型：字串

## FaceSearchResponse
<a name="streaming-video-kinesis-output-reference-facesearchresponse"></a>

關於串流影片影格內偵測到的臉部以及輸入集合中與偵測到的臉部相符之臉部的資訊。您可以在 [CreateStreamProcessor](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_CreateStreamProcessor.html) 的呼叫中指定集合。如需詳細資訊，請參閱 [處理串流影片事件](streaming-video.md)。

**DetectedFace**

在用於分析的影片影格中偵測到的人臉之人臉詳細資訊。

類型：[DetectedFace](#streaming-video-kinesis-output-reference-detectedface) 物件

**MatchedFaces**

集合中的臉部之臉部詳細資訊陣列，符合於 `DetectedFace` 中偵測到的臉部。

類型：[MatchedFace](#streaming-video-kinesis-output-reference-facematch) 物件陣列

## DetectedFace
<a name="streaming-video-kinesis-output-reference-detectedface"></a>

串流影片影格中偵測到的臉部之資訊。輸入集合中相符的臉部可於 [MatchedFace](#streaming-video-kinesis-output-reference-facematch) 物件欄位中找到。

**BoundingBox**

在已分析影片影格中偵測到之臉部的週框方塊座標。此 BoundingBox 物件與用於影像分析的 BoundingBox 物件具有同一個屬性。

類型：[BoundingBox](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_BoundingBox.html) 物件 

**可信度**

Amazon Rekognition Video 偵測到的人臉實際上是人臉的可信度級別 (1-100) 。1 是最低的可信度，100 是最高的可信度。

類型：數字

**特徵點**

臉部特徵點的陣列。

類型：[特徵點](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_Landmark.html)物件陣列

**姿態**

表示由俯仰、側傾與偏轉所決定的臉部姿態。

類型：[姿態](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_Pose.html)物件

**品質**

識別臉部影像的亮度與銳利度。

類型：[ImageQuality](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_ImageQuality.html) 物件

## MatchedFace
<a name="streaming-video-kinesis-output-reference-facematch"></a>

用於分析的影片影格中偵測到的相符人臉之資訊。

**臉部**

輸入集合內與 [DetectedFace](#streaming-video-kinesis-output-reference-detectedface) 物件中臉部相符之臉部的臉部配對資訊。

類型：[人臉](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_Face.html)物件 

**相似度**

人臉相符的可信度 (1-100)。1 是最低的可信度，100 是最高的可信度。

類型：數字 

# 使用 GStreamer 外掛程式進行串流
<a name="streaming-using-gstreamer-plugin"></a>

Amazon Rekognition Video 可以分析來自裝置攝影機的即時串流影片。如要從裝置來源存取媒體輸入，您需要安裝 GStreamer。GStreamer 是第三方多媒體框架軟件，將媒體源和處理工具在工作流程管道中連接在一起。您還需要為 Gstreamer 安裝 [Amazon Kinesis Video Streams 生成器外掛程式](https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp/)。此程序假設您已成功設定 Amazon Rekognition Video 和 Amazon Kinesis 資源。如需詳細資訊，請參閱 [設定您的 Amazon Rekognition Video 和 Amazon Kinesis 資源](setting-up-your-amazon-rekognition-streaming-video-resources.md)。

## 步驟 1：安裝 Gstreamer
<a name="step-1-install-gstreamer"></a>

 下載並安裝第三方多媒體平台軟件 Gstreamer。您可以使用軟件包管理軟件，例如自製軟件 ([自製軟件上的 Gstreamer](https://formulae.brew.sh/formula/gstreamer))，也可以直接從[免費桌面網站](https://gstreamer.freedesktop.org/download/)獲取。

 通過從命令行終端啟動帶有測試源的影片源來驗證 Gstreamer 是否成功安裝。

```
$ gst-launch-1.0 videotestsrc ! autovideosink
```

## 步驟 2：安裝 Kinesis Video Streams 製作外掛程式
<a name="step-2-install-kinesis-video-plugin"></a>

 在本節中，您將下載 [Amazon Kinesis Video Streams 生成器程式庫](https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp/)，並安裝 Kinesis Video Streams Gstreamer 外掛程式。

 建立目錄，由 GitHub 儲存庫複製範例原始碼。請務必包括 `--recursive` 參數。

```
$ git clone --recursive https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp.git
```

遵循[資源庫提供的指示](https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp/blob/master/README.md)來規劃和建置專案。請務必針對您的作業系統使用平台的特定指令。當您執行 `cmake` 以安裝 Kinesis Video Streams Gstreamer 外掛程式時，請使用此 `-DBUILD_GSTREAMER_PLUGIN=ON` 參數。此專案需要安裝中包含的下列額外套件：GCC 或 Clang、Curl、Openssl 和 Log4cplus。如果您的組建因為遺失套件而失敗，請確認套件已安裝且已安裝在 PATH 中。如果在構建時遇到「無法執行 C 編譯程序」錯誤，請再次執行構建命令。有時，找不到正確的 C 編譯器。

 執行下列命令，驗證 Kinesis Video Streams 外掛程式：

```
$ gst-inspect-1.0 kvssink
```

 應該會顯示下列資訊，例如工廠和外掛程式詳細資訊：

```
Factory Details:
  Rank                     primary + 10 (266)
  Long-name                KVS Sink
  Klass                    Sink/Video/Network
  Description              GStreamer AWS KVS plugin
  Author                   AWS KVS <kinesis-video-support@amazon.com>
                
Plugin Details:
  Name                     kvssink
  Description              GStreamer AWS KVS plugin
  Filename                 /Users/YOUR_USER/amazon-kinesis-video-streams-producer-sdk-cpp/build/libgstkvssink.so
  Version                  1.0
  License                  Proprietary
  Source module            kvssinkpackage
  Binary package           GStreamer
  Origin URL               http://gstreamer.net/
  
  ...
```

## 步驟 3：使用室壁執行影片流插件
<a name="step-3-run-gstreamer-with-kinesis-video-plugin"></a>

 在您開始從裝置攝影機串流到 Kinesis Video Streams 之前，您可能需要將媒體來源轉換為 Kinesis Video Streams 可接受的轉碼器。若要判斷目前連線至電腦之裝置的規格和格式功能，請執行下列命令。

```
$ gst-device-monitor-1.0
```

 若要開始串流，請使用下列範例命令啟動 Gstreamer，然後新增您的憑證和 Amazon Kinesis Video Streams 資訊。應該針對您建立的 IAM 服務角色使用存取金鑰和區域，同時[授予 Amazon Rekognition 存取 Kinesis 串流的權限](https://docs.aws.amazon.com/rekognition/latest/dg/api-streaming-video-roles.html#api-streaming-video-roles-all-stream)。如需有關存取金鑰的詳細資訊，請參閱《IAM 使用者指南》**中的[管理 IAM 使用者的存取金鑰](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html)。另外，您可以根據使用情況的要求調整視訊格式參數，並可從裝置上獲得。

```
$ gst-launch-1.0 autovideosrc device=/dev/video0 ! videoconvert ! video/x-raw,format=I420,width=640,height=480,framerate=30/1 ! 
                x264enc bframes=0 key-int-max=45 bitrate=500 ! video/x-h264,stream-format=avc,alignment=au,profile=baseline ! 
                kvssink stream-name="YOUR_STREAM_NAME" storage-size=512 access-key="YOUR_ACCESS_KEY" secret-key="YOUR_SECRET_ACCESS_KEY" aws-region="YOUR_AWS_REGION"
```

 有關更多啟動命令，請參閱[範例 GStreamer 啟動命令](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/examples-gstreamer-plugin.html#examples-gstreamer-plugin-launch)。

**注意**  
 如果啟動指令因非交涉錯誤而終止，請檢查裝置監視器的輸出，並確定 `videoconvert` 參數值是裝置的有效功能。

 幾秒鐘後，您將在 Kinesis 影片串流上看到來自裝置攝影機的影片摘要。若要開始使用 Amazon Rekognition 偵測和比對人臉，請啟動您的 Amazon Rekognition Video 串流處理器。如需詳細資訊，請參閱 [Amazon Rekognition Video 串流處理器操作概觀](streaming-video.md#using-rekognition-video-stream-processor)。

# 串流影片故障診斷
<a name="streaming-video-troubleshooting"></a>

此主題提供使用 Amazon Rekognition Video 搭配串流影片的故障診斷資訊。

**Topics**
+ [我不知道我的串流處理器是否已成功建立](#ts-streaming-video-create-sp)
+ [我不知道是否已正確設定我的串流處理器](#ts-configured-sp)
+ [我的串流處理器未傳回結果](#ts-streaming-video-no-results-from-sp)
+ [我的串流處理器狀態是失敗](#ts-failed-state)
+ [我的串流處理器未傳回預期的結果](#w2aac27c79c27c15)

## 我不知道我的串流處理器是否已成功建立
<a name="ts-streaming-video-create-sp"></a>

使用下列 AWS CLI 命令以取得串流處理器及其目前狀態的清單。

```
aws rekognition list-stream-processors
```

您可以使用下列 AWS CLI 命令取得其他詳細資訊。將 `stream-processor-name` 取代為所需串流處理器的名稱。

```
aws rekognition describe-stream-processor --name stream-processor-name
```

## 我不知道是否已正確設定我的串流處理器
<a name="ts-configured-sp"></a>

如果您的程式碼不會輸出 Amazon Rekognition Video 的分析結果，則您的串流處理器可能未正確設定。執行以下專案確認您的串流處理器已正確設定並能夠產生結果。

**若要判斷您的解決方案是否正確設定**

1. 執行以下命令確認您的串流處理器處於執行狀態。將 `stream-processor-name` 變更為您的串流處理器名稱。若 `Status` 的值為 `RUNNING`，則串流處理器正在執行。若狀態為 `RUNNING` 而您未取得結果，請參閱[我的串流處理器未傳回結果](#ts-streaming-video-no-results-from-sp)。若狀態為 `FAILED`，請參閱[我的串流處理器狀態是失敗](#ts-failed-state)。

   ```
   aws rekognition describe-stream-processor --name stream-processor-name
   ```

1. 若您的串流處理器正在執行，請執行以下 Bash 或 PowerShell 命令從輸出 Kinesis 資料串流讀取資料。

   **Bash**

   ```
   SHARD_ITERATOR=$(aws kinesis get-shard-iterator --shard-id shardId-000000000000 --shard-iterator-type TRIM_HORIZON --stream-name kinesis-data-stream-name --query 'ShardIterator')
                           aws kinesis get-records --shard-iterator $SHARD_ITERATOR
   ```

   **PowerShell**

   ```
   aws kinesis get-records --shard-iterator ((aws kinesis get-shard-iterator --shard-id shardId-000000000000 --shard-iterator-type TRIM_HORIZON --stream-name kinesis-data-stream-name).split('"')[4])
   ```

1. 使用 Base64 Decode 網站上的[解碼工具](https://www.base64decode.org/)將輸出解碼為人類可讀的字串。如需詳細資訊，請參閱[步驟 3：取得記錄](https://docs.aws.amazon.com/streams/latest/dev/fundamental-stream.html#get-records)。

1. 如果命令可作用且您在 Kinesis 資料串流中看到臉部偵測結果，則您的解決方案已正確設定。如果命令失敗，請查看其他故障診斷建議並參閱 [讓 Amazon Rekognition Video 有權存取您的資源](api-streaming-video-roles.md)。

或者，您可以使用「kinesis-process-record」 AWS Lambda 藍圖，將訊息從 Kinesis 資料串流記錄到 CloudWatch，以進行持續視覺化。這會產生 AWS Lambda 和 CloudWatch 的額外費用。

## 我的串流處理器未傳回結果
<a name="ts-streaming-video-no-results-from-sp"></a>

可能有幾個原因讓您的串流處理器無法傳回結果。

### 原因 1：您的串流處理器未正確設定
<a name="w2aac27c79c27c11b5"></a>

您的串流處理器可能未正確設定。如需詳細資訊，請參閱 [我不知道是否已正確設定我的串流處理器](#ts-configured-sp)。

### 原因 2：您的串流處理器未處於 RUNNING 狀態
<a name="w2aac27c79c27c11b7"></a>

**故障診斷串流處理器的狀態**

1. 使用以下 AWS CLI 命令檢查串流處理器的狀態。

   ```
   aws rekognition describe-stream-processor --name stream-processor-name
   ```

1. 若 `Status` 的值為 `STOPPED`，請使用以下命令啟動串流處理器：

   ```
   aws rekognition start-stream-processor --name stream-processor-name
   ```

1. 若 `Status` 的值為 `FAILED`，請參閱 [我的串流處理器狀態是失敗](#ts-failed-state)。

1. 若 `Status` 的值為 `STARTING`，請等待 2 分鐘並重複步驟 1 以檢查狀態。如果狀態的值仍為 `STARTING`，請執行以下專案：

   1. 使用以下命令刪除串流處理器。

      ```
      aws rekognition delete-stream-processor --name stream-processor-name
      ```

   1. 使用相同組態建立新的串流處理器。如需詳細資訊，請參閱[處理串流影片事件](streaming-video.md)。

   1. 如果您仍然有問題，請聯絡 AWS Support。

1. 若 `Status` 的值為 `RUNNING`，請參閱 [原因 3：在 Kinesis 中沒有作用中的資料](#ts-no-data)。

### 原因 3：在 Kinesis 中沒有作用中的資料
<a name="ts-no-data"></a>

**檢查 Kinesis 影片串流中是否有作用中的資料**

1. 登入 AWS 管理主控台，然後開啟位於 https：//[https://console.aws.amazon.com/kinesisvideo/](https://console.aws.amazon.com/kinesisvideo/) 的 Amazon Kinesis Video Streams 主控台。

1. 選取作為 Amazon Rekognition 串流處理器輸入的 Kinesis 影片串流。

1. 如果預覽顯示為**無串流資料**，則在輸入串流中沒有可供 Amazon Rekognition Video 處理的資料。

如需使用 Kinesis Video Streams 產生影片的資訊，請參閱 [Kinesis 影片串流生成器程式庫](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/producer-sdk.html)。

## 我的串流處理器狀態是失敗
<a name="ts-failed-state"></a>

您可以使用下列 AWS CLI 命令來檢查串流處理器的狀態。

```
aws rekognition describe-stream-processor --name stream-processor-name
```

如果狀態的值為失敗，請查看以下錯誤訊息的故障診斷資訊。

### 錯誤：「 角色存取遭拒」
<a name="w2aac27c79c27c13b9"></a>

由串流處理器使用的 IAM 角色不存在或 Amazon Rekognition Video 未具有擔任角色的許可。

**故障診斷 IAM 角色的存取**

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

1. 在左側導覽窗格中，請選擇 **Roles (角色)** 並確認角色存在。

1. 若角色存在，請確認角色具有 *AmazonRekognitionServiceRole* 許可政策。

1. 若該角色不存在或未具有正確的許可，請參閱[讓 Amazon Rekognition Video 有權存取您的資源](api-streaming-video-roles.md)。

1. 使用以下 AWS CLI 命令啟動串流處理器。

   ```
   aws rekognition start-stream-processor --name stream-processor-name
   ```

### 錯誤：「存取 Kinesis Video 遭拒*或*存取 Kinesis Data 遭拒。」
<a name="w2aac27c79c27c13c11"></a>

該角色無法存取 API 操作 `GetMedia` 和 `GetDataEndpoint`。該角色可能也無法存取 Kinesis Data Streams API 操作 `PutRecord` 和 `PutRecords`。

**故障診斷 API 許可**

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

1. 開啟角色並確認角色已連接以下許可政策。

1. 如果遺失任何許可，請更新政策。如需詳細資訊，請參閱 [讓 Amazon Rekognition Video 有權存取您的資源](api-streaming-video-roles.md)。

### 錯誤：「串流 *input-video-stream-name* 不存在」
<a name="w2aac27c79c27c13c13"></a>

Kinesis 對串流處理器的影片串流輸入不存在或設定不正確。

**故障診斷 Kinesis 資料串流**

1. 使用以下命令確認串流存在。

   ```
   aws kinesisvideo list-streams
   ```

1. 如果串流存在，請檢查下列各項。
   + Amazon Resource Name (ARN) 與串流處理器的輸入串流 ARN 相同。
   + Kinesis 資料串流必須與串流處理器位於相同區域。

   如果未正確設定串流處理器，請使用下列 AWS CLI 命令將其刪除。

   ```
   aws rekognition delete-stream-processor --name stream-processor-name
   ```

1. 以預期的 Kinesis 影片串流建立新的串流處理器。如需詳細資訊，請參閱 [建立 Amazon Rekognition Video 人臉搜尋串流處理器](rekognition-video-stream-processor-search-faces.md#streaming-video-creating-stream-processor)。

### 錯誤：「找不到集合」
<a name="w2aac27c79c27c13c15"></a>

串流處理器用於比對人臉的 Amazon Rekognition 集合不存在或使用了錯誤的集合。

**確認集合**

1. 使用下列 AWS CLI 命令來判斷所需的集合是否存在。`region` 變更為您正在執行串流處理器 AWS 的區域。

   ```
   aws rekognition list-collections --region region
   ```

   如果所需集合不存在，請建立新的集合並新增臉部資訊。如需詳細資訊，請參閱 [在集合中搜尋人臉](collections.md)。

1. 如果您呼叫 [CreateStreamProcessor](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_CreateStreamProcessor.html)，請確認 `CollectionId` 輸入參數的值是否正確。

1. 使用以下 AWS CLI 命令啟動串流處理器。

   ```
   aws rekognition start-stream-processor --name stream-processor-name
   ```

### 錯誤：「找不到*帳戶 ID* 的串流 *output-kinesis-data-stream-name*」
<a name="w2aac27c79c27c13c17"></a>

串流處理器使用的輸出 Kinesis 資料串流不存在於 中， AWS 帳戶 或與您的串流處理器不在相同的 AWS 區域中。

**Kinesis 資料串流的故障診斷**

1. 使用下列 AWS CLI 命令來判斷 Kinesis 資料串流是否存在。`region` 變更為您使用串流處理器 AWS 的區域。

   ```
   aws kinesis list-streams --region region
   ```

1. 若 Kinesis 資料串流存在，請確認 Kinesis 資料串流名稱與串流處理器使用的輸出串流名稱相同。

1. 如果 Kinesis 資料串流不存在，它可能存在於另一個 AWS 區域中。Kinesis 資料串流必須與串流處理器位於相同區域。

1. 如有必要，請建立新的 Kinesis 資料串流。

   1. 使用與串流處理器所用名稱相同的名稱建立 Kinesis 資料串流。如需詳細資訊，請參閱[ 步驟 1：建立資料串流](https://docs.aws.amazon.com/streams/latest/dev/learning-kinesis-module-one-create-stream.html)。

   1. 使用以下 AWS CLI 命令啟動串流處理器。

      ```
      aws rekognition start-stream-processor --name stream-processor-name
      ```

## 我的串流處理器未傳回預期的結果
<a name="w2aac27c79c27c15"></a>

如果您的串流處理器未傳回預期的臉部比對結果，請使用以下資訊。
+ [在集合中搜尋人臉](collections.md)
+ [相機設定的建議 (串流影片)](recommendations-camera-streaming-video.md)