Anleitung zur Erkennung von Szenenwechseln

Audience

In dieser Anleitung erfahren Sie, wie Sie Anwendungen mit der Video Intelligence API schnell entdecken und entwickeln. Die Anleitung richtet sich an Nutzer, die mit den Grundlagen des Programmierens vertraut sind, ist jedoch auch ohne viel Programmierwissen verständlich. Nachdem Sie die Anleitung durchgegangen sind, sollten Sie in der Lage sein, mithilfe der Referenzdokumentation Ihre eigenen grundlegenden Anwendungen zu erstellen.

In dieser Anleitung wird die Verwendung der Video Intelligence API mit Python-Code schrittweise erläutert. Dabei wird nicht erläutert, wie die Python-Clientbibliotheken funktionieren, sondern wie Aufrufe an die Video Intelligence API erfolgen. Anwendungen in Java und Node.js verhalten sich im Wesentlichen ähnlich.

Wenn Sie ein reines Code-Beispiel oder ein Beispiel in einer anderen Sprache benötigen, lesen Sie im begleitenden Handbuch nach.

Voraussetzungen

Diese Anleitung setzt Folgendes voraus:

Mit der Szenenwechselerkennung Anmerkungen zu einem Video hinzufügen

In dieser Anleitung wird eine einfache Video API-Anwendung mit der Anfrage SHOT_CHANGE_DETECTION erläutert. Die Anfrage SHOT_CHANGE_DETECTION liefert diese Anmerkungsergebnisse:

  • Liste aller Szenen, die im Video vorkommen
  • Start- und Endzeit jeder Szene

Zuerst zeigen wir den gesamten Code. Wir haben die meisten Kommentare aus diesem Code entfernt, um zu zeigen, wie kurz er ist. Während wir den Code durchgehen, kommen jedoch weitere Kommentare hinzu.

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(input_uri=path, features=features)
    print('\nProcessing video for shot change annotations:')

    result = operation.result(timeout=120)
    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)

Diese einfache Anwendung:

  • Importiert die für die Ausführung der Anwendung erforderlichen Bibliotheken
  • Nimmt eine im Cloud Storage-URI gespeicherte Videodatei als Argument an die main()-Funktion.
  • Ruft Anmeldeinformationen zum Ausführen des Diensts der Video Intelligence API ab
  • Erstellt eine Anfrage nach Videoanmerkungen, die an den Videodienst gesendet wird
  • Sendet die Anfrage und gibt einen lange laufenden Vorgang zurück
  • Stellt den lang andauernden Vorgang in eine Warteschleife, bis das Video verarbeitet wurde, und gibt verfügbare Werte zurück.
  • Analysiert die Antwort des Diensts und zeigt dem Nutzer die Antwort an.

Diese Schritte werden unten ausführlicher besprochen.

Bibliotheken importieren

import argparse

from google.cloud import videointelligence

Wir importieren argparse, damit die Anwendung Eingabedateinamen als Argumente akzeptieren kann.

Für die Verwendung der Cloud Video Intelligence API importieren wir auch die google.cloud.videointelligence-Bibliothek, die das Verzeichnis unserer API-Aufrufe und Aufzählungskonstanten enthält.

Anwendung ausführen

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)

Hier analysieren wir das übergebene Argument für den Google Cloud Storage-URI des Namens der Videodatei und übergeben es an die Funktion main().

Bei der API authentifizieren

Bevor Sie mit dem Dienst der Video Intelligence API kommunizieren, müssen Sie den Dienst mithilfe zuvor erworbener Anmeldeinformationen authentifizieren. Innerhalb einer Anwendung erhalten Sie die Anmeldedaten am einfachsten über die Verwendung der Standardanmeldedaten für Anwendungen (ADC). Standardmäßig ruft ADC die Anmeldedaten von der GOOGLE_APPLICATION_CREDENTIALS-Umgebungsdatei ab, die so festgelegt sein muss, dass sie auf die JSON-Schlüsseldatei Ihres Dienstkontos verweist. (Sie müssen Ihr Dienstkonto und die Umgebung, wie in der Kurzanleitung beschrieben, zur Verwendung von ADC eingerichtet haben. Weitere Informationen finden Sie unter Dienstkonto einrichten.)

Anfrage erstellen

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

Jetzt, da der Dienst der Video Intelligence API bereit ist, können wir eine Anfrage für diesen Dienst erstellen. Anfragen an die Video Intelligence API werden als JSON-Objekte bereitgestellt. Vollständige Informationen zur spezifischen Struktur einer solchen Anfrage finden Sie in der Video Intelligence API-Referenz.

Dieses Code-Snippet:

  1. Konstruiert das JSON für eine POST-Anfrage an die Methode annotate_video()
  2. Injiziert den Google Cloud Storage-Speicherort des übergebenen Videodateinamens in die Anfrage
  3. Gibt an, dass die Methode annotate eine SHOT_CHANGE_DETECTION ausführen soll.

Lange laufende Vorgänge konstruieren

Wenn wir zum ersten Mal eine Anfrage an die Video Intelligence API senden, erhalten wir kein direktes Ergebnis, sondern einen Vorgangsnamen, der im Feld name der Antwort enthalten ist. Diesen können wir später zum Aufrufen der Ergebnisse verwenden.

Die Übergabe des Vorgangsnamens (eines numerischen Strings) an die operations-Methode Operations Service der Video Intelligence API liefert den aktuellen Status des Vorgangs. Eine Beispielantwort sehen Sie hier:

{
   "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"
   }
}

Beachten Sie, dass das Feld response derzeit nur das Feld @type enthält, das den Typ dieser Antwort angibt. Sobald die tatsächlichen Ergebnisse verfügbar sind, enthält das Antwortfeld Ergebnisse dieses Typs.

Vorgang überprüfen

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

Unter Verwendung der Anfrage für unseren bestehenden Vorgang konstruieren wir eine while-Schleife, um den Zustand dieses Vorgangs regelmäßig zu prüfen. Sobald unser Vorgang den Status done angibt, beenden wir die Schleife und können nun die Antwort analysieren.

Antwort parsen

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

Sobald der Vorgang abgeschlossen ist, enthält die Antwort eine AnnotateVideoResponse, die aus einer Liste von annotationResults für jedes in der Anfrage gesendete Video besteht. Da in der Anfrage nur ein Video gesendet wurde, wird das erste shotAnnotations des Ergebnisses verwendet. Wir gehen alle "Segmente" des Videos durch.

Anwendung ausführen

Sie können die Anwendung starten, indem Sie einfach den Cloud Storage-URI eines Videos übergeben:

$ 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

Das wars! Sie haben eine Annotationsaufgabe mit der Video Intelligence API ausgeführt.