

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Cómo trabajar con operaciones de análisis de vídeos almacenados
<a name="video"></a>

Amazon Rekognition Video es un API que puede utilizar para analizar vídeos. Con Amazon Rekognition Video, puede detectar etiquetas, rostros, personas, famosos y contenido para adultos (insinuante y explícito) en los vídeos que se almacenan en un bucket de Amazon Simple Storage Service (Amazon S3). Puede utilizar Amazon Rekognition Video en categorías como seguridad pública. media/entertainment Anteriormente, la exploración de vídeos para detectar objetos o personas habría conllevado muchas horas de visualización por parte de un ser humano proclive a errores. Amazon Rekognition Video automatiza la detección de elementos y cuándo se producen a lo largo de un vídeo.

En esta sección, se describen los tipos de análisis que Amazon Rekognition Video puede realizar, se incluye información general sobre la API y se muestran ejemplos de uso de Amazon Rekognition Video.

**Topics**
+ [Tipos de análisis](#video-recognition-types)
+ [Descripción general de la API de Amazon Rekognition Video](#video-api-overview)
+ [Cómo llamar a las operaciones de Amazon Rekognition Video](api-video.md)
+ [Configuración de Amazon Rekognition Video](api-video-roles.md)
+ [Análisis de un vídeo almacenado en un bucket de Amazon S3 con Java o Python (SDK)](video-analyzing-with-sqs.md)
+ [Analizar un vídeo con el AWS Command Line Interface](video-cli-commands.md)
+ [Referencia: notificación de resultados de análisis de vídeo](video-notification-payload.md)
+ [Solución de problemas de Amazon Rekognition Video](video-troubleshooting.md)

## Tipos de análisis
<a name="video-recognition-types"></a>

Puede utilizar Amazon Rekognition Video para analizar vídeos para obtener la siguiente información:
+ [Segmentos de vídeo](segments.md)
+ [Etiquetas](labels.md)
+ [Contenido para adultos insinuante y explícito](moderation.md)
+ [Text](text-detection.md)
+ [Famosos](celebrities.md)
+ [Rostros](faces.md)
+ [Personas](persons.md)

Para obtener más información, consulte [Cómo funciona Amazon Rekognition](how-it-works.md).

## Descripción general de la API de Amazon Rekognition Video
<a name="video-api-overview"></a>

Amazon Rekognition Video procesa un vídeo que está almacenado en un bucket de Amazon S3. El patrón de diseño es un conjunto asíncrono de operaciones. El análisis de vídeo comienza llamando a una operación `Start` como, por ejemplo, [StartLabelDetection](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_StartLabelDetection.html). El estado de finalización de la solicitud se publica en un tema de Amazon Simple Notification Service (Amazon SNS). Para obtener el estado de finalización del tema Amazon SNS, puede utilizar una cola del Amazon Simple Queue Service (Amazon SQS) o una función. AWS Lambda Una vez que disponga del estado de realización, llame a una operación `Get`, como [GetLabelDetection](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_GetLabelDetection.html), para obtener los resultados de la solicitud. 

En el siguiente diagrama se muestra el proceso para detectar etiquetas en un vídeo que está almacenado en un bucket de Amazon S3. En el diagrama, una cola de Amazon SQS obtiene el estado de realización a partir del tema de Amazon SNS. Como alternativa, puede utilizar una función. AWS Lambda 

![\[Diagrama de flujo que muestra los pasos para el análisis de vídeo con Amazon Rekognition Video, Amazon SNS y Amazon SQS, con StartLabelDetection componentes GetLabelDetection como el estado de finalización de la tarea y la publicación en las colas respectivas.\]](http://docs.aws.amazon.com/es_es/rekognition/latest/dg/images/VideoRekognition.png)


El proceso es el mismo para otras operaciones de Amazon Rekognition Video. La siguiente tabla muestra las operaciones `Start` y `Get` para cada una de las operaciones Amazon Rekognition sin almacenamiento.


| Detección | Operación START | Operación GET | 
| --- | --- | --- | 
|  Segmentos de vídeo  |  [StartSegmentDetection](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_StartSegmentDetection.html)  |  [GetSegmentDetection](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_GetSegmentDetection.html)  | 
|  Etiquetas  |  [StartLabelDetection](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_StartLabelDetection.html)  |  [GetLabelDetection](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_GetLabelDetection.html)  | 
|  Contenido para adultos explícito o insinuante  |  [StartContentModeration](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_StartContentModeration.html)  |  [GetContentModeration](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_GetContentModeration.html)  | 
|  Texto  |  [StartTextDetection](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_StartTextDetection.html)  |  [GetTextDetection](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_GetTextDetection.html)  | 
|  Famosos  |  [StartCelebrityRecognition](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_StartCelebrityRecognition.html)  |  [GetCelebrityRecognition](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_GetCelebrityRecognition.html)  | 
|  Rostros  |  [StartFaceDetection](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_StartFaceDetection.html)  |  [GetFaceDetection](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_GetFaceDetection.html)  | 
|  People  |  [StartPersonTracking](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_StartPersonTracking.html)  |  [GetPersonTracking](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_GetPersonTracking.html)  | 

Para operaciones `Get` distintas de `GetCelebrityRecognition`, Amazon Rekognition Video devuelve información de seguimiento para cuando se detectan entidades a lo largo del vídeo de entrada.

Para obtener más información sobre el uso de Amazon Rekognition Video, consulte [Cómo llamar a las operaciones de Amazon Rekognition Video](api-video.md). Para ver un ejemplo que realiza análisis de vídeo mediante la utilización de Amazon SQS, consulte [Análisis de un vídeo almacenado en un bucket de Amazon S3 con Java o Python (SDK)](video-analyzing-with-sqs.md). [Analizar un vídeo con el AWS Command Line Interface](video-cli-commands.md)Para ver algunos ejemplos, consulte. AWS CLI 

### Formatos de vídeo y almacenamiento
<a name="video-storage-formats"></a>

Las operaciones de Amazon Rekognition pueden analizar vídeos que están almacenados en buckets de Amazon S3. Para obtener una lista de todos los límites de la operación de análisis de vídeo, consulte [Directrices y cuotas en Amazon Rekognition](limits.md).

El vídeo se debe codificar utilizando el códec H.264. Los formatos de archivo admitidos son MPEG-4 y MOV. 

Un códec es un software o hardware que comprime datos para una entrega más rápida y descomprime los datos recibidos a su forma original. El códec H.264 suele utilizarse habitualmente para grabar, comprimir y distribuir contenido de vídeo. Un formato de archivo de vídeo puede contener uno o varios códecs. Si su archivo de vídeo de formato MOV o MPEG-4 no funciona con Amazon Rekognition Video, compruebe que el códec utilizado para cifrar el vídeo sea H.264. 

Cualquier API de Amazon Rekognition Video que analice datos de audio solo admite códecs de audio AAC.

El tamaño de archivo máximo para un vídeo almacenado es de 10 GB.

### Búsqueda de personas
<a name="video-searching-persons-overview"></a>

Puede utilizar metadatos faciales que están almacenados en una colección para buscar personas en un vídeo. Por ejemplo, puede buscar en un vídeo archivado a una persona concreta o a varias personas. Puede almacenar los metadatos faciales desde imágenes de origen en una colección utilizando la operación [IndexFaces](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_IndexFaces.html). A continuación, puede utilizar [StartFaceSearch](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_StartFaceSearch.html) para comenzar a buscar asíncronamente rostros en la colección. Puede utilizar [GetFaceSearch](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_GeFaceSearch.html) para obtener los resultados de la búsqueda. Para obtener más información, consulte [Búsqueda de rostros en vídeos almacenados](procedure-person-search-videos.md). La búsqueda de personas es un ejemplo de operación de Amazon Rekognition basada en almacenamiento. Para obtener más información, consulte [Operaciones de API con almacenamiento](how-it-works-storage-non-storage.md#how-it-works-storage-based).

También puede buscar personas en un vídeo en streaming. Para obtener más información, consulte [Trabajar con eventos de vídeo en streaming](streaming-video.md).

# Cómo llamar a las operaciones de Amazon Rekognition Video
<a name="api-video"></a>

Amazon Rekognition Video es una API asincrónica que puede utilizar para analizar vídeos almacenados en un bucket de Amazon Simple Storage Service (Amazon S3). Para iniciar el análisis de un vídeo, llame a una operación de Amazon Rekognition `Start` Video, como. [StartPersonTracking](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_StartPersonTracking.html) Amazon Rekognition Video publica el resultado de la solicitud de análisis en un tema de Amazon Simple Notification Service (Amazon SNS). Puede utilizar una cola del Amazon Simple Queue Service (Amazon SQS) o AWS Lambda una función para obtener el estado de finalización de la solicitud de análisis de vídeo del tema Amazon SNS. Por último, puede obtener los resultados de la solicitud de análisis de vídeo llamando a una operación de Amazon Rekognition`Get`, como. [GetPersonTracking](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_GetPersonTracking.html) 

La información en las secciones siguientes utiliza las operaciones de detección de etiquetas para mostrar cómo detecta Amazon Rekognition Video etiquetas (objetos, eventos, conceptos y actividades) en un vídeo que está almacenado en un bucket de Amazon S3. El mismo enfoque funciona para las demás operaciones de Amazon Rekognition Video, por ejemplo, y. [StartFaceDetection[StartPersonTracking](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_StartPersonTracking.html)](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_StartFaceDetection.html) El ejemplo [Análisis de un vídeo almacenado en un bucket de Amazon S3 con Java o Python (SDK)](video-analyzing-with-sqs.md) muestra cómo analizar un vídeo mediante el uso de una cola de Amazon SQS para obtener el estado de la realización a partir del tema de Amazon SNS. También se utiliza como base para otros ejemplos de Amazon Rekognition Video, como [Recorridos de las personas](persons.md). Para ver ejemplos, consulte. AWS CLI [Analizar un vídeo con el AWS Command Line Interface](video-cli-commands.md)

**Topics**
+ [Comenzar el análisis de vídeo](#api-video-start)
+ [Obtención del estado de realización de una solicitud de análisis de Amazon Rekognition Video](#api-video-get-status)
+ [Obtención de los resultados del análisis de Amazon Rekognition Video](#api-video-get)

## Comenzar el análisis de vídeo
<a name="api-video-start"></a>

Para iniciar una solicitud de detección de etiquetas de Amazon Rekognition Video, debe llamar. [StartLabelDetection](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_StartLabelDetection.html) El siguiente es un ejemplo de una solicitud JSON que ha transferido `StartLabelDetection`.

```
{
    "Video": {
        "S3Object": {
            "Bucket": "amzn-s3-demo-bucket",
            "Name": "video.mp4"
        }
    },
    "ClientRequestToken": "LabelDetectionToken",
    "MinConfidence": 50,
    "NotificationChannel": {
        "SNSTopicArn": "arn:aws:sns:us-east-1:nnnnnnnnnn:topic",
        "RoleArn": "arn:aws:iam::nnnnnnnnnn:role/roleopic"
    },
    "JobTag": "DetectingLabels"
}
```

El parámetro de entrada `Video` proporciona el nombre del archivo de vídeo y el bucket de Amazon S3 desde el que recuperarlo. `NotificationChannel` contiene el Nombre de recurso de Amazon (ARN) del tema de Amazon SNS al que Amazon Rekognition Video notifica cuando finaliza la solicitud de análisis de vídeo. El tema de Amazon SNS debe estar en la misma región de AWS que el punto de conexión de Amazon Rekognition Video al que está llamando. `NotificationChannel` también contiene el ARN de un rol que permite a Amazon Rekognition Video publicar en el tema de Amazon SNS. Puede conceder permisos de publicación a Amazon Rekognition a sus temas de creando un rol de servicio de IAM. Para obtener más información, consulte [Configuración de Amazon Rekognition Video](api-video-roles.md).

También puede especificar un parámetro de entrada opcional, `JobTag`, que le permite identificar el trabajo en el estado de realización que se ha publicado en el tema de Amazon SNS. 

Para evitar la duplicación accidental de trabajos de análisis, tiene la opción de proporcionar un token idempotente, `ClientRequestToken`. Si proporciona un valor para `ClientRequestToken`, la operación `Start` devuelve el mismo `JobId` para varias llamadas idénticas a la operación de inicio, como por ejemplo `StartLabelDetection`. Un token `ClientRequestToken` tiene una vida útil de 7 días. Después de 7 días, puede volver a utilizarla. Si reutiliza el token durante el ciclo de vida del token, sucede lo siguiente: 
+ Si reutiliza el token con la misma operación `Start` y los mismos parámetros de entrada, se devuelve el mismo `JobId`. El trabajo no se vuelve a realizar de nuevo y Amazon Rekognition Video no envía un estado de realización al tema de Amazon SNS registrado.
+ Si vuelve a utilizar el token con la misma operación `Start` y un cambio de parámetro de entrada menor, obtendrá una excepción `IdempotentParameterMismatchException` (código de estado HTTP: 400).
+ No debe reutilizar un token con diferentes operaciones `Start`, ya que obtendrá resultados impredecibles en Amazon Rekognition.

La respuesta a la operación `StartLabelDetection` es un identificador de trabajo (`JobId`). Utilice `JobId` para realizar un seguimiento de las solicitudes y obtener los resultados de análisis después de que Amazon Rekognition Video haya publicado el estado de realización en el tema de Amazon SNS. Por ejemplo:

```
{"JobId":"270c1cc5e1d0ea2fbc59d97cb69a72a5495da75851976b14a1784ca90fc180e3"}
```

Si inicia demasiados trabajos al mismo tiempo, las llamadas a `StartLabelDetection` producen una excepción `LimitExceededException` (código de estado HTTP: 400) hasta que el número de trabajos ejecutados simultáneamente se encuentre por debajo del límite de servicio de Amazon Rekognition. 

Si descubre que las excepciones `LimitExceededException` se producen con picos de actividad, considere la posibilidad de usar una cola de Amazon SQS para administrar las solicitudes entrantes. Póngase en contacto con el servicio de AWS asistencia si descubre que una cola de Amazon SQS no puede gestionar su número medio de solicitudes simultáneas y sigue recibiendo excepciones. `LimitExceededException` 

## Obtención del estado de realización de una solicitud de análisis de Amazon Rekognition Video
<a name="api-video-get-status"></a>

Amazon Rekognition Video envía una notificación a la realización de análisis al tema de Amazon SNS registrado. La notificación incluye el identificador de trabajo y el estado de realización de la operación en una cadena de JSON. Una solicitud de análisis de vídeo correcta tiene un estado `SUCCEEDED`. Por ejemplo, el siguiente resultado muestra el procesamiento correcto de un trabajo de detección de etiqueta.

```
{
    "JobId": "270c1cc5e1d0ea2fbc59d97cb69a72a5495da75851976b14a1nnnnnnnnnnnn",
    "Status": "SUCCEEDED",
    "API": "StartLabelDetection",
    "JobTag": "DetectingLabels",
    "Timestamp": 1510865364756,
    "Video": {
        "S3ObjectName": "video.mp4",
        "S3Bucket": "amzn-s3-demo-bucket"
    }
}
```

Para obtener más información, consulte [Referencia: notificación de resultados de análisis de vídeo](video-notification-payload.md).

Para obtener la información de estado que Amazon Rekognition Video ha publicado en el tema de Amazon SNS, utilice una de las siguientes opciones:
+ **AWS Lambda**: puede suscribir una función de AWS Lambda que escriba en un tema de Amazon SNS. Se llama a la función cuando Amazon Rekognition notifica al tema de Amazon SNS que la solicitud se ha completado. Utilice una función de Lambda si desea que el código del servidor procese los resultados de una solicitud de análisis de vídeo. Por ejemplo, es posible que desee utilizar el código del servidor para anotar el vídeo o crear un informe sobre el contenido de vídeo antes de devolver la información a una aplicación cliente. También le recomendamos el procesamiento del lado del servidor de vídeos grandes, ya que la API de Amazon Rekognition podría devolver grandes volúmenes de datos. 
+ **Amazon Simple Queue Service**: puede suscribir una cola de Amazon SQS a un tema de Amazon SNS. A continuación, sondee la cola de Amazon SQS para recuperar el estado de realización que ha publicado Amazon Rekognition cuando se completa una solicitud de análisis de vídeo. Para obtener más información, consulte [Análisis de un vídeo almacenado en un bucket de Amazon S3 con Java o Python (SDK)](video-analyzing-with-sqs.md). Utilice una cola de Amazon SQS si desea llamar a operaciones de Amazon Rekognition Video solo desde una aplicación cliente. 

**importante**  
No le recomendamos obtener el estado de realización de solicitud llamando repetidamente a la operación `Get` de Amazon Rekognition Video. Esto se debe a que Amazon Rekognition Video limita la operación `Get` si se realizan demasiadas solicitudes. Si está procesando varios vídeos simultáneamente, es más sencillo y más eficaz monitorear una cola de SQS para la notificación de realización que sondear Amazon Rekognition Video para detectar el estado de cada vídeo individualmente.

## Obtención de los resultados del análisis de Amazon Rekognition Video
<a name="api-video-get"></a>

 Para obtener los resultados de una solicitud de análisis de vídeo, en primer lugar, asegúrese de que el estado de realización que se ha recuperado del tema de Amazon SNS es `SUCCEEDED`. A continuación, llame a `GetLabelDetection`, que transfiere el valor `JobId` que se devuelve desde `StartLabelDetection`. El JSON de la solicitud es similar al siguiente ejemplo:

```
{
    "JobId": "270c1cc5e1d0ea2fbc59d97cb69a72a5495da75851976b14a1784ca90fc180e3",
    "MaxResults": 10,
    "SortBy": "TIMESTAMP"
}
```

JobId es el identificador de la operación de análisis de vídeo. Dado que el análisis de vídeo puede generar grandes cantidades de datos, utilice `MaxResults` para especificar el número máximo de resultados que debe devolver en una sola operación GET. El valor predeterminado de `MaxResults` es 1000. Si especifica un valor superior a 1 000, se devolverá un máximo de 1 000 resultados. Si la operación no devuelve todo el conjunto de resultados, se devuelve un token de paginación para la página siguiente en la respuesta de operación. Si tiene un token de paginación de una solicitud GET anterior, utilícelo con `NextToken` para obtener la siguiente página de resultados.

**nota**  
Amazon Rekognition retiene los resultados de una operación de análisis de vídeo durante siete días. No podrá recuperar los resultados del análisis transcurrido este plazo.

El JSON de respuesta de la operación `GetLabelDetection` es similar al siguiente:

```
{
    "Labels": [
        {
            "Timestamp": 0,
            "Label": {
                "Instances": [],
                "Confidence": 60.51791763305664,
                "Parents": [],
                "Name": "Electronics"
            }
        },
        {
            "Timestamp": 0,
            "Label": {
                "Instances": [],
                "Confidence": 99.53411102294922,
                "Parents": [],
                "Name": "Human"
            }
        },
        {
            "Timestamp": 0,
            "Label": {
                "Instances": [
                    {
                        "BoundingBox": {
                            "Width": 0.11109819263219833,
                            "Top": 0.08098889887332916,
                            "Left": 0.8881205320358276,
                            "Height": 0.9073750972747803
                        },
                        "Confidence": 99.5831298828125
                    },
                    {
                        "BoundingBox": {
                            "Width": 0.1268676072359085,
                            "Top": 0.14018426835536957,
                            "Left": 0.0003282368124928324,
                            "Height": 0.7993982434272766
                        },
                        "Confidence": 99.46029663085938
                    }
                ],
                "Confidence": 99.53411102294922,
                "Parents": [],
                "Name": "Person"
            }
        },
        .
        .   
        .

        {
            "Timestamp": 166,
            "Label": {
                "Instances": [],
                "Confidence": 73.6471176147461,
                "Parents": [
                    {
                        "Name": "Clothing"
                    }
                ],
                "Name": "Sleeve"
            }
        }
        
    ],
    "LabelModelVersion": "2.0",
    "JobStatus": "SUCCEEDED",
    "VideoMetadata": {
        "Format": "QuickTime / MOV",
        "FrameRate": 23.976024627685547,
        "Codec": "h264",
        "DurationMillis": 5005,
        "FrameHeight": 674,
        "FrameWidth": 1280
    }
}
```

Las operaciones `GetLabelDetection` y `GetContentModeration` le permiten ordenar los resultados del análisis por marca de tiempo o por nombre de etiqueta. También puede agregar los resultados por segmento de vídeo o por marca de tiempo. 

Puede ordenar los resultados por hora de detección (milisegundos desde el comienzo del vídeo) o alfabéticamente por la entidad detectada (objeto, rostro, famoso, etiqueta de moderación o persona). Para ordenar por tiempo, establezca el valor del parámetro de entrada `SortBy` en `TIMESTAMP`. Si no se especifica `SortBy`, el comportamiento predeterminado se ordena por tiempo. El ejemplo anterior está ordenado por tiempo. Para ordenar por entidad, utilice el parámetro de entrada `SortBy` con el valor que es adecuado para la operación que está realizando. Por ejemplo, para ordenar por etiqueta detectada en una llamada a `GetLabelDetection`, utilice el valor `NAME`.

Para agregar los resultados por marca de tiempo, defina el valor del parámetro `AggregateBy` en `TIMESTAMPS`. Para agregar por segmento de vídeo, defina el valor de `AggregateBy` en `SEGMENTS`. El modo de agregación de `SEGMENTS` agregará las etiquetas a lo largo del tiempo y `TIMESTAMPS` mostrará la marca temporal en la que se detectó una etiqueta, utilizando un muestreo de 2 FPS y una salida por fotograma (Nota: Esta frecuencia de muestreo actual está sujeta a cambios, por lo que no se deben hacer suposiciones sobre la frecuencia de muestreo actual). Si no se especifica ningún valor, el método de agregación predeterminado es `TIMESTAMPS`. 

# Configuración de Amazon Rekognition Video
<a name="api-video-roles"></a>

Para utilizar la API de Amazon Rekognition Video con vídeos almacenados, debe configurar el usuario y un rol de servicio de IAM para que puedan tener acceso a los temas de Amazon SNS. También tiene que suscribir una cola de Amazon SQS a los temas de Amazon SNS. 

**nota**  
Si utiliza estas instrucciones para configurar el ejemplo de [Análisis de un vídeo almacenado en un bucket de Amazon S3 con Java o Python (SDK)](video-analyzing-with-sqs.md), no es necesario que realice los pasos 3, 4, 5 y 6. El ejemplo contiene código que permite crear y configurar el tema de Amazon SNS y la cola de Amazon SQS.

Los ejemplos de esta sección crean un tema de Amazon SNS nuevo siguiendo las instrucciones que conceden a Amazon Rekognition Video acceso a varios temas. Si desea utilizar un tema de Amazon SNS existente, utilice [Otorgar acceso a un tema de Amazon SNS existente](#api-video-roles-single-topics) en el paso 3.<a name="configure-rekvid-procedure"></a>

**Para configurar Amazon Rekognition Video**

1. Configure una AWS cuenta para acceder a Amazon Rekognition Video. Para obtener más información, consulte [Paso 1: Configurar una cuenta de AWS y crear un usuario](setting-up.md).

1. Instale y configure el SDK necesario. AWS Para obtener más información, consulte [Paso 2: Configure y AWS CLI AWS SDKs](setup-awscli-sdk.md). 

1. Para ejecutar los ejemplos de código de esta guía para desarrolladores, asegúrese de que el usuario elegido tenga acceso mediante programación. Para obtener más información, consulte [Concesión de acceso programático](sdk-programmatic-access.md).

   El usuario también necesita al menos los siguientes permisos:
   + Amazon SQSFull Access
   + AmazonRekognitionFullAccess
   + Amazon S3 FullAccess
   + Amazon SNSFull Access

   Si utiliza el Centro de identidades de IAM para autenticarse, añada los permisos al conjunto de permisos de su rol; de lo contrario, añada los permisos a su rol de IAM.

1. [Cree un tema de Amazon SNS](https://docs.aws.amazon.com/sns/latest/dg/CreateTopic.html) utilizando la [consola de Amazon SNS](https://console.aws.amazon.com/sns/v2/home). Añada al nombre del tema un prefijo. *AmazonRekognition* Anote el nombre de recurso de Amazon (ARN) del tema. Asegúrese de que el tema está situado en la misma región que el punto de conexión de AWS que está utilizando.

1. [Cree una cola estándar de Amazon SQS](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-create-queue.html) mediante la [consola de Amazon SQS](https://console.aws.amazon.com/sqs/). Anote el ARN de la cola.

1. [Suscriba la cola al tema](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-subscribe-queue-sns-topic.html) que creó en el paso 3.

1. [Conceda permiso al tema de Amazon SNS y enviar mensajes a la cola de Amazon SQS](https://docs.aws.amazon.com/sns/latest/dg/SendMessageToSQS.html#SendMessageToSQS.sqs.permissions).

1. Cree un rol de servicio de IAM para otorgar a Amazon Rekognition Video acceso a sus temas de Amazon SNS. Anote el nombre de recurso de Amazon (ARN) del rol de servicio. Para obtener más información, consulte [Otorgar acceso a varios temas de Amazon SNS](#api-video-roles-all-topics).

1. Para garantizar que su cuenta esté segura, querrá limitar el alcance del acceso de Rekognition solo a los recursos que esté utilizando. Para ello, puede adjuntar una política de confianza a su rol de servicio de IAM. Para obtener información sobre cómo hacerlo, consulte [Prevención de la sustitución confusa entre servicios](cross-service-confused-deputy-prevention.md).

1. [ Añada la siguiente política insertada](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html#embed-inline-policy-console) al usuario que ha creado en el paso 1: 

   Asigne a la política insertada un nombre de su elección.

1. Si utilizas una AWS Key Management Service clave gestionada por el cliente para cifrar los vídeos de tu bucket de Amazon S3, [añade](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-modifying.html#key-policy-modifying-how-to-console-policy-view) permisos a la clave para que el rol de servicio que creaste en el paso 7 descifre los vídeos. Como mínimo, el rol de servicio necesita permisos para las acciones `kms:GenerateDataKey` y `kms:Decrypt`. Por ejemplo:

   ```
   {
       "Sid": "Decrypt only",
       "Effect": "Allow",
       "Principal": {
           "AWS": "arn:aws:iam::111122223333:user/user from step 1"
       },
       "Action": [
           "kms:Decrypt",
           "kms:GenerateDataKey"
       ],
       "Resource": "*"
   }
   ```

   Para obtener más información, consulte [Mi bucket de Amazon S3 tiene un cifrado predeterminado mediante una clave de AWS KMS personalizada. ¿Cómo puedo permitir que los usuarios realicen operaciones de carga y descarga en el bucket?](https://aws.amazon.com/premiumsupport/knowledge-center/s3-bucket-access-default-encryption/) y [Protección de los datos con el cifrado del lado del servidor con claves de KMS almacenadas en AWS Key Management Service (SSE-KMS](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html)). 

1. Ahora puede ejecutar los ejemplos de [Análisis de un vídeo almacenado en un bucket de Amazon S3 con Java o Python (SDK)](video-analyzing-with-sqs.md) y [Analizar un vídeo con el AWS Command Line Interface](video-cli-commands.md).

## Otorgar acceso a varios temas de Amazon SNS
<a name="api-video-roles-all-topics"></a>

Use un rol de servicio de IAM para otorgar a Amazon Rekognition Video acceso a los temas de Amazon SNS que cree. IAM proporciona el caso de uso *Rekognition* para la creación de un rol de servicio de Amazon Rekognition Video.

Puede conceder a Amazon Rekognition Video acceso a varios temas de Amazon SNS utilizando la política de permisos y anteponiendo los nombres de `AmazonRekognitionServiceRole` los temas con —por ejemplo,. *AmazonRekognition*`AmazonRekognitionMyTopicName` 

**Para dar acceso a Amazon Rekognition Video a varios temas de Amazon SNS**

1. [Cree un rol de servicio de IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html?icmpid=docs_iam_console). Utilice la siguiente información para crear el rol de servicio de IAM:

   1. Elija **Rekognition** para el nombre del servicio.

   1. Elija **Rekognition** para el caso de uso del rol de servicio. Debería ver la política de permisos en la lista. **AmazonRekognitionServiceRole** **AmazonRekognitionServiceRole**permite a Amazon Rekognition Video acceder a los temas de Amazon SNS con el prefijo. *AmazonRekognition*

   1. Asigne al rol de servicio un nombre de su elección.

1. Anote el ARN del rol de servicio. Lo necesita para comenzar las operaciones de análisis de vídeo.

## Otorgar acceso a un tema de Amazon SNS existente
<a name="api-video-roles-single-topics"></a>

Puede crear una política de permisos que permita a Amazon Rekognition Video acceder a un tema de Amazon SNS.

**Para dar acceso a Amazon Rekognition Video a un tema de Amazon SNS existente**

1. [ Cree una nueva política de permisos con el editor de políticas de JSON de IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html#access_policies_create-json-editor) y utilice la política siguiente. Reemplace `topicarn` por el nombre de recurso de Amazon (ARN) del tema de Amazon SNS deseado.

1. [Cree un rol de servicio de IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html?icmpid=docs_iam_console) o actualice un rol de servicio de IAM existente. Utilice la siguiente información para crear el rol de servicio de IAM:

   1. Elija **Rekognition** para el nombre del servicio.

   1. Elija **Rekognition** para el caso de uso del rol de servicio.

   1. Adjunte la política de permisos que ha creado en el paso 1.

1. Anote el ARN del rol de servicio. Lo necesita para comenzar las operaciones de análisis de vídeo.

# Análisis de un vídeo almacenado en un bucket de Amazon S3 con Java o Python (SDK)
<a name="video-analyzing-with-sqs"></a>

Este procedimiento muestra cómo detectar etiquetas en un vídeo mediante la utilización de las operaciones de detección de etiquetas de Amazon Rekognition Video, un vídeo almacenado en un bucket de Amazon S3 y un tema de Amazon SNS. El procedimiento también muestra cómo utilizar una cola de Amazon SQS para obtener el estado de realización del tema de Amazon SNS. Para obtener más información, consulte [Cómo llamar a las operaciones de Amazon Rekognition Video](api-video.md). No está limitado a la utilización de una cola de Amazon SQS: Por ejemplo, puede usar una AWS Lambda función para obtener el estado de finalización. Para obtener más información, consulte [Invocación de funciones Lambda mediante notificaciones de Amazon SNS](https://docs.aws.amazon.com/sns/latest/dg/sns-lambda.html).

En el código de ejemplo de este procedimiento, se explica cómo hacer lo siguiente:

1. Cree el tema de Amazon SNS.

1. Cree la cola de Amazon SQS.

1. Dar a Amazon Rekognition Video permiso para publicar el estado de realización de una operación de análisis de vídeo en el tema de Amazon SNS.

1. Suscriba la cola de Amazon SQS al tema de Amazon SNS.

1. Inicie la solicitud de análisis de vídeo llamando a [StartLabelDetection](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_StartLabelDetection.html). 

1. Obtenga el estado de realización a partir de la cola de Amazon SQS. En el ejemplo se hace un seguimiento del identificador de trabajo (`JobId`) que devuelve `StartLabelDetection` y solo obtiene los resultados de identificadores de trabajo coincidentes que se leen desde el estado de realización. Se trata de un aspecto importante si otras aplicaciones están utilizando la misma cola y tema. Para simplificar, en el ejemplo se eliminan los trabajos que no coinciden. Plantéese añadirlos a una cola de mensajes fallidos de Amazon SQS para examinarlos posteriormente.

1. Obtenga y muestre los resultados del análisis de vídeo llamando a [GetLabelDetection](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_GetLabelDetection.html).

## Requisitos previos
<a name="video-prerequisites"></a>

El código de ejemplo de este procedimiento se proporciona en Java y Python. Debe tener instalado el AWS SDK correspondiente. Para obtener más información, consulte [Introducción a Amazon Rekognition](getting-started.md). La cuenta de AWS que utilice debe tener permisos de acceso a la API de Amazon Rekognition. Para obtener más información, consulte [Acciones definidas por Amazon Rekognition](https://docs.aws.amazon.com/IAM/latest/UserGuide/list_amazonrekognition.html#amazonrekognition-actions-as-permissions). 

**Para detectar etiquetas en un vídeo**

1. Configure el acceso de los usuarios a Amazon Rekognition Video y configure el acceso de Amazon Rekognition Video a Amazon SNS. Para obtener más información, consulte [Configuración de Amazon Rekognition Video](api-video-roles.md). No es necesario realizar los pasos 3, 4, 5 y 6, ya que el código de ejemplo crea y configura el tema de Amazon SNS y la cola de Amazon SQS. 

1. Cargue un archivo de vídeo con formato MOV o MPEG-4 en el bucket de Amazon S3. Para realizar pruebas, cargue un vídeo con una duración inferior a 30 segundos.

   Para ver las instrucciones, consulte [Carga de objetos en Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UploadingObjectsintoAmazonS3.html) en la *Guía del usuario de Amazon Simple Storage Service*.

   

1. Utilice los siguientes ejemplos de código para detectar etiquetas en un vídeo. 

------
#### [ Java ]

   En la función `main`:
   + reemplace `roleArn` por el ARN del rol de servicio de IAM que creó en el paso 7 de [Para configurar Amazon Rekognition Video](api-video-roles.md#configure-rekvid-procedure).
   + Reemplace los valores de `amzn-s3-demo-bucket` y `video` por el bucket y el nombre del archivo de vídeo que especificó en el paso 2. 

   ```
   //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.)
   
   package com.amazonaws.samples;
   import com.amazonaws.auth.policy.Policy;
   import com.amazonaws.auth.policy.Condition;
   import com.amazonaws.auth.policy.Principal;
   import com.amazonaws.auth.policy.Resource;
   import com.amazonaws.auth.policy.Statement;
   import com.amazonaws.auth.policy.Statement.Effect;
   import com.amazonaws.auth.policy.actions.SQSActions;
   import com.amazonaws.services.rekognition.AmazonRekognition;
   import com.amazonaws.services.rekognition.AmazonRekognitionClientBuilder;
   import com.amazonaws.services.rekognition.model.CelebrityDetail;
   import com.amazonaws.services.rekognition.model.CelebrityRecognition;
   import com.amazonaws.services.rekognition.model.CelebrityRecognitionSortBy;
   import com.amazonaws.services.rekognition.model.ContentModerationDetection;
   import com.amazonaws.services.rekognition.model.ContentModerationSortBy;
   import com.amazonaws.services.rekognition.model.Face;
   import com.amazonaws.services.rekognition.model.FaceDetection;
   import com.amazonaws.services.rekognition.model.FaceMatch;
   import com.amazonaws.services.rekognition.model.FaceSearchSortBy;
   import com.amazonaws.services.rekognition.model.GetCelebrityRecognitionRequest;
   import com.amazonaws.services.rekognition.model.GetCelebrityRecognitionResult;
   import com.amazonaws.services.rekognition.model.GetContentModerationRequest;
   import com.amazonaws.services.rekognition.model.GetContentModerationResult;
   import com.amazonaws.services.rekognition.model.GetFaceDetectionRequest;
   import com.amazonaws.services.rekognition.model.GetFaceDetectionResult;
   import com.amazonaws.services.rekognition.model.GetFaceSearchRequest;
   import com.amazonaws.services.rekognition.model.GetFaceSearchResult;
   import com.amazonaws.services.rekognition.model.GetLabelDetectionRequest;
   import com.amazonaws.services.rekognition.model.GetLabelDetectionResult;
   import com.amazonaws.services.rekognition.model.GetPersonTrackingRequest;
   import com.amazonaws.services.rekognition.model.GetPersonTrackingResult;
   import com.amazonaws.services.rekognition.model.Instance;
   import com.amazonaws.services.rekognition.model.Label;
   import com.amazonaws.services.rekognition.model.LabelDetection;
   import com.amazonaws.services.rekognition.model.LabelDetectionSortBy;
   import com.amazonaws.services.rekognition.model.NotificationChannel;
   import com.amazonaws.services.rekognition.model.Parent;
   import com.amazonaws.services.rekognition.model.PersonDetection;
   import com.amazonaws.services.rekognition.model.PersonMatch;
   import com.amazonaws.services.rekognition.model.PersonTrackingSortBy;
   import com.amazonaws.services.rekognition.model.S3Object;
   import com.amazonaws.services.rekognition.model.StartCelebrityRecognitionRequest;
   import com.amazonaws.services.rekognition.model.StartCelebrityRecognitionResult;
   import com.amazonaws.services.rekognition.model.StartContentModerationRequest;
   import com.amazonaws.services.rekognition.model.StartContentModerationResult;
   import com.amazonaws.services.rekognition.model.StartFaceDetectionRequest;
   import com.amazonaws.services.rekognition.model.StartFaceDetectionResult;
   import com.amazonaws.services.rekognition.model.StartFaceSearchRequest;
   import com.amazonaws.services.rekognition.model.StartFaceSearchResult;
   import com.amazonaws.services.rekognition.model.StartLabelDetectionRequest;
   import com.amazonaws.services.rekognition.model.StartLabelDetectionResult;
   import com.amazonaws.services.rekognition.model.StartPersonTrackingRequest;
   import com.amazonaws.services.rekognition.model.StartPersonTrackingResult;
   import com.amazonaws.services.rekognition.model.Video;
   import com.amazonaws.services.rekognition.model.VideoMetadata;
   import com.amazonaws.services.sns.AmazonSNS;
   import com.amazonaws.services.sns.AmazonSNSClientBuilder;
   import com.amazonaws.services.sns.model.CreateTopicRequest;
   import com.amazonaws.services.sns.model.CreateTopicResult;
   import com.amazonaws.services.sqs.AmazonSQS;
   import com.amazonaws.services.sqs.AmazonSQSClientBuilder;
   import com.amazonaws.services.sqs.model.CreateQueueRequest;
   import com.amazonaws.services.sqs.model.Message;
   import com.amazonaws.services.sqs.model.QueueAttributeName;
   import com.amazonaws.services.sqs.model.SetQueueAttributesRequest;
   import com.fasterxml.jackson.databind.JsonNode;
   import com.fasterxml.jackson.databind.ObjectMapper;
   import java.util.*;
   
   public class VideoDetect {
    
       
       private static String sqsQueueName=null;
       private static String snsTopicName=null;
       private static String snsTopicArn = null;
       private static String roleArn= null;
       private static String sqsQueueUrl = null;
       private static String sqsQueueArn = null;
       private static String startJobId = null;
       private static String bucket = null;
       private static String video = null; 
       private static AmazonSQS sqs=null;
       private static AmazonSNS sns=null;
       private static AmazonRekognition rek = null;
       
       private static NotificationChannel channel= new NotificationChannel()
               .withSNSTopicArn(snsTopicArn)
               .withRoleArn(roleArn);
   
   
       public static void main(String[] args) throws Exception {
           
           video = "";
           bucket = "";
           roleArn= "";
   
           sns = AmazonSNSClientBuilder.defaultClient();
           sqs= AmazonSQSClientBuilder.defaultClient();
           rek = AmazonRekognitionClientBuilder.defaultClient();
     
           CreateTopicandQueue();
           
           //=================================================
           
           StartLabelDetection(bucket, video);
   
           if (GetSQSMessageSuccess()==true)
           	GetLabelDetectionResults();
           
          //=================================================  
           
   
           DeleteTopicandQueue();
           System.out.println("Done!");
          
       }
   
       
       static boolean GetSQSMessageSuccess() throws Exception
       {
       	boolean success=false;
   
      
           System.out.println("Waiting for job: " + startJobId);
           //Poll queue for messages
           List<Message> messages=null;
           int dotLine=0;
           boolean jobFound=false;
   
           //loop until the job status is published. Ignore other messages in queue.
           do{
               messages = sqs.receiveMessage(sqsQueueUrl).getMessages();
               if (dotLine++<40){
                   System.out.print(".");
               }else{
                   System.out.println();
                   dotLine=0;
               }
   
               if (!messages.isEmpty()) {
                   //Loop through messages received.
                   for (Message message: messages) {
                       String notification = message.getBody();
   
                       // Get status and job id from notification.
                       ObjectMapper mapper = new ObjectMapper();
                       JsonNode jsonMessageTree = mapper.readTree(notification);
                       JsonNode messageBodyText = jsonMessageTree.get("Message");
                       ObjectMapper operationResultMapper = new ObjectMapper();
                       JsonNode jsonResultTree = operationResultMapper.readTree(messageBodyText.textValue());
                       JsonNode operationJobId = jsonResultTree.get("JobId");
                       JsonNode operationStatus = jsonResultTree.get("Status");
                       System.out.println("Job found was " + operationJobId);
                       // Found job. Get the results and display.
                       if(operationJobId.asText().equals(startJobId)){
                           jobFound=true;
                           System.out.println("Job id: " + operationJobId );
                           System.out.println("Status : " + operationStatus.toString());
                           if (operationStatus.asText().equals("SUCCEEDED")){
                           	success=true;
                           }
                           else{
                               System.out.println("Video analysis failed");
                           }
   
                           sqs.deleteMessage(sqsQueueUrl,message.getReceiptHandle());
                       }
   
                       else{
                           System.out.println("Job received was not job " +  startJobId);
                           //Delete unknown message. Consider moving message to dead letter queue
                           sqs.deleteMessage(sqsQueueUrl,message.getReceiptHandle());
                       }
                   }
               }
               else {
                   Thread.sleep(5000);
               }
           } while (!jobFound);
   
           System.out.println("Finished processing video");
           return success;
       }
     
   
       private static void StartLabelDetection(String bucket, String video) throws Exception{
       	
           NotificationChannel channel= new NotificationChannel()
                   .withSNSTopicArn(snsTopicArn)
                   .withRoleArn(roleArn);
   
   
           StartLabelDetectionRequest req = new StartLabelDetectionRequest()
                   .withVideo(new Video()
                           .withS3Object(new S3Object()
                                   .withBucket(bucket)
                                   .withName(video)))
                   .withMinConfidence(50F)
                   .withJobTag("DetectingLabels")
                   .withNotificationChannel(channel);
   
           StartLabelDetectionResult startLabelDetectionResult = rek.startLabelDetection(req);
           startJobId=startLabelDetectionResult.getJobId();
           
       }
     
       private static void GetLabelDetectionResults() throws Exception{
   
           int maxResults=10;
           String paginationToken=null;
           GetLabelDetectionResult labelDetectionResult=null;
   
           do {
               if (labelDetectionResult !=null){
                   paginationToken = labelDetectionResult.getNextToken();
               }
   
               GetLabelDetectionRequest labelDetectionRequest= new GetLabelDetectionRequest()
                       .withJobId(startJobId)
                       .withSortBy(LabelDetectionSortBy.TIMESTAMP)
                       .withMaxResults(maxResults)
                       .withNextToken(paginationToken);
   
   
               labelDetectionResult = rek.getLabelDetection(labelDetectionRequest);
   
               VideoMetadata videoMetaData=labelDetectionResult.getVideoMetadata();
   
               System.out.println("Format: " + videoMetaData.getFormat());
               System.out.println("Codec: " + videoMetaData.getCodec());
               System.out.println("Duration: " + videoMetaData.getDurationMillis());
               System.out.println("FrameRate: " + videoMetaData.getFrameRate());
   
   
               //Show labels, confidence and detection times
               List<LabelDetection> detectedLabels= labelDetectionResult.getLabels();
   
               for (LabelDetection detectedLabel: detectedLabels) {
                   long seconds=detectedLabel.getTimestamp();
                   Label label=detectedLabel.getLabel();
                   System.out.println("Millisecond: " + Long.toString(seconds) + " ");
                   
                   System.out.println("   Label:" + label.getName()); 
                   System.out.println("   Confidence:" + detectedLabel.getLabel().getConfidence().toString());
         
                   List<Instance> instances = label.getInstances();
                   System.out.println("   Instances of " + label.getName());
                   if (instances.isEmpty()) {
                       System.out.println("        " + "None");
                   } else {
                       for (Instance instance : instances) {
                           System.out.println("        Confidence: " + instance.getConfidence().toString());
                           System.out.println("        Bounding box: " + instance.getBoundingBox().toString());
                       }
                   }
                   System.out.println("   Parent labels for " + label.getName() + ":");
                   List<Parent> parents = label.getParents();
                   if (parents.isEmpty()) {
                       System.out.println("        None");
                   } else {
                       for (Parent parent : parents) {
                           System.out.println("        " + parent.getName());
                       }
                   }
                   System.out.println();
               }
           } while (labelDetectionResult !=null && labelDetectionResult.getNextToken() != null);
   
       } 
   
       // Creates an SNS topic and SQS queue. The queue is subscribed to the topic. 
       static void CreateTopicandQueue()
       {
           //create a new SNS topic
           snsTopicName="AmazonRekognitionTopic" + Long.toString(System.currentTimeMillis());
           CreateTopicRequest createTopicRequest = new CreateTopicRequest(snsTopicName);
           CreateTopicResult createTopicResult = sns.createTopic(createTopicRequest);
           snsTopicArn=createTopicResult.getTopicArn();
           
           //Create a new SQS Queue
           sqsQueueName="AmazonRekognitionQueue" + Long.toString(System.currentTimeMillis());
           final CreateQueueRequest createQueueRequest = new CreateQueueRequest(sqsQueueName);
           sqsQueueUrl = sqs.createQueue(createQueueRequest).getQueueUrl();
           sqsQueueArn = sqs.getQueueAttributes(sqsQueueUrl, Arrays.asList("QueueArn")).getAttributes().get("QueueArn");
           
           //Subscribe SQS queue to SNS topic
           String sqsSubscriptionArn = sns.subscribe(snsTopicArn, "sqs", sqsQueueArn).getSubscriptionArn();
           
           // Authorize queue
             Policy policy = new Policy().withStatements(
                     new Statement(Effect.Allow)
                     .withPrincipals(Principal.AllUsers)
                     .withActions(SQSActions.SendMessage)
                     .withResources(new Resource(sqsQueueArn))
                     .withConditions(new Condition().withType("ArnEquals").withConditionKey("aws:SourceArn").withValues(snsTopicArn))
                     );
                     
   
             Map queueAttributes = new HashMap();
             queueAttributes.put(QueueAttributeName.Policy.toString(), policy.toJson());
             sqs.setQueueAttributes(new SetQueueAttributesRequest(sqsQueueUrl, queueAttributes)); 
           
   
            System.out.println("Topic arn: " + snsTopicArn);
            System.out.println("Queue arn: " + sqsQueueArn);
            System.out.println("Queue url: " + sqsQueueUrl);
            System.out.println("Queue sub arn: " + sqsSubscriptionArn );
        }
       static void DeleteTopicandQueue()
       {
           if (sqs !=null) {
               sqs.deleteQueue(sqsQueueUrl);
               System.out.println("SQS queue deleted");
           }
           
           if (sns!=null) {
               sns.deleteTopic(snsTopicArn);
               System.out.println("SNS topic deleted");
           }
       }
   }
   ```

------
#### [ Python ]

   En la función `main`:
   + reemplace `roleArn` por el ARN del rol de servicio de IAM que creó en el paso 7 de [Para configurar Amazon Rekognition Video](api-video-roles.md#configure-rekvid-procedure).
   + Reemplace los valores de `amzn-s3-demo-bucket` y `video` por el bucket y el nombre del archivo de vídeo que especificó en el paso 2. 
   + Sustituya el valor de `profile_name` en la línea que crea la sesión de Rekognition por el nombre de su perfil de desarrollador.
   + También puede incluir criterios de filtrado en el parámetro de configuración. Por ejemplo, puede utilizar un `LabelsInclusionFilter` o un `LabelsExclusionFilter` junto a una lista de los valores deseados. En el código que aparece a continuación, puede eliminar los comentarios de las secciones `Features` y `Settings` y proporcionar sus propios valores para limitar los resultados devueltos solo a las etiquetas que le interesen.
   + En la llamada a `GetLabelDetection`, puede proporcionar valores para los argumentos `SortBy` y `AggregateBy`. Para ordenar por tiempo, establezca el valor del parámetro de entrada `SortBy` en `TIMESTAMP`. Para ordenar por entidad, utilice el parámetro de entrada `SortBy` con el valor que es adecuado para la operación que está realizando. Para agregar los resultados por marca de tiempo, defina el valor del parámetro `AggregateBy` en `TIMESTAMPS`. Para agregar por segmento de vídeo, utilice `SEGMENTS`. 

   En el ejemplo de código, coloque la siguiente política de IAM entre las comillas de la línea `policy = """""".format(sqsQueueArn, self.snsTopicArn)`.

   ```
   ## 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.)
   
   import boto3
   import json
   import sys
   import time
   
   class VideoDetect:
   
       jobId = ''
   
       roleArn = ''
       bucket = ''
       video = ''
       startJobId = ''
   
       sqsQueueUrl = ''
       snsTopicArn = ''
       processType = ''
   
       def __init__(self, role, bucket, video, client, rek, sqs, sns):
           self.roleArn = role
           self.bucket = bucket
           self.video = video
           self.client = client
           self.rek = rek
           self.sqs = sqs
           self.sns = sns
   
       def GetSQSMessageSuccess(self):
   
           jobFound = False
           succeeded = False
   
           dotLine = 0
           while jobFound == False:
               sqsResponse = self.sqs.receive_message(QueueUrl=self.sqsQueueUrl, MessageAttributeNames=['ALL'],
                                                      MaxNumberOfMessages=10)
   
               if sqsResponse:
   
                   if 'Messages' not in sqsResponse:
                       if dotLine < 40:
                           print('.', end='')
                           dotLine = dotLine + 1
                       else:
                           print()
                           dotLine = 0
                       sys.stdout.flush()
                       time.sleep(5)
                       continue
   
                   for message in sqsResponse['Messages']:
                       notification = json.loads(message['Body'])
                       rekMessage = json.loads(notification['Message'])
                       print(rekMessage['JobId'])
                       print(rekMessage['Status'])
                       if rekMessage['JobId'] == self.startJobId:
                           print('Matching Job Found:' + rekMessage['JobId'])
                           jobFound = True
                           if (rekMessage['Status'] == 'SUCCEEDED'):
                               succeeded = True
   
                           self.sqs.delete_message(QueueUrl=self.sqsQueueUrl,
                                                   ReceiptHandle=message['ReceiptHandle'])
                       else:
                           print("Job didn't match:" +
                                 str(rekMessage['JobId']) + ' : ' + self.startJobId)
                       # Delete the unknown message. Consider sending to dead letter queue
                       self.sqs.delete_message(QueueUrl=self.sqsQueueUrl,
                                               ReceiptHandle=message['ReceiptHandle'])
   
           return succeeded
   
       def StartLabelDetection(self):
           response = self.rek.start_label_detection(Video={'S3Object': {'Bucket': self.bucket, 'Name': self.video}},
                                                     NotificationChannel={'RoleArn': self.roleArn,
                                                                          'SNSTopicArn': self.snsTopicArn},
                                                     MinConfidence=90,
                                                     # Filtration options, uncomment and add desired labels to filter returned labels
                                                     # Features=['GENERAL_LABELS'],
                                                     # Settings={
                                                     # 'GeneralLabels': {
                                                     # 'LabelInclusionFilters': ['Clothing']
                                                     # }}
                                                      )
   
           self.startJobId = response['JobId']
           print('Start Job Id: ' + self.startJobId)
   
       def GetLabelDetectionResults(self):
           maxResults = 10
           paginationToken = ''
           finished = False
   
           while finished == False:
               response = self.rek.get_label_detection(JobId=self.startJobId,
                                                       MaxResults=maxResults,
                                                       NextToken=paginationToken,
                                                       SortBy='TIMESTAMP',
                                                       AggregateBy="TIMESTAMPS")
   
               print('Codec: ' + response['VideoMetadata']['Codec'])
               print('Duration: ' + str(response['VideoMetadata']['DurationMillis']))
               print('Format: ' + response['VideoMetadata']['Format'])
               print('Frame rate: ' + str(response['VideoMetadata']['FrameRate']))
               print()
   
               for labelDetection in response['Labels']:
                   label = labelDetection['Label']
   
                   print("Timestamp: " + str(labelDetection['Timestamp']))
                   print("   Label: " + label['Name'])
                   print("   Confidence: " + str(label['Confidence']))
                   print("   Instances:")
                   for instance in label['Instances']:
                       print("      Confidence: " + str(instance['Confidence']))
                       print("      Bounding box")
                       print("        Top: " + str(instance['BoundingBox']['Top']))
                       print("        Left: " + str(instance['BoundingBox']['Left']))
                       print("        Width: " + str(instance['BoundingBox']['Width']))
                       print("        Height: " + str(instance['BoundingBox']['Height']))
                       print()
                   print()
   
                   print("Parents:")
                   for parent in label['Parents']:
                       print("   " + parent['Name'])
   
                   print("Aliases:")
                   for alias in label['Aliases']:
                       print("   " + alias['Name'])
   
                   print("Categories:")
                   for category in label['Categories']:
                       print("   " + category['Name'])
                   print("----------")
                   print()
   
                   if 'NextToken' in response:
                       paginationToken = response['NextToken']
                   else:
                       finished = True
   
       def CreateTopicandQueue(self):
   
           millis = str(int(round(time.time() * 1000)))
   
           # Create SNS topic
   
           snsTopicName = "AmazonRekognitionExample" + millis
   
           topicResponse = self.sns.create_topic(Name=snsTopicName)
           self.snsTopicArn = topicResponse['TopicArn']
   
           # create SQS queue
           sqsQueueName = "AmazonRekognitionQueue" + millis
           self.sqs.create_queue(QueueName=sqsQueueName)
           self.sqsQueueUrl = self.sqs.get_queue_url(QueueName=sqsQueueName)['QueueUrl']
   
           attribs = self.sqs.get_queue_attributes(QueueUrl=self.sqsQueueUrl,
                                                   AttributeNames=['QueueArn'])['Attributes']
   
           sqsQueueArn = attribs['QueueArn']
   
           # Subscribe SQS queue to SNS topic
           self.sns.subscribe(
               TopicArn=self.snsTopicArn,
               Protocol='sqs',
               Endpoint=sqsQueueArn)
   
           # Authorize SNS to write SQS queue 
           # Insert the policy from the documentation from 
           policy = """
           {{
              "Version":"2012-10-17",              
              "Statement":[
               {{
                   "Sid":"MyPolicy",
                   "Effect":"Allow",
                   "Principal" : {{"AWS" : "*"}},
                   "Action":"SQS:SendMessage",
                   "Resource": "{}",
                   "Condition":{{
                       "ArnEquals":{{
                           "aws:SourceArn": "{}"
                        }}
                   }}
               }}
               ]
           }}""".format(sqsQueueArn, self.snsTopicArn)
   
           response = self.sqs.set_queue_attributes(
               QueueUrl=self.sqsQueueUrl,
               Attributes={
                   'Policy': policy
               })
   
       def DeleteTopicandQueue(self):
           self.sqs.delete_queue(QueueUrl=self.sqsQueueUrl)
           self.sns.delete_topic(TopicArn=self.snsTopicArn)
   
   def main():
       
       roleArn = 'role-arn'
       bucket = 'bucket-name'
       video = 'video-name'
   
       session = boto3.Session(profile_name='profile-name')
       client = session.client('rekognition')
       rek = boto3.client('rekognition')
       sqs = boto3.client('sqs')
       sns = boto3.client('sns')
   
       analyzer = VideoDetect(roleArn, bucket, video, client, rek, sqs, sns)
       analyzer.CreateTopicandQueue()
   
       analyzer.StartLabelDetection()
       if analyzer.GetSQSMessageSuccess() == True:
           analyzer.GetLabelDetectionResults()
   
       analyzer.DeleteTopicandQueue()
   
   if __name__ == "__main__":
       main()
   ```

------
#### [ Node.Js ]

   En el siguiente código de muestra:
   + Sustituya el valor de `REGION` por el nombre de la región operativa de su cuenta.
   + Sustituya el valor de `amzn-s3-demo-bucket` por el nombre del bucket de Amazon S3 que contiene el archivo de vídeo.
   + Sustituya el valor de `videoName` por el nombre del archivo de vídeo en su bucket de Amazon S3.
   +  Sustituya el valor de `profile_name` en la línea que crea la sesión de Rekognition por el nombre de su perfil de desarrollador. 
   + reemplace `roleArn` por el ARN del rol de servicio de IAM que creó en el paso 7 de [Para configurar Amazon Rekognition Video](api-video-roles.md#configure-rekvid-procedure).

   ```
   import { CreateQueueCommand, GetQueueAttributesCommand, GetQueueUrlCommand, 
     SetQueueAttributesCommand, DeleteQueueCommand, ReceiveMessageCommand, DeleteMessageCommand } from  "@aws-sdk/client-sqs";
   import {CreateTopicCommand, SubscribeCommand, DeleteTopicCommand } from "@aws-sdk/client-sns";
   import  { SQSClient } from "@aws-sdk/client-sqs";
   import  { SNSClient } from "@aws-sdk/client-sns";
   import  { RekognitionClient, StartLabelDetectionCommand, GetLabelDetectionCommand } from "@aws-sdk/client-rekognition";
   import { stdout } from "process";
   import {fromIni} from '@aws-sdk/credential-providers';
   
   // Set the AWS Region.
   const REGION = "region-name"; //e.g. "us-east-1"
   const profileName = "profile-name"
   // Create SNS service object.
   const sqsClient = new SQSClient({ region: REGION, 
     credentials: fromIni({profile: profileName,}), });
   const snsClient = new SNSClient({ region: REGION, 
     credentials: fromIni({profile: profileName,}), });
   const rekClient = new RekognitionClient({region: REGION, 
     credentials: fromIni({profile: profileName,}), 
   });
   
   // Set bucket and video variables
   const bucket = "bucket-name";
   const videoName = "video-name";
   const roleArn = "role-arn"
   var startJobId = ""
   
   var ts = Date.now();
   const snsTopicName = "AmazonRekognitionExample" + ts;
   const snsTopicParams = {Name: snsTopicName}
   const sqsQueueName = "AmazonRekognitionQueue-" + ts;
   
   // Set the parameters
   const sqsParams = {
     QueueName: sqsQueueName, //SQS_QUEUE_URL
     Attributes: {
       DelaySeconds: "60", // Number of seconds delay.
       MessageRetentionPeriod: "86400", // Number of seconds delay.
     },
   };
   
   const createTopicandQueue = async () => {
     try {
       // Create SNS topic
       const topicResponse = await snsClient.send(new CreateTopicCommand(snsTopicParams));
       const topicArn = topicResponse.TopicArn
       console.log("Success", topicResponse);
       // Create SQS Queue
       const sqsResponse = await sqsClient.send(new CreateQueueCommand(sqsParams));
       console.log("Success", sqsResponse);
       const sqsQueueCommand = await sqsClient.send(new GetQueueUrlCommand({QueueName: sqsQueueName}))
       const sqsQueueUrl = sqsQueueCommand.QueueUrl
       const attribsResponse = await sqsClient.send(new GetQueueAttributesCommand({QueueUrl: sqsQueueUrl, AttributeNames: ['QueueArn']}))
       const attribs = attribsResponse.Attributes
       console.log(attribs)
       const queueArn = attribs.QueueArn
       // subscribe SQS queue to SNS topic
       const subscribed = await snsClient.send(new SubscribeCommand({TopicArn: topicArn, Protocol:'sqs', Endpoint: queueArn}))
       const policy = {
         Version: "2012-10-17",&TCX5-2025-waiver;                
         Statement: [
           {
             Sid: "MyPolicy",
             Effect: "Allow",
             Principal: {AWS: "*"},
             Action: "SQS:SendMessage",
             Resource: queueArn,
             Condition: {
               ArnEquals: {
                 'aws:SourceArn': topicArn
               }
             }
           }
         ]
       };
   
       const response = sqsClient.send(new SetQueueAttributesCommand({QueueUrl: sqsQueueUrl, Attributes: {Policy: JSON.stringify(policy)}}))
       console.log(response)
       console.log(sqsQueueUrl, topicArn)
       return [sqsQueueUrl, topicArn]
   
     } catch (err) {
       console.log("Error", err);
     }
   };
   
   const startLabelDetection = async (roleArn, snsTopicArn) => {
     try {
       //Initiate label detection and update value of startJobId with returned Job ID
      const labelDetectionResponse = await rekClient.send(new StartLabelDetectionCommand({Video:{S3Object:{Bucket:bucket, Name:videoName}}, 
         NotificationChannel:{RoleArn: roleArn, SNSTopicArn: snsTopicArn}}));
         startJobId = labelDetectionResponse.JobId
         console.log(`JobID: ${startJobId}`)
         return startJobId
     } catch (err) {
       console.log("Error", err);
     }
   };
   
   const getLabelDetectionResults = async(startJobId) => {
     console.log("Retrieving Label Detection results")
     // Set max results, paginationToken and finished will be updated depending on response values
     var maxResults = 10
     var paginationToken = ''
     var finished = false
   
     // Begin retrieving label detection results
     while (finished == false){
       var response = await rekClient.send(new GetLabelDetectionCommand({JobId: startJobId, MaxResults: maxResults, 
         NextToken: paginationToken, SortBy:'TIMESTAMP'}))
         // Log metadata
         console.log(`Codec: ${response.VideoMetadata.Codec}`)
         console.log(`Duration: ${response.VideoMetadata.DurationMillis}`)
         console.log(`Format: ${response.VideoMetadata.Format}`)
         console.log(`Frame Rate: ${response.VideoMetadata.FrameRate}`)
         console.log()
         // For every detected label, log label, confidence, bounding box, and timestamp
         response.Labels.forEach(labelDetection => {
           var label = labelDetection.Label
           console.log(`Timestamp: ${labelDetection.Timestamp}`)
           console.log(`Label: ${label.Name}`)
           console.log(`Confidence: ${label.Confidence}`)
           console.log("Instances:")
           label.Instances.forEach(instance =>{
             console.log(`Confidence: ${instance.Confidence}`)
             console.log("Bounding Box:")
             console.log(`Top: ${instance.Confidence}`)
             console.log(`Left: ${instance.Confidence}`)
             console.log(`Width: ${instance.Confidence}`)
             console.log(`Height: ${instance.Confidence}`)
             console.log()
           })
         console.log()
         // Log parent if found
         console.log("   Parents:")
         label.Parents.forEach(parent =>{
           console.log(`    ${parent.Name}`)
         })
         console.log()
         // Searh for pagination token, if found, set variable to next token
         if (String(response).includes("NextToken")){
           paginationToken = response.NextToken
   
         }else{
           finished = true
         }
   
         })
     }
   }
   
   // Checks for status of job completion
   const getSQSMessageSuccess = async(sqsQueueUrl, startJobId) => {
     try {
       // Set job found and success status to false initially
       var jobFound = false
       var succeeded = false
       var dotLine = 0
       // while not found, continue to poll for response
       while (jobFound == false){
         var sqsReceivedResponse = await sqsClient.send(new ReceiveMessageCommand({QueueUrl:sqsQueueUrl, 
           MaxNumberOfMessages:'ALL', MaxNumberOfMessages:10}));
         if (sqsReceivedResponse){
           var responseString = JSON.stringify(sqsReceivedResponse)
           if (!responseString.includes('Body')){
             if (dotLine < 40) {
               console.log('.')
               dotLine = dotLine + 1
             }else {
               console.log('')
               dotLine = 0 
             };
             stdout.write('', () => {
               console.log('');
             });
             await new Promise(resolve => setTimeout(resolve, 5000));
             continue
           }
         }
   
         // Once job found, log Job ID and return true if status is succeeded
         for (var message of sqsReceivedResponse.Messages){
           console.log("Retrieved messages:")
           var notification = JSON.parse(message.Body)
           var rekMessage = JSON.parse(notification.Message)
           var messageJobId = rekMessage.JobId
           if (String(rekMessage.JobId).includes(String(startJobId))){
             console.log('Matching job found:')
             console.log(rekMessage.JobId)
             jobFound = true
             console.log(rekMessage.Status)
             if (String(rekMessage.Status).includes(String("SUCCEEDED"))){
               succeeded = true
               console.log("Job processing succeeded.")
               var sqsDeleteMessage = await sqsClient.send(new DeleteMessageCommand({QueueUrl:sqsQueueUrl, ReceiptHandle:message.ReceiptHandle}));
             }
           }else{
             console.log("Provided Job ID did not match returned ID.")
             var sqsDeleteMessage = await sqsClient.send(new DeleteMessageCommand({QueueUrl:sqsQueueUrl, ReceiptHandle:message.ReceiptHandle}));
           }
         }
       }
     return succeeded
     } catch(err) {
       console.log("Error", err);
     }
   };
   
   // Start label detection job, sent status notification, check for success status
   // Retrieve results if status is "SUCEEDED", delete notification queue and topic
   const runLabelDetectionAndGetResults = async () => {
     try {
       const sqsAndTopic = await createTopicandQueue();
       const startLabelDetectionRes = await startLabelDetection(roleArn, sqsAndTopic[1]);
       const getSQSMessageStatus = await getSQSMessageSuccess(sqsAndTopic[0], startLabelDetectionRes)
       console.log(getSQSMessageSuccess)
       if (getSQSMessageSuccess){
         console.log("Retrieving results:")
         const results = await getLabelDetectionResults(startLabelDetectionRes)
       }
       const deleteQueue = await sqsClient.send(new DeleteQueueCommand({QueueUrl: sqsAndTopic[0]}));
       const deleteTopic = await snsClient.send(new DeleteTopicCommand({TopicArn: sqsAndTopic[1]}));
       console.log("Successfully deleted.")
     } catch (err) {
       console.log("Error", err);
     }
   };
   
   runLabelDetectionAndGetResults()
   ```

------
#### [ Java V2 ]

   Este código se ha tomado del GitHub repositorio de ejemplos del SDK de AWS documentación. Consulte el ejemplo completo [aquí](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/javav2/example_code/rekognition/src/main/java/com/example/rekognition/VideoDetect.java).

   ```
   import com.fasterxml.jackson.core.JsonProcessingException;
   import com.fasterxml.jackson.databind.JsonMappingException;
   import com.fasterxml.jackson.databind.JsonNode;
   import com.fasterxml.jackson.databind.ObjectMapper;
   import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider;
   import software.amazon.awssdk.regions.Region;
   import software.amazon.awssdk.services.rekognition.RekognitionClient;
   import software.amazon.awssdk.services.rekognition.model.StartLabelDetectionResponse;
   import software.amazon.awssdk.services.rekognition.model.NotificationChannel;
   import software.amazon.awssdk.services.rekognition.model.S3Object;
   import software.amazon.awssdk.services.rekognition.model.Video;
   import software.amazon.awssdk.services.rekognition.model.StartLabelDetectionRequest;
   import software.amazon.awssdk.services.rekognition.model.GetLabelDetectionRequest;
   import software.amazon.awssdk.services.rekognition.model.GetLabelDetectionResponse;
   import software.amazon.awssdk.services.rekognition.model.RekognitionException;
   import software.amazon.awssdk.services.rekognition.model.LabelDetectionSortBy;
   import software.amazon.awssdk.services.rekognition.model.VideoMetadata;
   import software.amazon.awssdk.services.rekognition.model.LabelDetection;
   import software.amazon.awssdk.services.rekognition.model.Label;
   import software.amazon.awssdk.services.rekognition.model.Instance;
   import software.amazon.awssdk.services.rekognition.model.Parent;
   import software.amazon.awssdk.services.sqs.SqsClient;
   import software.amazon.awssdk.services.sqs.model.Message;
   import software.amazon.awssdk.services.sqs.model.ReceiveMessageRequest;
   import software.amazon.awssdk.services.sqs.model.DeleteMessageRequest;
   import java.util.List;
   //snippet-end:[rekognition.java2.recognize_video_detect.import]
   
   /**
   * Before running this Java V2 code example, set up your development environment, including your credentials.
   *
   * For more information, see the following documentation topic:
   *
   * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html
   */
   public class VideoDetect {
   
    private static String startJobId ="";
    public static void main(String[] args) {
   
        final String usage = "\n" +
            "Usage: " +
            "   <bucket> <video> <queueUrl> <topicArn> <roleArn>\n\n" +
            "Where:\n" +
            "   bucket - The name of the bucket in which the video is located (for example, (for example, amzn-s3-demo-bucket). \n\n"+
            "   video - The name of the video (for example, people.mp4). \n\n" +
            "   queueUrl- The URL of a SQS queue. \n\n" +
            "   topicArn - The ARN of the Amazon Simple Notification Service (Amazon SNS) topic. \n\n" +
            "   roleArn - The ARN of the AWS Identity and Access Management (IAM) role to use. \n\n" ;
   
        if (args.length != 5) {
            System.out.println(usage);
            System.exit(1);
        }
   
        String bucket = args[0];
        String video = args[1];
        String queueUrl = args[2];
        String topicArn = args[3];
        String roleArn = args[4];
        Region region = Region.US_WEST_2;
        RekognitionClient rekClient = RekognitionClient.builder()
            .region(region)
            .credentialsProvider(ProfileCredentialsProvider.create("profile-name"))
            .build();
   
        SqsClient sqs = SqsClient.builder()
            .region(Region.US_WEST_2)
            .credentialsProvider(ProfileCredentialsProvider.create("profile-name"))
            .build();
   
        NotificationChannel channel = NotificationChannel.builder()
            .snsTopicArn(topicArn)
            .roleArn(roleArn)
            .build();
   
        startLabels(rekClient, channel, bucket, video);
        getLabelJob(rekClient, sqs,  queueUrl);
        System.out.println("This example is done!");
        sqs.close();
        rekClient.close();
    }
   
    // snippet-start:[rekognition.java2.recognize_video_detect.main]
    public static void startLabels(RekognitionClient rekClient,
                                   NotificationChannel channel,
                                   String bucket,
                                   String video) {
        try {
            S3Object s3Obj = S3Object.builder()
                .bucket(bucket)
                .name(video)
                .build();
   
            Video vidOb = Video.builder()
                .s3Object(s3Obj)
                .build();
   
            StartLabelDetectionRequest labelDetectionRequest = StartLabelDetectionRequest.builder()
                .jobTag("DetectingLabels")
                .notificationChannel(channel)
                .video(vidOb)
                .minConfidence(50F)
                .build();
   
            StartLabelDetectionResponse labelDetectionResponse = rekClient.startLabelDetection(labelDetectionRequest);
            startJobId = labelDetectionResponse.jobId();
   
            boolean ans = true;
            String status = "";
            int yy = 0;
            while (ans) {
   
                GetLabelDetectionRequest detectionRequest = GetLabelDetectionRequest.builder()
                    .jobId(startJobId)
                    .maxResults(10)
                    .build();
   
                GetLabelDetectionResponse result = rekClient.getLabelDetection(detectionRequest);
                status = result.jobStatusAsString();
   
                if (status.compareTo("SUCCEEDED") == 0)
                    ans = false;
                else
                    System.out.println(yy +" status is: "+status);
   
                Thread.sleep(1000);
                yy++;
            }
   
            System.out.println(startJobId +" status is: "+status);
   
        } catch(RekognitionException | InterruptedException e) {
            e.getMessage();
            System.exit(1);
        }
    }
   
    public static void getLabelJob(RekognitionClient rekClient, SqsClient sqs, String queueUrl) {
   
        List<Message> messages;
        ReceiveMessageRequest messageRequest = ReceiveMessageRequest.builder()
            .queueUrl(queueUrl)
            .build();
   
        try {
            messages = sqs.receiveMessage(messageRequest).messages();
   
            if (!messages.isEmpty()) {
                for (Message message: messages) {
                    String notification = message.body();
   
                    // Get the status and job id from the notification
                    ObjectMapper mapper = new ObjectMapper();
                    JsonNode jsonMessageTree = mapper.readTree(notification);
                    JsonNode messageBodyText = jsonMessageTree.get("Message");
                    ObjectMapper operationResultMapper = new ObjectMapper();
                    JsonNode jsonResultTree = operationResultMapper.readTree(messageBodyText.textValue());
                    JsonNode operationJobId = jsonResultTree.get("JobId");
                    JsonNode operationStatus = jsonResultTree.get("Status");
                    System.out.println("Job found in JSON is " + operationJobId);
   
                    DeleteMessageRequest deleteMessageRequest = DeleteMessageRequest.builder()
                        .queueUrl(queueUrl)
                        .build();
   
                    String jobId = operationJobId.textValue();
                    if (startJobId.compareTo(jobId)==0) {
                        System.out.println("Job id: " + operationJobId );
                        System.out.println("Status : " + operationStatus.toString());
   
                        if (operationStatus.asText().equals("SUCCEEDED"))
                            GetResultsLabels(rekClient);
                        else
                            System.out.println("Video analysis failed");
   
                        sqs.deleteMessage(deleteMessageRequest);
                    }
   
                    else{
                        System.out.println("Job received was not job " +  startJobId);
                        sqs.deleteMessage(deleteMessageRequest);
                    }
                }
            }
   
        } catch(RekognitionException e) {
            e.getMessage();
            System.exit(1);
        } catch (JsonMappingException e) {
            e.printStackTrace();
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
    }
   
    // Gets the job results by calling GetLabelDetection
    private static void GetResultsLabels(RekognitionClient rekClient) {
   
        int maxResults=10;
        String paginationToken=null;
        GetLabelDetectionResponse labelDetectionResult=null;
   
        try {
            do {
                if (labelDetectionResult !=null)
                    paginationToken = labelDetectionResult.nextToken();
   
   
                GetLabelDetectionRequest labelDetectionRequest= GetLabelDetectionRequest.builder()
                    .jobId(startJobId)
                    .sortBy(LabelDetectionSortBy.TIMESTAMP)
                    .maxResults(maxResults)
                    .nextToken(paginationToken)
                    .build();
   
                labelDetectionResult = rekClient.getLabelDetection(labelDetectionRequest);
                VideoMetadata videoMetaData=labelDetectionResult.videoMetadata();
                System.out.println("Format: " + videoMetaData.format());
                System.out.println("Codec: " + videoMetaData.codec());
                System.out.println("Duration: " + videoMetaData.durationMillis());
                System.out.println("FrameRate: " + videoMetaData.frameRate());
   
                List<LabelDetection> detectedLabels= labelDetectionResult.labels();
                for (LabelDetection detectedLabel: detectedLabels) {
                    long seconds=detectedLabel.timestamp();
                    Label label=detectedLabel.label();
                    System.out.println("Millisecond: " + seconds + " ");
   
                    System.out.println("   Label:" + label.name());
                    System.out.println("   Confidence:" + detectedLabel.label().confidence().toString());
   
                    List<Instance> instances = label.instances();
                    System.out.println("   Instances of " + label.name());
   
                    if (instances.isEmpty()) {
                        System.out.println("        " + "None");
                    } else {
                        for (Instance instance : instances) {
                            System.out.println("        Confidence: " + instance.confidence().toString());
                            System.out.println("        Bounding box: " + instance.boundingBox().toString());
                        }
                    }
                    System.out.println("   Parent labels for " + label.name() + ":");
                    List<Parent> parents = label.parents();
   
                    if (parents.isEmpty()) {
                        System.out.println("        None");
                    } else {
                        for (Parent parent : parents) {
                            System.out.println("   " + parent.name());
                        }
                    }
                    System.out.println();
                }
            } while (labelDetectionResult !=null && labelDetectionResult.nextToken() != null);
   
        } catch(RekognitionException e) {
            e.getMessage();
            System.exit(1);
        }
    }
    // snippet-end:[rekognition.java2.recognize_video_detect.main]
   }
   ```

------

1. Cree y ejecute el código. La operación podría llevar algún tiempo. Una vez terminada, se muestra una lista de las etiquetas detectadas en el vídeo. Para obtener más información, consulte [Detección de etiquetas en un vídeo](labels-detecting-labels-video.md).

# Analizar un vídeo con el AWS Command Line Interface
<a name="video-cli-commands"></a>

Puede usar AWS Command Line Interface (AWS CLI) para llamar a las operaciones de Amazon Rekognition Video. El patrón de diseño es el mismo que cuando se utiliza la API Amazon Rekognition Video con AWS u otro dispositivo. AWS SDK para Java SDKs Para obtener más información, consulte [Descripción general de la API de Amazon Rekognition Video](video.md#video-api-overview). Los siguientes procedimientos muestran cómo utilizarlos AWS CLI para detectar etiquetas en un vídeo.

Comienza la detección de etiquetas en un vídeo llamando a `start-label-detection`. Cuando Amazon Rekognition termina de analizar el vídeo, el estado de realización se envía al tema de Amazon SNS que se ha especificado en el parámetro `--notification-channel` de `start-label-detection`. Puede obtener el estado de realización suscribiendo una cola de Amazon Simple Queue Service (Amazon SQS) al tema de Amazon SNS. A continuación, sondee [receive-message](https://docs.aws.amazon.com/cli/latest/reference/sqs/receive-message.html) para obtener el estado de realización de la cola de Amazon SQS.

Al llamar a `StartLabelDetection`, puede filtrar los resultados proporcionando argumentos de filtrado a los argumentos `LabelsInclusionFilter` y/o `LabelsExclusionFilter`. Para obtener más información, consulte [Detección de etiquetas en un vídeo](labels-detecting-labels-video.md) .

La notificación del estado de realización es una estructura de JSON dentro de la respuesta `receive-message`. Tiene que extraer el JSON de la respuesta. Para obtener más información acerca del JSON del estado de realización, consulte [Referencia: notificación de resultados de análisis de vídeo](video-notification-payload.md). Si el valor del campo `Status` del JSON de estado completado es `SUCCEEDED`, puede obtener los resultados de la solicitud de análisis llamando a `get-label-detection`. Al llamar a `GetLabelDetection`, puede ordenar y agregar los resultados devueltos utilizando los argumentos `SortBy` y `AggregateBy`.

Los siguientes procedimientos no incluyen código para sondear la cola de Amazon SQS. Además, no incluyen código para analizar el JSON que se devuelve desde la cola de Amazon SQS. Para ver un ejemplo en Java, consulte [Análisis de un vídeo almacenado en un bucket de Amazon S3 con Java o Python (SDK)](video-analyzing-with-sqs.md). 

## Requisitos previos
<a name="video-prerequisites"></a>

Para ejecutar este procedimiento, debe tener el AWS CLI instalado. Para obtener más información, consulte [Introducción a Amazon Rekognition](getting-started.md). La cuenta de AWS que utilice debe tener permisos de acceso a la API de Amazon Rekognition. Para obtener más información, [Acciones definidas por Amazon Rekognition](https://docs.aws.amazon.com/IAM/latest/UserGuide/list_amazonrekognition.html#amazonrekognition-actions-as-permissions). 

**Para configurar Amazon Rekognition Video y subir un vídeo**

1. Configure el acceso de los usuarios a Amazon Rekognition Video y configure el acceso de Amazon Rekognition Video a Amazon SNS. Para obtener más información, consulte [Configuración de Amazon Rekognition Video](api-video-roles.md).

1. Cargue un archivo de vídeo con formato MOV o MPEG-4 en el bucket de S3. Para desarrollo y pruebas, le aconsejamos que utilice vídeos cortos con una duración inferior a 30 segundos.

   Para ver las instrucciones, consulte [Carga de objetos en Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UploadingObjectsintoAmazonS3.html) en la *Guía del usuario de Amazon Simple Storage Service*.

**Para detectar etiquetas en un vídeo**

1. Ejecute el siguiente AWS CLI comando para empezar a detectar etiquetas en un vídeo.

   ```
   aws rekognition start-label-detection --video '{"S3Object":{"Bucket":"amzn-s3-demo-bucket","Name":"video-name"}}' \
    --notification-channel '{"SNSTopicArn":"TopicARN","RoleArn":"RoleARN"}' \
   --region region-name  \ 
   --features GENERAL_LABELS \
   --profile profile-name \
   --settings "{"GeneralLabels":{"LabelInclusionFilters":["Car"]}}
   ```

   Actualice los siguientes valores:
   + Cambie `amzn-s3-demo-bucket` y `videofile` por el nombre del bucket de Amazon S3 y el nombre de archivo que especificó en el paso 2.
   + Cambie `us-east-1` por la región de AWS que está utilizando.
   + Sustituya el valor de `profile_name` en la línea que crea la sesión de Rekognition por el nombre de su perfil de desarrollador.
   + Reemplace `TopicARN` por el ARN del tema de Amazon SNS que creó en el paso 3 de [Configuración de Amazon Rekognition Video](api-video-roles.md).
   + Cambie `RoleARN` por el ARN del rol de servicio de IAM que creó en el paso 7 de [Configuración de Amazon Rekognition Video](api-video-roles.md).
   + Si es necesario, puede especificar la `endpoint-url`. La CLI de AWS debe determinar automáticamente la URL del punto de conexión adecuada en función de la región proporcionada. Sin embargo, si utiliza un punto de conexión [de su VPC privada](https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html#what-is-privatelink), es posible que deba especificar la `endpoint-url`. El recurso [AWS Service Endpoints](https://docs.aws.amazon.com/general/latest/gr/rande.html#regional-endpoints) incluye la sintaxis para especificar las direcciones URL de los puntos de conexión y los nombres y códigos de cada región.
   + También puede incluir criterios de filtrado en el parámetro de configuración. Por ejemplo, puede utilizar un `LabelsInclusionFilter` o un `LabelsExclusionFilter` junto a una lista de los valores deseados.

    Si accede a la CLI en un dispositivo Windows, utilice comillas dobles en lugar de comillas simples y evite las comillas dobles internas con una barra invertida (es decir, \$1) para corregir cualquier error del analizador que pueda encontrar. Consulte a continuación un ejemplo: 

   ```
   aws rekognition start-label-detection --video "{\"S3Object\":{\"Bucket\":\"amzn-s3-demo-bucket",\"Name\":\"video-name\"}}" --notification-channel "{\"SNSTopicArn\":\"TopicARN\",\"RoleArn\":\"RoleARN\"}" \
   --region us-east-1 --features GENERAL_LABELS --settings "{\"GeneralLabels\":{\"LabelInclusionFilters\":[\"Car\"]}}" --profile profile-name
   ```

1. Anote el valor de `JobId` en la respuesta. La respuesta tiene un aspecto similar a la del siguiente ejemplo JSON.

   ```
   {
       "JobId": "547089ce5b9a8a0e7831afa655f42e5d7b5c838553f1a584bf350ennnnnnnnnn"
   }
   ```

1. Escriba código para sondear la cola de Amazon SQS para ver el JSON del estado de realización (mediante la utilización de [receive-message](https://docs.aws.amazon.com/cli/latest/reference/sqs/receive-message.html)).

1. Escriba código para extraer el campo `Status` del JSON de estado de realización.

1. Si el valor `Status` es`SUCCEEDED`, ejecute el siguiente AWS CLI comando para mostrar los resultados de la detección de etiquetas.

   ```
   aws rekognition get-label-detection  --job-id JobId \
   --region us-east-1 --sort-by TIMESTAMP aggregate-by TIMESTAMPS
   ```

   Actualice los siguientes valores:
   + Cambie `JobId` para que coincida con el identificador de trabajo que ha anotado en el paso 2.
   + Cambie `Endpoint` y `us-east-1` al punto de conexión y la región de AWS que está utilizando.

   Los resultados tienen un aspecto similar al JSON del siguiente ejemplo:

   ```
   {
       "Labels": [
           {
               "Timestamp": 0,
               "Label": {
                   "Confidence": 99.03720092773438,
                   "Name": "Speech"
               }
           },
           {
               "Timestamp": 0,
               "Label": {
                   "Confidence": 71.6698989868164,
                   "Name": "Pumpkin"
               }
           },
           {
               "Timestamp": 0,
               "Label": {
                   "Confidence": 71.6698989868164,
                   "Name": "Squash"
               }
           },
           {
               "Timestamp": 0,
               "Label": {
                   "Confidence": 71.6698989868164,
                   "Name": "Vegetable"
               }
           }, .......
   ```

# Referencia: notificación de resultados de análisis de vídeo
<a name="video-notification-payload"></a>

Amazon Rekognition publica los resultados de una solicitud de análisis de Amazon Rekognition Video, incluido el estado de finalización, en un tema de Amazon Simple Notification Service (Amazon SNS). Para obtener la notificación de un tema de Amazon SNS, utilice una cola o una función de Amazon Simple Queue Service. AWS Lambda Para obtener más información, consulte [Cómo llamar a las operaciones de Amazon Rekognition Video](api-video.md). Para ver un ejemplo, consulta [Análisis de un vídeo almacenado en un bucket de Amazon S3 con Java o Python (SDK)](video-analyzing-with-sqs.md).

La carga está en el siguiente formato JSON:

```
{
  "JobId": "String",
  "Status": "String",
  "API": "String",
  "JobTag": "String",
  "Timestamp": Number,
  "Video": {
    "S3ObjectName": "String",
    "S3Bucket": "String"
  }
}
```


| Name | Description (Descripción) | 
| --- | --- | 
|  JobId  |  El identificador del trabajo. Coincide con un identificador de trabajo que se devuelve desde una operación `Start`, como por ejemplo [StartPersonTracking](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_StartPersonTracking.html).  | 
|  Status  |  El estado del trabajo. Los valores válidos son SUCCEEDED, FAILED o ERROR.  | 
|  API  |  La operación de Amazon Rekognition Video utilizada para analizar el vídeo de entrada.  | 
|  JobTag  |  Identificador del trabajo. Especifique `JobTag` en una llamada a una operación Start, como por ejemplo [StartLabelDetection](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_StartLabelDetection.html).  | 
|  Timestamp  |  La marca de hora Unix cuando el trabajo terminó.  | 
|  Video  |  Detalles sobre el vídeo que se procesó. Incluye el nombre de archivo y el bucket de Amazon S3 en el que está almacenado el archivo.  | 

A continuación se muestra un ejemplo de una notificación de éxito que se envió a un tema de Amazon SNS.

```
{
  "JobId": "6de014b0-2121-4bf0-9e31-856a18719e22",
  "Status": "SUCCEEDED",
  "API": "LABEL_DETECTION",
  "Message": "",
  "Timestamp": 1502230160926,
  "Video": {
    "S3ObjectName": "video.mpg",
    "S3Bucket": "amzn-s3-demo-bucket"
  }
}
```

# Solución de problemas de Amazon Rekognition Video
<a name="video-troubleshooting"></a>

En este tema se incluye información de solución de problemas relacionados con el uso de Amazon Rekognition Video y de vídeos almacenados.

## No recibo nunca el estado de realización que se envía al tema de Amazon SNS
<a name="video-no-sns-topic"></a>

 Amazon Rekognition Video publica información de estado en un tema de Amazon SNS cuando finaliza el análisis de vídeo. Por lo general, el mensaje de estado de realización se obtiene al suscribirse al tema mediante una cola de Amazon SQS o una función de Lambda. Para ayudarle en su investigación, suscríbase al tema de Amazon SNS por correo electrónico para recibir los mensajes que se envían al tema de Amazon SNS en su bandeja de entrada. Para obtener más información, consulte [Suscripción a un tema de Amazon SNS](https://docs.aws.amazon.com/sns/latest/dg/sns-create-subscribe-endpoint-to-topic.html).

Si no recibe el mensaje en la aplicación, haga lo siguiente:
+ Compruebe que el análisis ha finalizado. Compruebe el valor de `JobStatus` en la respuesta de la operación GET (por ejemplo, `GetLabelDetection`). Si el valor es `IN_PROGRESS`, el análisis no ha finalizado, y el estado de realización todavía no se ha publicado en el tema de Amazon SNS.
+ Compruebe que tiene un rol de servicio de IAM que concede a Amazon Rekognition Video permisos para publicar en los temas de Amazon SNS. Para obtener más información, consulte [Configuración de Amazon Rekognition Video](api-video-roles.md). 
+ Confirme que el rol de servicio de IAM que está utilizando puede publicarse en el tema de Amazon SNS mediante credenciales de rol y que los permisos de su rol de servicio están sujetos de forma segura a los recursos que está utilizando. Realice los pasos siguientes:
  + Obtenga el nombre de recurso de Amazon (ARN) del usuario:

    ```
    aws sts get-caller-identity --profile RekognitionUser 
    ```
  + Añada el ARN del usuario a la relación de confianza del rol. Para obtener más información, consulte [Modificación de un rol](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_manage_modify.html). El siguiente ejemplo de política de confianza especifica las credenciales del rol del usuario y restringe los permisos del rol de servicio solo a los recursos que está utilizando (para obtener más información sobre cómo limitar de forma segura el alcance de los permisos de un rol de servicio, consulte [Prevención de la sustitución confusa entre servicios](cross-service-confused-deputy-prevention.md)):
  + Asuma el rol: `aws sts assume-role --role-arn arn:Role ARN --role-session-name SessionName --profile RekognitionUser`
  + Publique en un tema de Amazon SNS: `aws sns publish --topic-arn arn:Topic ARN --message "Hello World!" --region us-east-1 --profile RekognitionUser`

  Si el comando AWS CLI funciona, recibirá el mensaje (en la bandeja de entrada del correo electrónico, si se ha suscrito al tema por correo electrónico). Si no recibe el mensaje:
  + Asegúrese de haber configurado Amazon Rekognition Video. Para obtener más información, consulte [Configuración de Amazon Rekognition Video](api-video-roles.md).
  + Asegúrese de que ha seguido los demás consejos que se ofrecen para esta pregunta.
+ Compruebe que está utilizando el tema de Amazon SNS correcto:
  + Si utiliza un rol de servicio de IAM para conceder a Amazon Rekognition Video acceso a un único tema de Amazon SNS, compruebe que ha dado permisos para el tema de Amazon SNS correcto. Para obtener más información, consulte [Otorgar acceso a un tema de Amazon SNS existente](api-video-roles.md#api-video-roles-single-topics).
  + Si utiliza un rol de servicio de IAM para dar acceso a Amazon Rekognition Video a varios temas de SNS, compruebe que está utilizando el tema correcto y que el nombre del tema va precedido de él. *AmazonRekognition* Para obtener más información, consulte [Otorgar acceso a varios temas de Amazon SNS](api-video-roles.md#api-video-roles-all-topics). 
  + Si utiliza una AWS Lambda función, confirme que su función Lambda esté suscrita al tema de Amazon SNS correcto. Para obtener más información, consulte [Distribución ramificada a las funciones de Lambda](https://docs.aws.amazon.com/sns/latest/dg/sns-lambda.html).
+ Si suscribe una cola de Amazon SQS al tema de Amazon SNS, compruebe que el tema de Amazon SNS tiene permisos para enviar mensajes a la cola de Amazon SQS. Para obtener más información, consulte [Dar permiso al tema de Amazon SNS para enviar mensajes a la cola de Amazon SQS](https://docs.aws.amazon.com/sns/latest/dg/subscribe-sqs-queue-to-sns-topic.html#SendMessageToSQS.sqs.permissions).

## Necesito ayuda adicional para solucionar el tema de Amazon SNS
<a name="video-troubleshoot-sns"></a>

Puede usarlo AWS X-Ray con Amazon SNS para rastrear y analizar los mensajes que viajan a través de su aplicación. Para obtener más información, consulte [Amazon SNS y. AWS X-Ray](https://docs.aws.amazon.com/xray/latest/devguide/xray-services-sns.html)

Para obtener ayuda adicional, puede publicar su pregunta en el foro de [Amazon Rekognition](https://forums.aws.amazon.com/forum.jspa?forumID=234) o considerar la posibilidad de registrarse para recibir [asistencia técnica de AWS](https://aws.amazon.com/premiumsupport/).