Tutorial de detección de cambio de plano

Destinatarios

Este tutorial está diseñado para que puedas comenzar rápidamente a explorar y desarrollar aplicaciones con la API Video Intelligence de Cloud. Asimismo, está dirigido a personas familiarizadas con la programación básica, aunque, incluso sin mucho conocimiento de programación, deberían ser capaces de seguirlo. Después de haber seguido este tutorial, podrás utilizar la documentación de referencia para crear tus propias aplicaciones básicas.

Este tutorial avanza a través de una aplicación de la API Video Intelligence que usa el código de Python. Aquí el propósito no es explicar las bibliotecas cliente de Python, sino cómo hacer llamadas a la API Video Intelligence. Las aplicaciones en Java y Node.js son, en esencia, similares.

Si estás buscando un ejemplo de solo código o un ejemplo en otro idioma, consulta la guía práctica complementaria.

Requisitos previos

Este tutorial cuenta con varios requisitos previos:

Realizar anotaciones en un vídeo mediante la detección de cambio de plano

Este tutorial te guía a través de una aplicación básica de API de vídeo mediante una petición SHOT_CHANGE_DETECTION. Las peticiones SHOT_CHANGE_DETECTION proporcionan los resultados de la anotación:

  • Una lista de todos los planos que ocurren dentro del vídeo
  • Proporciona el tiempo de inicio y finalización de cada plano

Primero mostraremos todo el código. Ten en cuenta que hemos eliminado la mayoría de los comentarios de este código para mostrarte lo breve que es. Proporcionaremos más comentarios a medida que avancemos por el código.

import argparse

from google.cloud import videointelligence

def analyze_shots(path):
    """ Detects camera shot changes. """
    video_client = videointelligence.VideoIntelligenceServiceClient()
    features = [videointelligence.enums.Feature.SHOT_CHANGE_DETECTION]
    operation = video_client.annotate_video(path, features=features)
    print('\nProcessing video for shot change annotations:')

    result = operation.result(timeout=90)
    print('\nFinished processing.')

    for i, shot in enumerate(result.annotation_results[0].shot_annotations):
        start_time = (shot.start_time_offset.seconds +
                      shot.start_time_offset.nanos / 1e9)
        end_time = (shot.end_time_offset.seconds +
                    shot.end_time_offset.nanos / 1e9)
        print('\tShot {}: {} to {}'.format(i, start_time, end_time))

if __name__ == '__main__':
    parser = argparse.ArgumentParser(
        description=__doc__,
        formatter_class=argparse.RawDescriptionHelpFormatter)
    parser.add_argument('path', help='GCS path for shot change detection.')
    args = parser.parse_args()

    analyze_shots(args.path)

Esta sencilla aplicación realiza las siguientes tareas:

  • Importa las bibliotecas necesarias para ejecutar la aplicación
  • Toma un archivo de vídeo almacenado en el URI de Google Cloud Storage como argumento y lo pasa a la función main()
  • Obtiene las credenciales para ejecutar el servicio de la API Video Intelligence
  • Crea una petición de anotación de vídeo que enviar al servicio de vídeo
  • Envía la petición y devuelve una operación de larga ejecución
  • Crea un bucle en la operación de larga ejecución hasta que el vídeo se procesa y los valores de devolución están disponibles
  • Analiza la respuesta del servicio y la muestra al usuario

A continuación, repasaremos estos pasos con más detalle.

Importar bibliotecas

import argparse

from google.cloud import videointelligence

Importamos argparse para permitir que la aplicación acepte los nombres de los archivos de entrada como argumentos.

Para utilizar la API Video Intelligence de Cloud, también importamos la biblioteca google.cloud.videointelligence, que contiene el directorio de nuestras llamadas a la API y las constantes de enumeración.

Ejecutar la aplicación

parser = argparse.ArgumentParser(
    description=__doc__,
    formatter_class=argparse.RawDescriptionHelpFormatter)
parser.add_argument('path', help='GCS path for shot change detection.')
args = parser.parse_args()

analyze_shots(args.path)

Aquí analizamos el argumento pasado del URI de Google Cloud Storage del nombre de archivo del vídeo y lo pasamos a la función main().

Autenticar a la API

Antes de comunicarte con el servicio de API Video Intelligence, debes autenticar tu servicio mediante las credenciales adquiridas previamente. Dentro de una aplicación, la forma más sencilla de obtener credenciales es usar Credenciales de aplicación predeterminadas (ADC). De forma predeterminada, ADC intentará obtener credenciales del archivo de entorno GOOGLE_APPLICATION_CREDENTIALS, que debe configurarse para que apunte al archivo de clave JSON de tu cuenta de servicio. Debes haber configurado tu cuenta de servicio y tu entorno para usar ADC en el Inicio rápido. Consulta el apartado sobre configuración de una cuenta de servicio para obtener más información.

Generar la petición

video_client = videointelligence.VideoIntelligenceServiceClient()
features = [videointelligence.enums.Feature.SHOT_CHANGE_DETECTION]
operation = video_client.annotate_video(path, features=features)

Ahora que está listo nuestro servicio de API Video Intelligence, podemos crear una petición para ese servicio. Las peticiones a la API Video Intelligence de Cloud se proporcionan como objetos JSON. Consulta la referencia de la API Video Intelligence para obtener información completa sobre la estructura específica de dicha petición.

Este fragmento de código realiza las siguientes tareas:

  1. Construye el JSON para una petición POST al método annotate_video().
  2. Inyecta la ubicación de Google Cloud Storage de nuestro nombre de archivo de vídeo pasado en la petición.
  3. Indica que el método annotate debe realizar SHOT_CHANGE_DETECTION.

Generar la operación de ejecución larga

Cuando ejecutamos por primera vez una petición para la API Video Intelligence, no obtenemos un resultado inmediato; en lugar de ello, obtenemos un nombre de operación, almacenado dentro del campo de respuesta name, que luego podemos utilizar para verificar resultados en un momento posterior.

Al pasar el nombre de esa operación (que es una cadena numérica) al método de servicio de operaciones operations de la API Video Intelligence, se devuelve el estado actual de la operación. A continuación, se muestra una respuesta de ejemplo:

{
   "response":{
      "@type":"type.googleapis.com/google.cloud.videointelligence.v1.AnnotateVideoResponse"
   },
   "name":"us-west1.17159971042783089144",
   "metadata":{
      "annotationProgress":[
         {
            "inputUri":"/demomaker/gbikes_dinosaur.mp4",
            "updateTime":"2017-01-27T19:45:54.297807Z",
            "startTime":"2017-01-27T19:45:54.275023Z"
         }
      ],
      "@type":"type.googleapis.com/google.cloud.videointelligence.v1.AnnotateVideoProgress"
   }
}

Ten en cuenta que el campo de response en este momento solo contiene un campo @type, que denota el tipo de esa respuesta. Una vez que los resultados estén realmente disponibles, el campo de respuesta contendrá resultados de ese tipo.

Comprobar la operación

result = operation.result(timeout=90)
print('\nFinished processing.')

Al utilizar la petición de operación existente para nuestra operación, generamos un bucle de while para comprobar periódicamente el estado de esa operación. Una vez que nuestra operación ha indicado que la operación está done, salimos del ciclo y podemos analizar la respuesta.

Analizar la respuesta

for i, shot in enumerate(result.annotation_results[0].shot_annotations):
    start_time = (shot.start_time_offset.seconds +
                  shot.start_time_offset.nanos / 1e9)
    end_time = (shot.end_time_offset.seconds +
                shot.end_time_offset.nanos / 1e9)
    print('\tShot {}: {} to {}'.format(i, start_time, end_time))

Una vez completada la operación, la respuesta contendrá un retorno AnnotateVideoResponse, que consta de una lista de resultados de annotationResults, uno para cada vídeo enviado en la petición. Dado que enviamos solo un vídeo en la petición, tomamos las primeras shotAnnotations del resultado. Pasamos por todos los "segmentos" del vídeo.

Ejecutar nuestra aplicación

Para ejecutar nuestra aplicación, simplemente pasa el URI de Google Cloud Storage de un vídeo:

$ python shotchange.py gs://demomaker/gbikes_dinosaur.mp4
operationId=us-west1.12468772851081463748
Operation us-west1.12468772851081463748 started: 2017-01-30T01:53:45.981043Z
Processing video for shot change annotations:
Finished processing.
  Shot 0: 0.0 to 5.166666
  Shot 1: 5.233333 to 10.066666
  Shot 2: 10.1 to 28.133333
  Shot 3: 28.166666 to 42.766666

¡Enhorabuena! ¡Has realizado una tarea de anotación con la API Video Intelligence de Cloud!

¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...

Cloud Video Intelligence API Documentation