Szenenwechsel erkennen

Die Szenenwechselanalyse erkennt Szenenwechsel in einem Video.

In diesem Abschnitt werden einige Möglichkeiten zum Analysieren eines Videos auf Szenenwechsel hin beschrieben.

Hier finden Sie ein Beispiel für die Analyse eines Videos auf Szenenwechsel hin anhand einer Datei aus Cloud Storage.

Benötigen Sie ausführlichere Informationen? Diese finden Sie in unserer detaillierten Anleitung für Python.

REST

Anfrage zur Annotation eines Videos senden

Im Folgenden wird gezeigt, wie Sie eine POST-Anfrage an die Methode videos:annotate senden. In diesem Beispiel wird die Google Cloud CLI verwendet, um ein Zugriffstoken zu erstellen. Eine Anleitung zum Installieren der gcloud CLI finden Sie in der Video Intelligence API-Kurzanleitung.

Bevor Sie die Anfragedaten verwenden, ersetzen Sie die folgenden Werte:

  • INPUT_URI: Ein Cloud Storage-Bucket, der die Datei enthält, die Sie annotieren möchten, einschließlich des Dateinamens. Muss mit gs:// beginnen.
  • PROJECT_NUMBER: Die numerische Kennung Ihres Google Cloud-Projekts

HTTP-Methode und URL:

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

JSON-Text der Anfrage:

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

Wenn Sie die Anfrage senden möchten, maximieren Sie eine der folgenden Optionen:

Sie sollten in etwa folgende JSON-Antwort erhalten:

Wenn die Antwort erfolgreich ist, gibt die Video Intelligence API den name für Ihren Vorgang zurück. Das Beispiel oben zeigt eine solche Antwort, wobei project-name der Name Ihres Projekts und operation-id die ID des lang andauernden Vorgangs ist, der für die Anfrage erstellt wurde.

  • PROJECT_NUMBER: Die Nummer Ihres Projekts
  • LOCATION_ID: Die Cloud-Region, in der die Annotation stattfinden soll. Unterstützte Cloud-Regionen sind: us-east1, us-west1, europe-west1, asia-east1. Wenn keine Region angegeben ist, wird eine Region basierend auf dem Speicherort der Videodatei festgelegt.
  • OPERATION_ID: Die ID des lang andauernden Vorgangs, der für die Anfrage erstellt und in der Antwort beim Start des Vorgangs angegeben wurde, z. B. 12345....

Ruft Annotationsergebnisse ab

Um das Ergebnis des Vorgangs abzurufen, senden Sie eine GET-Anfrage. Verwenden Sie dabei den Vorgangsnamen, der vom Aufruf von videos:annotate zurückgegeben wurde, wie im folgenden Beispiel gezeigt.

Bevor Sie die Anfragedaten verwenden, ersetzen Sie die folgenden Werte:

  • OPERATION_NAME: Der von der Video Intelligence API zurückgegebene Name des Vorgangs. Der Vorgangsname hat das Format projects/PROJECT_NUMBER/locations/LOCATION_ID/operations/OPERATION_ID.
  • PROJECT_NUMBER: Die numerische Kennung Ihres Google Cloud-Projekts

HTTP-Methode und URL:

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

Wenn Sie die Anfrage senden möchten, maximieren Sie eine der folgenden Optionen:

Sie sollten eine JSON-Antwort ähnlich wie diese erhalten:

Anmerkungen der Szenenerkennung werden in der Liste shotAnnotations zurückgegeben. Hinweis: Das Feld done wird nur zurückgegeben, wenn sein Wert True ist. Es ist nicht in Antworten enthalten, für die der Vorgang nicht abgeschlossen wurde.

Annotationsergebnisse herunterladen

Kopieren Sie die Annotation aus der Quelle in den Ziel-Bucket (siehe Dateien und Objekte kopieren)

gsutil cp gcs_uri gs://my-bucket

Hinweis: Wenn der Nutzer den Ausgabe-gcs-URI vom Nutzer bereitstellt, wird die Annotation in diesem gcs-uri gespeichert.

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

Richten Sie Standardanmeldedaten für Anwendungen ein, um sich bei Video Intelligence zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.

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

Richten Sie Standardanmeldedaten für Anwendungen ein, um sich bei Video Intelligence zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.

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

Weitere Informationen zum Installieren und Verwenden der Video Intelligence API-Clientbibliothek für Python finden Sie unter Video Intelligence API-Clientbibliotheken.
"""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))

Weitere Sprachen

C#: Folgen Sie der Anleitung zur Einrichtung von C# auf der Seite der Clientbibliotheken und rufen Sie dann die Video Intelligence-Referenzdokumentation für .NET auf.

PHP: Folgen Sie der Anleitung zur Einrichtung von PHP auf der Seite der Clientbibliotheken und rufen Sie dann die Video Intelligence-Referenzdokumentation für PHP auf.

Ruby: Folgen Sie der Anleitung zur Einrichtung von Ruby auf der Seite der Clientbibliotheken und rufen Sie dann die Video Intelligence-Referenzdokumentation für Ruby auf.