Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Automatisierte Bildgenerierung in Echtzeit
Amazon Kinesis Video Streams bietet die Möglichkeit, Bilder zu transkodieren und bereitzustellen. Kinesis Video Streams extrahiert automatisch Bilder aus Videodaten in Echtzeit und übermittelt die Bilder an Ihren angegebenen Amazon S3-Bucket. Die Implementierung einer automatisierten Bildextraktion in Echtzeit umfasst die folgenden Schritte:
Erstellen eines S3-Buckets zum Empfangen der generierten Bilder.
Konfiguration der ImageGenerationConfiguration Stream-Eigenschaft, die Kinesis Video Streams mitteilt, wie die Bilder erstellt und wohin sie gesendet werden sollen.
Tags zur Bildgenerierung hinzufügen — Kinesis Video Streams generiert Bilder nur mithilfe von Fragmenten, die das Bilderzeugungs-Tag tragen. Diese Tags werden beim Hochladen von Videos mithilfe des Kinesis Video Streams Producer SDK zusammen mit der Methode hinzugefügt.
putKinesisVideoEventMetadata
Die folgenden Verfahren enthalten Anweisungen zum Ausführen der einzelnen Schritte.
Wenn Sie einen vom Kunden verwalteten Schlüssel verwenden, stellen Sie sicher, dass die Rolle, die die PutMedia Aufrufe ausführt (Uploader), über die folgenden Berechtigungen verfügt, die zum Verschlüsseln und Entschlüsseln von Daten sowie für den Zugriff auf den Amazon S3-Bucket erforderlich sind.
-
kms:Encrypt -
kms:GenerateDataKey -
kms:Decrypt -
s3:PutObject
Weitere Informationen finden Sie unter Wie fange ich mit der serverseitigen Verschlüsselung an?.
Um das Ziel der generierten Bilder zu konfigurieren
Erstellen Sie einen S3-Ziel-Bucket, an den die Bilder gesendet werden.
Folgen Sie dem Amazon S3-Benutzerhandbuch, um einen Amazon S3-Bucket zu erstellen.
Notieren Sie sich die URI des Buckets, die Sie im nächsten Schritt benötigen, wenn Sie die Konfiguration für die Image-Generierung des Streams aktualisieren.
-
Stellen Sie sicher, dass Sie das AWS CLI installiert und konfiguriert haben. Weitere Informationen finden Sie im AWS Command Line Interface Benutzerhandbuch für Version 2.
-
Erstellen Sie eine neue Datei
update-image-generation-input.jsonmit dem Namen und dem folgenden Inhalt als Eingabe. Aktualisieren Sie die Platzhalterwerte mit den Werten, die Sie verwenden möchten. Die unterstützten Höchst- und Mindestwerte finden Sie in der UpdateImageGenerationConfiguration API.{ "StreamName": "demo-stream", "ImageGenerationConfiguration": { "Status": "ENABLED", "DestinationConfig": { "DestinationRegion": "us-east-1", "Uri": "s3://my-bucket-name" }, "SamplingInterval": 200, "ImageSelectorType": "PRODUCER_TIMESTAMP", "Format": "JPEG", "FormatConfig": { "JPEGQuality": "80" }, "WidthPixels": 320, "HeightPixels": 240 } } -
Aktualisieren Sie die Konfiguration der Bildgenerierung des Streams mithilfe der UpdateImageGenerationConfiguration API und hängen Sie die JSON-Datei als Eingabe an, wie im folgenden Befehl gezeigt. Beachten Sie, dass der Dateipfad auf die Datei im aktuellen Verzeichnis verweist.
aws kinesisvideo update-image-generation-configuration \ --cli-input-json file://./update-image-generation-input.json -
Bei Erfolg wird eine leere Antwort zurückgegeben und nichts wird in Ihrem Terminal gedruckt.
Anmerkung
Nach der Aktualisierung der Konfiguration zur Bildgenerierung dauert es mindestens 1 Minute, um den Arbeitsablauf zur Bildgenerierung zu starten. Warten Sie mindestens 1 Minute, bevor Sie das Video in Ihren Stream hochladen.
-
Überprüfen Sie die Konfigurationseinstellungen. Verwenden Sie die AWS CLI , um die DescribeImageGenerationConfiguration API für Ihren Stream aufzurufen.
aws kinesisvideo describe-image-generation-configuration \ --stream-name "demo-stream"
Kinesis Video Streams generiert und liefert nur Bilder für Fragmente, die das Image Generation Tag tragen. Alle zusätzlichen Fragment-Metadaten, die zusammen mit den Amazon S3-Image-Generierungs-Tags bereitgestellt werden, werden als Amazon S3-Metadaten gespeichert.
Anmerkung
Tags zur Bildgenerierung beziehen sich auf Fragment-Metadaten-Tags und nicht auf Tags auf Stream-Ebene.
Wichtig
Tags zur Bilderzeugung werden auf das Tag-Limit für Fragment-Metadaten angerechnet. Weitere Informationen finden Sie unter Kontingente für Streaming-Metadaten.
Im Folgenden finden Sie ein Beispiel dafür, wie die Struktur der Fragment-Metadaten-Tags mithilfe des mkvinfo Dienstprogramms aussieht. Das Tag zur Bilderzeugung ist ein einfaches MKV-Tag mit einem Schlüssel von AWS_KINESISVIDEO_IMAGE_GENERATION und ohne Wert. Weitere Informationen finden Sie unter Beispiel für Video-Tags
|+ Tags
| + Tag
| // MANDATORY: Predefined MKV tag to trigger image generation for the fragment
| + Simple
| + Name: AWS_KINESISVIDEO_IMAGE_GENERATION
| // OPTIONAL: S3 prefix which will be set as prefix for generated image.
| + Simple
| + Name: AWS_KINESISVIDEO_IMAGE_PREFIX
| + String: image_prefix_in_s3 // 256 bytes max
| // OPTIONAL: Key value pairs that will be persisted as S3 Image object metadata.
| + Simple
| + Name: CUSTOM_KEY_1 // Max 128 bytes
| + String: CUSTOM_VALUE_1 // Max 256 bytes
| + Simple
| + Name: CUSTOM_KEY_2 // Max 128 bytes
| + String: CUSTOM_VALUE_2 // Max 256 bytes
Hinzufügen von Tags zur Bildgenerierung zu Fragmenten
Kinesis Video Streams generiert und liefert Bilder nur für Fragmente, die mit dem Tag zur Bildgenerierung versehen sind. Kinesis Video Streams erkennt diese speziellen MKV-Tags und initiiert den Bildgenerierungs-Workflow auf der Grundlage der Bildverarbeitungskonfiguration des Streams.
Wenn Sie das Kinesis Video Streams Producer SDK zum Hochladen von Medien verwenden, verwenden Sie die putKinesisVideoEventMetadata Methode, um jedem Fragment, das Sie taggen möchten, das Tag für die Bildgenerierung hinzuzufügen. Ein neues Fragment beginnt, wenn putFrame es mit einem Frame aufgerufen wird, der das keyframe Flag enthält.
Wenn Sie ein aufgezeichnetes Video hochladen, wird es je nach Netzwerkgeschwindigkeit möglicherweise mit einer anderen Geschwindigkeit hochgeladen als der, mit der es aufgenommen wurde. Wir empfehlen, dass Sie den Producer-Zeitstempel verwenden, um die Bildgenerierung zu konfigurieren, wenn Sie Bilder in regelmäßigen Abständen auf der Grundlage der ursprünglichen Zeitstempel des Videos generieren möchten und nicht die Serverzeitstempel verwenden möchten, die auf der Geschwindigkeit basieren, mit der Amazon Kinesis Video Streams Ihr Video empfangen hat.
Ein vollständiges Beispiel für diesen Code finden Sie im Codebeispiel unter VideoOnlyRealtimeStreamingSample
// Setup sample frame MEMSET(frameBuffer, 0x00, frameSize); frame.frameData = frameBuffer; frame.version = FRAME_CURRENT_VERSION; frame.trackId = DEFAULT_VIDEO_TRACK_ID; frame.duration = HUNDREDS_OF_NANOS_IN_A_SECOND / DEFAULT_FPS_VALUE; frame.decodingTs = defaultGetTime(); // current time frame.presentationTs = frame.decodingTs; Frame eofr = EOFR_FRAME_INITIALIZER; while(defaultGetTime() > streamStopTime) { frame.index = frameIndex; frame.flags = fileIndex % DEFAULT_KEY_FRAME_INTERVAL == 0 ? FRAME_FLAG_KEY_FRAME : FRAME_FLAG_NONE; frame.size = SIZEOF(frameBuffer); CHK_STATUS(readFrameData(&frame, frameFilePath)); // 1. End the previous fragment if (frame.flags == FRAME_FLAG_KEY_FRAME && !firstFrame) { putKinesisVideoFrame(streamHandle, &eofr); } // 2. putFrame call CHK_STATUS(putKinesisVideoFrame(streamHandle, &frame)); if (frame.flags == FRAME_FLAG_KEY_FRAME) { // 3. Adding the image generation tag CHK_STATUS(putKinesisVideoEventMetadata(streamHandle, STREAM_EVENT_TYPE_IMAGE_GENERATION, NULL);) // 4. Adding fragment metadata for (n = 1; n <= 5; n++) { SNPRINTF(metadataKey, METADATA_MAX_KEY_LENGTH, "SAMPLE_KEY_%d", n); SNPRINTF(metadataValue, METADATA_MAX_VALUE_LENGTH, "SAMPLE_VALUE_%d", frame.index + n); CHK_STATUS(putKinesisVideoFragmentMetadata(streamHandle, metadataKey, metadataValue, FALSE)); } } defaultThreadSleep(frame.duration); frame.decodingTs += frame.duration; frame.presentationTs = frame.decodingTs; frameIndex++; fileIndex++; fileIndex = fileIndex % NUMBER_OF_FRAME_FILES; firstFrame = TRUE; } // 5. End the final fragment putKinesisVideoFrame(streamHandle, &eofr);
Die Elemente des Beispielcodes zum Einrichten von Beispielframes werden wie folgt erklärt:
-
Jedes Fragment muss mit einem Ende von fragment (
eofr) enden. Diese Anweisung besagt, dass jedes Mal, wenn ein neuer Keyframe empfangen wird, der den Beginn des nächsten Frames signalisiert, ein gesetzt wird,eofrbevor das nächste Bild zum Stream hinzugefügt wird. -
Fügt den aktuellen Frame in den Stream ein.
-
Fügen Sie das Tag zur Bilderzeugung hinzu. Die
putKinesisVideoEventMetadataMethode kann jederzeit nach demputFrame(keyFrame)Aufruf und vor dem aufgerufen werdenputFrame(eofr). Sie darf nur maximal einmal pro Fragment aufgerufen werden. Da jedes Fragment nur einen Keyframe haben wird, rufen wir ihn der Einfachheit halber zu diesem Zeitpunkt auf. Der Rückgabewert vonputKinesisVideoEventMetadatawird auf einen Erfolgscode (0) überprüft. -
Fügen Sie weitere benutzerdefinierte Fragment-Metadaten hinzu, die Kinesis Video Streams in Amazon S3-Objektmetadaten umwandelt.
-
Beenden Sie das letzte Fragment in dieser Upload-Sitzung.
Verwenden der Beispiele zum Hinzufügen von Tags zur Bildgenerierung
Sie können das kvs_gstreamer_audio_video_sample im C++ Producer SDK verwenden, wenn Sie eine Befehlszeilenoption zum Hinzufügen von Tags zur Bildgenerierung benötigen. Aktivieren Sie diese Funktion, indem Sie entweder das -e both Argument -e image oder hinzufügen, wie im folgenden Beispiel gezeigt.
./kvs_gstreamer_audio_video_samplestream-name\ -fvideo-to-upload.mp4\ -e both
Weitere Informationen zu dieser Beispielanwendung finden Sie im Amazon Kinesis Video Streams CPP Producer, im GStreamer-Plugin und in der JNI-README-Datei unter.
Amazon S3-Objektpfad (Bild)
Der S3-Objektpfad beschreibt den Ort auf dem konfigurierten S3-Bucket, an den das generierte Bild geliefert wird. Es verwendet das folgende Format:
ImagePrefix_AccountID_StreamName_ImageTimecode_RandomID.file-extension
Die Objektpfadelemente sind wie folgt definiert:
-
ImagePrefix- Wert vonAWS_KINESISVIDEO_IMAGE_PREFIX, falls vorhanden. -
AccountID— Die AWS-Konto ID, unter der der Stream erstellt wird. -
StreamName— Name des Streams, aus dem das Bild generiert wird. -
ImageTimecode- Epochen-Timecode (in Millisekunden) in dem Fragment, in dem das Bild generiert wird. -
RandomID- Zufällige GUID. -
file-extension- JPG oder PNG, basierend auf dem angeforderten Bildformat.
In diesem Beispiel sieht der Objektpfad für die generierten Bilder wie folgt aus:
111122223333_demo-stream_16907729324_f20f9add-75e7-4399-a30f-fc7aefb1bab7.jpg
Bildmetadaten werden abgerufen
Sie können die S3-Konsole oder CLI verwenden, um die Metadaten für die generierten Bilder abzurufen.
Kinesis Video Streams legt die Fragmentnummer, den Produzenten- und Serverzeitstempel sowie die Inhaltstyp-Metadaten des generierten Bilds fest, die alle als Amazon S3-Objektmetadaten formatiert sind. Wenn zusätzliche MKV-Tags vorhanden sind, werden diese Tags ebenfalls als Amazon S3-Objektmetadaten hinzugefügt. Das folgende Beispiel zeigt, wie der Amazon S3-API-Befehl head-object verwendet wird, um die Objektmetadaten abzurufen. Die Antwort enthält die von Kinesis Video Streams erstellten Metadaten.
aws s3api head-object --bucketmy-bucket-name--key111122223333_demo-stream_1690707290324_f20f9add-7e57-4399-a30f-fc7aefb1bab7.jpg{ "AcceptRanges": "bytes", "LastModified": "2023-07-30T08:54:51+00:00", "ContentLength": 22693, "ETag": "\"63e03cb6d57f77e2db984c1d344b1083\"", "ContentType": "image/jpeg", "ServerSideEncryption": "AES256", "Metadata": { "aws_kinesisvideo_producer_timestamp": "1690707290324", "aws_kinesisvideo_server_timestamp": "1690707289209", "aws_kinesisvideo_fragment_number": "91343852333182036507421233921329142742245756394" } }
Weitere Hinweise zu S3-Objektmetadaten finden Sie unterhttps://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingMetadata.html.
Amazon S3-URI-Empfehlungen zum Schutz vor Drosselung
Wenn Sie Tausende von Bildern in Amazon S3 schreiben, besteht das Risiko einer Drosselung. Weitere Informationen finden Sie unter Limits für S3-Präfix-Put-Anfragen.
Ein Amazon S3-Präfix beginnt mit einem PUT-Limit von 3.500 PUT-Anfragen pro Sekunde und wird im Laufe der Zeit für eindeutige Präfixe schrittweise erhöht. Vermeiden Sie die Verwendung von Datum und Uhrzeit als Amazon S3-Präfixe. Zeitcodierte Daten wirken sich jeweils auf ein Präfix aus und ändern sich auch regelmäßig, sodass frühere Präfix-Skalierungen ungültig werden.
Um eine schnellere, konsistente Amazon S3-Skalierung zu ermöglichen, empfehlen wir, der Amazon S3-Ziel-URI ein zufälliges Präfix hinzuzufügen, z. B. einen Hex-Code oder eine UUID. Beispielsweise teilen Hex-Code-Präfixe Ihre Anfragen auf natürliche Weise nach dem Zufallsprinzip auf 16 verschiedene Präfixe auf (ein Präfix für jedes eindeutige Hex-Zeichen), sodass nach der automatischen Skalierung von Amazon S3 56.000 PUT-Anfragen pro Sekunde möglich sind.