Rilevamento dei cambi di inquadratura

L'analisi del cambio di inquadratura rileva i cambi di inquadratura in un video.

Questa sezione illustra alcuni modi per analizzare un video per il cambio di inquadratura.

Ecco un esempio di analisi video per i cambi di inquadratura su un file in Cloud Storage.

Cerchi qualcosa di più approfondito? Guarda il nostro tutorial su Python dettagliato.

REST

Invia richiesta di annotazione video

Di seguito viene illustrato come inviare una richiesta POST al metodo videos:annotate. L'esempio utilizza Google Cloud CLI per creare un token di accesso. Per istruzioni sull'installazione di gcloud CLI, consulta la guida rapida dell'API Video Intelligence.

Prima di utilizzare i dati della richiesta, effettua le seguenti sostituzioni:

  • INPUT_URI: un bucket Cloud Storage che contiene il file su cui vuoi annotare il nome, incluso il nome. Deve iniziare con gs://.
  • PROJECT_NUMBER: l'identificatore numerico del tuo progetto Google Cloud

Metodo HTTP e URL:

POST https://videointelligence.googleapis.com/v1/videos:annotate

Corpo JSON della richiesta:

{
    "inputUri": "INPUT_URI",
    "features": ["SHOT_CHANGE_DETECTION"]
}

Per inviare la richiesta, espandi una di queste opzioni:

Dovresti ricevere una risposta JSON simile alla seguente:

Se la risposta ha esito positivo, l'API Video Intelligence restituisce name per la tua operazione. Quanto riportato sopra mostra un esempio di questa risposta, dove project-name è il nome del progetto e operation-id è l'ID dell'operazione a lunga esecuzione creata per la richiesta.

  • PROJECT_NUMBER: il numero del progetto
  • LOCATION_ID: la regione Cloud in cui deve avvenire l'annotazione. Le regioni cloud supportate sono: us-east1, us-west1, europe-west1 e asia-east1. Se non viene specificata alcuna regione, verrà determinata in base alla posizione del file video.
  • OPERATION_ID: l'ID dell'operazione a lunga esecuzione creata per la richiesta e fornito nella risposta al momento dell'avvio dell'operazione, ad esempio 12345....

Recupero risultati annotazioni

Per recuperare il risultato dell'operazione, effettua una richiesta GET utilizzando il nome dell'operazione restituito dalla chiamata a videos:annotate, come mostrato nell'esempio seguente.

Prima di utilizzare i dati della richiesta, effettua le seguenti sostituzioni:

  • OPERATION_NAME: il nome dell'operazione restituito dall'API Video Intelligence. Il nome dell'operazione ha il formato projects/PROJECT_NUMBER/locations/LOCATION_ID/operations/OPERATION_ID
  • PROJECT_NUMBER: l'identificatore numerico del tuo progetto Google Cloud

Metodo HTTP e URL:

GET https://videointelligence.googleapis.com/v1/OPERATION_NAME

Per inviare la richiesta, espandi una di queste opzioni:

Dovresti ricevere una risposta JSON simile alla seguente:

Le annotazioni di rilevamento di scatti vengono restituite come elenco shotAnnotations. Nota: il campo done viene restituito solo quando il valore è True. Non è incluso nelle risposte per le quali l'operazione non è stata completata.

Scarica risultati annotazioni

Copia l'annotazione dall'origine al bucket di destinazione: (vedi Copiare file e oggetti)

gsutil cp gcs_uri gs://my-bucket

Nota: se l'URI GCS di output viene fornito dall'utente, l'annotazione viene archiviata in quell'URI.

Go


func shotChangeURI(w io.Writer, file string) error {
	ctx := context.Background()
	client, err := video.NewClient(ctx)
	if err != nil {
		return err
	}
	defer client.Close()

	op, err := client.AnnotateVideo(ctx, &videopb.AnnotateVideoRequest{
		Features: []videopb.Feature{
			videopb.Feature_SHOT_CHANGE_DETECTION,
		},
		InputUri: file,
	})
	if err != nil {
		return err
	}
	resp, err := op.Wait(ctx)
	if err != nil {
		return err
	}

	// A single video was processed. Get the first result.
	result := resp.AnnotationResults[0].ShotAnnotations

	for _, shot := range result {
		start, _ := ptypes.Duration(shot.StartTimeOffset)
		end, _ := ptypes.Duration(shot.EndTimeOffset)

		fmt.Fprintf(w, "Shot: %s to %s\n", start, end)
	}

	return nil
}

Java

Per eseguire l'autenticazione a Video Intelligence, configura Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.

// Instantiate a com.google.cloud.videointelligence.v1.VideoIntelligenceServiceClient
try (VideoIntelligenceServiceClient client = VideoIntelligenceServiceClient.create()) {
  // Provide path to file hosted on GCS as "gs://bucket-name/..."
  AnnotateVideoRequest request =
      AnnotateVideoRequest.newBuilder()
          .setInputUri(gcsUri)
          .addFeatures(Feature.SHOT_CHANGE_DETECTION)
          .build();

  // Create an operation that will contain the response when the operation completes.
  OperationFuture<AnnotateVideoResponse, AnnotateVideoProgress> response =
      client.annotateVideoAsync(request);

  System.out.println("Waiting for operation to complete...");
  // Print detected shot changes and their location ranges in the analyzed video.
  for (VideoAnnotationResults result : response.get().getAnnotationResultsList()) {
    if (result.getShotAnnotationsCount() > 0) {
      System.out.println("Shots: ");
      for (VideoSegment segment : result.getShotAnnotationsList()) {
        double startTime =
            segment.getStartTimeOffset().getSeconds()
                + segment.getStartTimeOffset().getNanos() / 1e9;
        double endTime =
            segment.getEndTimeOffset().getSeconds()
                + segment.getEndTimeOffset().getNanos() / 1e9;
        System.out.printf("Location: %.3f:%.3f\n", startTime, endTime);
      }
    } else {
      System.out.println("No shot changes detected in " + gcsUri);
    }
  }
}

Node.js

Per eseguire l'autenticazione a Video Intelligence, configura Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.

// Imports the Google Cloud Video Intelligence library
const video = require('@google-cloud/video-intelligence').v1;

// Creates a client
const client = new video.VideoIntelligenceServiceClient();

/**
 * TODO(developer): Uncomment the following line before running the sample.
 */
// const gcsUri = 'GCS URI of file to analyze, e.g. gs://my-bucket/my-video.mp4';

const request = {
  inputUri: gcsUri,
  features: ['SHOT_CHANGE_DETECTION'],
};

// Detects camera shot changes
const [operation] = await client.annotateVideo(request);
console.log('Waiting for operation to complete...');
const [operationResult] = await operation.promise();
// Gets shot changes
const shotChanges = operationResult.annotationResults[0].shotAnnotations;
console.log('Shot changes:');

if (shotChanges.length === 1) {
  console.log('The entire video is one shot.');
} else {
  shotChanges.forEach((shot, shotIdx) => {
    console.log(`Scene ${shotIdx} occurs from:`);
    if (shot.startTimeOffset === undefined) {
      shot.startTimeOffset = {};
    }
    if (shot.endTimeOffset === undefined) {
      shot.endTimeOffset = {};
    }
    if (shot.startTimeOffset.seconds === undefined) {
      shot.startTimeOffset.seconds = 0;
    }
    if (shot.startTimeOffset.nanos === undefined) {
      shot.startTimeOffset.nanos = 0;
    }
    if (shot.endTimeOffset.seconds === undefined) {
      shot.endTimeOffset.seconds = 0;
    }
    if (shot.endTimeOffset.nanos === undefined) {
      shot.endTimeOffset.nanos = 0;
    }
    console.log(
      `\tStart: ${shot.startTimeOffset.seconds}` +
        `.${(shot.startTimeOffset.nanos / 1e6).toFixed(0)}s`
    );
    console.log(
      `\tEnd: ${shot.endTimeOffset.seconds}.` +
        `${(shot.endTimeOffset.nanos / 1e6).toFixed(0)}s`
    );
  });
}

Python

Per ulteriori informazioni sull'installazione e sull'utilizzo della libreria client dell'API Video Intelligence per Python, consulta la pagina relativa alle librerie client dell'API Video Intelligence.
"""Detects camera shot changes."""
video_client = videointelligence.VideoIntelligenceServiceClient()
features = [videointelligence.Feature.SHOT_CHANGE_DETECTION]
operation = video_client.annotate_video(
    request={"features": features, "input_uri": path}
)
print("\nProcessing video for shot change annotations:")

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

# first result is retrieved because a single video was processed
for i, shot in enumerate(result.annotation_results[0].shot_annotations):
    start_time = (
        shot.start_time_offset.seconds + shot.start_time_offset.microseconds / 1e6
    )
    end_time = (
        shot.end_time_offset.seconds + shot.end_time_offset.microseconds / 1e6
    )
    print("\tShot {}: {} to {}".format(i, start_time, end_time))

Linguaggi aggiuntivi

C#: segui le istruzioni di configurazione di C# nella pagina delle librerie client e poi consulta la documentazione di riferimento di Video Intelligence per .NET.

PHP: segui le istruzioni per la configurazione dei file PHP nella pagina delle librerie client e consulta la documentazione di riferimento di Video Intelligence per PHP.

Ruby: segui le istruzioni per la configurazione di Ruby nella pagina delle librerie client e visita la documentazione di riferimento di Video Intelligence per Ruby.