Streamen Sie Video in Ihren Kinesis-Videostream - Amazon Kinesis Video Streams

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.

Streamen Sie Video in Ihren Kinesis-Videostream

Zur Ausführung der Beispielanwendung benötigen Sie die folgenden Informationen:

  1. Legen Sie die Anmeldeinformationen und die Region fest.

    export AWS_ACCESS_KEY_ID=YourAccessKey export AWS_SECRET_ACCESS_KEY=YourSecretKey export AWS_DEFAULT_REGION=us-west-2

    Weitere Authentifizierungsmethoden finden Sie unterGeben Sie Anmeldeinformationen ein für kvssink.

    Anmerkung

    Der C++-Producer SDK verwendet standardmäßig die Region USA West (Oregonus-west-2) (). Um die Standardeinstellung zu verwenden, AWS-Region erstellen Sie Ihren Kinesis-Videostream in der Region USA West (Oregon).

    Um eine andere Region für Ihren Kinesis-Videostream zu verwenden, legen Sie die folgende Umgebungsvariable auf Ihre Region fest (z. B.us-east-1):

    export AWS_DEFAULT_REGION=us-east-1
  2. Wählen Sie je nach Eingabemedium eine der folgenden Optionen aus:

    Sample Gstreamer video

    Diese GStreamer Pipeline generiert einen Live-Testvideostream mit einem Standardtestmuster, das mit 10 Bildern pro Sekunde und einer Auflösung von 640 x 480 Pixeln läuft. Es wird ein Overlay hinzugefügt, das die aktuelle Systemzeit und das aktuelle Systemdatum anzeigt. Das Video wird dann in das H.264-Format codiert und Keyframes werden höchstens alle 10 Frames generiert, was zu einer Fragmentdauer (auch bekannt als Größe einer Bildergruppe (GoP)) von 1 Sekunde. kvssink nimmt den H.264-codierten Videostream, packt ihn in das Matroska (MKV) -Containerformat und lädt ihn in Ihren Kinesis-Videostream hoch.

    Führen Sie den folgenden Befehl aus:

    gst-launch-1.0 -v videotestsrc is-live=true \ ! video/x-raw,framerate=10/1,width=640,height=480 \ ! clockoverlay time-format="%a %B %d, %Y %I:%M:%S %p" \ ! x264enc bframes=0 key-int-max=10 \ ! h264parse \ ! kvssink stream-name="YourStreamName"

    Um die CTRLPipeline zu beenden, GStreamer wählen Sie das Terminalfenster aus und drücken Sie +C.

    Die GStreamer Beispielvideopipeline sieht wie folgt aus:

    Bild des Standardtestmusters mit überlagertem Datums- und Zeitstempel.
    USB webcam

    Führen Sie den folgenden Befehl aus, damit Ihre USB Kamera GStreamer automatisch erkannt wird:

    gst-launch-1.0 autovideosrc \ ! videoconvert \ ! video/x-raw,format=I420,width=640,height=480 \ ! x264enc bframes=0 key-int-max=45 tune=zerolatency byte-stream=true speed-preset=ultrafast \ ! h264parse \ ! video/x-h264,stream-format=avc,alignment=au,profile=baseline \ ! kvssink stream-name="YourStreamname"

    Um die GStreamer Pipeline zu stoppen, wählen Sie das Terminalfenster aus und drücken Sie CTRL+C.

    Anstatt die GStreamer automatische Erkennung zu verwenden, können Sie es v4l2src mit einer bestimmten Gerätekennung verwenden. Führen Sie den folgenden Befehl aus:

    gst-device-monitor-1.0

    In der Ausgabe sehen Sie einige Geräte und den Beginn einer GStreamer Pipeline zur Verwendung des Geräts:

    Device found: name : H264 USB Camera: USB Camera class : Video/Source caps : video/x-h264, stream-format=(string)byte-stream, alignment=(string)au, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, colorimetry=(string){ 2:4:7:1 }, framerate=(fraction){ 30/1, 25/1, 15/1 }; ... properties: device.path = /dev/video4 udev-probed = false device.api = v4l2 v4l2.device.driver = uvcvideo v4l2.device.card = "H264\ USB\ Camera:\ USB\ Camera" v4l2.device.bus_info = usb-3f980000.usb-1.3 v4l2.device.version = 265767 (0x00040e27) v4l2.device.capabilities = 2216689665 (0x84200001) v4l2.device.device_caps = 69206017 (0x04200001) gst-launch-1.0 v4l2src device=/dev/video4 ! ...

    Um die GStreamer Pipeline zu beenden, wählen Sie das Terminalfenster aus und drücken Sie CTRL+C.

    Raspberry Pi camera module 1

    Wenn Sie das Pi-Kameramodul 1 oder das Pi-Kameramodul 2 mit verwendenbcm2835-v4l2, verwenden Sie Folgendes:

    gst-launch-1.0 v4l2src device=/dev/video0 \ ! videoconvert \ ! video/x-raw,format=I420,width=640,height=480 \ ! x264enc bframes=0 key-int-max=45 bitrate=500 tune=zerolatency \ ! h264parse ! video/x-h264,stream-format=avc,alignment=au,profile=baseline \ ! kvssink stream-name="YourStreamname"

    Um die GStreamer Pipeline zu stoppen, wählen Sie das Terminalfenster aus und drücken Sie CTRL+C.

    Raspberry Pi camera module 2 or 3

    Wenn Sie den modernen libcamera Stack verwenden, verwenden Sie die folgende GStreamer Pipeline:

    gst-launch-1.0 libcamerasrc \ ! video/x-raw,width=640,height=480,framerate=30/1,format=I420 \ ! videoconvert \ ! x264enc speed-preset=ultrafast tune=zerolatency byte-stream=true key-int-max=75 \ ! video/x-h264,level='(string)4' \ ! h264parse \ ! video/x-h264,stream-format=avc,alignment=au,width=640,height=480,framerate=30/1 \ ! kvssink stream-name="YourStreamname"

    Um die GStreamer Pipeline zu beenden, wählen Sie das Terminalfenster aus und drücken Sie CTRL+C.

Verwenden Sie Hardware

Einige Raspberry Pi-Modelle sind mit hardwarebeschleunigten H.264-Encodern ausgestattet. Sie können sie anstelle vonx264enc, einem Software-Encoder, verwenden.

  1. Stellen Sie sicher, dass die GStreamer Plugins installiert sind:

    sudo apt-get install gstreamer1.0-tools gstreamer1.0-plugins-bad
  2. Type:

    gst-inspect-1.0 | grep h264

    Stellen Sie fest, ob die folgenden Elemente verfügbar sind:

    • omxh264enc

    • v4l2h264enc

    Wenn sie verfügbar sind, können Sie sie verwenden. Hier sind einige Pipeline-Beispiele, die diese Elemente verwenden:

    omxh264enc:

    gst-launch-1.0 v4l2src device=/dev/video0 \ ! videoconvert \ ! video/x-raw,format=I420,width=640,height=480 \ ! omxh264enc control-rate=2 target-bitrate=512000 periodicity-idr=45 inline-header=FALSE \ ! h264parse ! video/x-h264,stream-format=avc,alignment=au,profile=baseline \ ! kvssink stream-name="raspberry"

    v4l2h264encundv4l2convert:

    gst-launch-1.0 libcamerasrc \ ! video/x-raw,width=640,height=480,framerate=30/1,format=I420 \ ! v4l2convert \ ! v4l2h264enc extra-controls="controls,repeat_sequence_header=1" \ ! video/x-h264,level='(string)4' \ ! h264parse \ ! video/x-h264,stream-format=avc,alignment=au,width=640,height=480,framerate=30/1 \ ! kvssink stream-name="test-stream"

Probleme mit der Laufzeit

Im Folgenden finden Sie einige häufig auftretende Laufzeitprobleme und deren Behebung.

Kein solches Element „xxxxxxxxx“

Wenn du eine Fehlermeldung wie die folgende erhältst, bedeutet das, dass dir ein GStreamer Plugin fehlt:

WARNING: erroneous pipeline: no element "videoconvert"

Auflösung

Ermitteln Sie anhand des fehlenden Elements die entsprechende Aktion:

Fehler „Die Aktivierung des Pufferpools ist fehlgeschlagen“

Wenn Sie einen Fehler wie den folgenden erhalten, bedeutet dies, dass die verwendete Pipeline verwendet wirdv4l2src, aber sie sollte libcamera stattdessen verwenden.

ERROR bufferpool gstbufferpool.c:572:gst_buffer_pool_set_active:source:pool0:src start failed WARN v4l2src gstv4l2src.c:976:gst_v4l2src_decide_allocation: error: Failed to allocate required memory. WARN v4l2src gstv4l2src.c:976:gst_v4l2src_decide_allocation: error: Buffer pool activation failed WARN basesrc gstbasesrc.c:3352:gst_base_src_prepare_allocation: Subclass failed to decide allocation Error received from element source: Failed to allocate required memory. WARN basesrc gstbasesrc.c:3132:gst_base_src_loop: error: Internal data stream error. Debugging information: ../sys/v4l2/gstv4l2src.c(976): gst_v4l2src_decide_allocation (): /GstPipeline:live-kinesis-pipeline/GstV4l2Src:source: Buffer pool activation failed WARN basesrc gstbasesrc.c:3132:gst_base_src_loop: error: streaming stopped, reason not-negotiated (-4)

Wenn Sie beispielsweise die folgende Pipeline verwenden, bei der das Kameramodul 2 nicht libcamera installiert GStreamer ist, kann dieser Fehler auftreten, wenn Sie versuchen, die Pipeline automatisch zu erkennen.

gst-launch-1.0 autovideosrc ! videoconvert ! autovideosink

Auflösung

Stellen Sie sicher, dass das installiert libcamera ist, und verwenden Sie es als v4l2src Quellelement und nicht. Geben Sie Folgendes ein, um das libcamera GStreamer Element zu installieren:

sudo apt-get update sudo apt-get install gstreamer1.0-libcamera

Wenn Sie libcamerasrc das autovideosrc Element nach der Installation verwenden, GStreamer sollten Sie automatisch zur Verwendung der richtigen Quelle wechseln, libcamerasrc anstatt vonv4l2src.

Busfehler

Wenn Sie kurz nach dem Start einen Busfehler erhalten kvssink (normalerweise etwa zu dem Zeitpunkt, zu dem der HTTP Anruf PutMedia abgeschlossen ist), bedeutet dies, dass Ihr Raspberry Pi keinen unausgerichteten Speicherzugriff unterstützt. Die Protokolle werden wie folgt aussehen:

INFO Camera camera.cpp:1197 configuring streams: (0) 640x480-YUV420 INFO RPI pisp.cpp:1450 Sensor: /base/axi/pcie@120000/rp1/i2c@88000/imx708@1a - Selected sensor format: 1536x864-SBGGR10_1X10 - Selected CFE format: 1536x864-PC1B [INFO ] kinesisVideoStreamFormatChanged(): Stream format changed. [DEBUG] setRequestHeader(): Appending header to request: user-agent -> AWS-SDK-KVS-CPP-CLIENT/3.4.2/1.5.3 GCC/12.2.0 Linux/6.6.51+rpt-rpi-v8 aarch64 CPPSDK [DEBUG] setRequestHeader(): Appending header to request: x-amzn-stream-name -> demo-stream [DEBUG] setRequestHeader(): Appending header to request: x-amzn-producer-start-timestamp -> 1732012345.678 [DEBUG] setRequestHeader(): Appending header to request: x-amzn-fragment-acknowledgment-required -> 1 [DEBUG] setRequestHeader(): Appending header to request: x-amzn-fragment-timecode-type -> ABSOLUTE [DEBUG] setRequestHeader(): Appending header to request: transfer-encoding -> chunked [DEBUG] setRequestHeader(): Appending header to request: connection -> keep-alive [INFO ] putStreamResultEvent(): Put stream result event. New upload handle 0 [WARN ] notifyDataAvailable(): [demo-stream] Failed to un-pause curl with error: 43. Curl object 0xe2f6f418 Bus error

Kinesis Video Streams PIC verwendet unausgerichteten Speicherzugriff, um die Speichernutzung zu optimieren, was nicht von allen Geräten unterstützt wird.

Auflösung

Um den Modus „SDKIn Aligned Memory Access“ zu verwenden, müssen Sie das ALIGNED_MEMORY_MODEL CMake Flag ON beim Kompilieren explizit auf setzenkvssink, da standardmäßig OFF Eine detailliertere Laden Sie den Kinesis Video Streams C++ Producer herunter und erstellen Sie ihn SDK Anleitung finden Sie unter.

Der Zeitstempel friert ein und die Pipeline gerät ins Stocken

Bei x264enc der Verwendung in einer GStreamer Pipeline können Situationen auftreten, in denen sich die Timeline der Pipeline erheblich verlangsamt oder innerhalb weniger Sekunden vollständig zum Stillstand kommt.

Dies liegt daran, dass die x264enc Standardeinstellungen zu einer hohen Kodierungslatenz führen können, die die Kapazität des Standardeingabepuffers übersteigt. Infolgedessen füllt sich der Eingabepuffer, wodurch Upstream-Elemente blockiert werden und die Pipeline zum Stillstand kommt.

Weitere Informationen finden Sie in der GStreamer-Dokumentation.

Auflösung

Konfigurieren Sie x264enc mit der zerolatency Tuning-Option. Dadurch wird die Latenz bei der Kodierung erheblich reduziert, da für Echtzeitszenarien optimiert wird und sichergestellt wird, dass Frames schneller verarbeitet und ausgegeben werden.

Beispielkonfiguration:

... ! x264enc tune=zerolatency byte-stream=true speed-preset=ultrafast bframes=0 key-int-max=60 ! ...
Anmerkung

Diese Lösung verhindert zwar effektiv ein Blockieren der Pipeline, kann sich jedoch auf die Effizienz und Qualität der Kodierung auswirken. Für Szenarien, die sowohl eine geringe Latenz als auch eine hohe Qualität erfordern, sollten Sie alternative Ansätze in Betracht ziehen, z. B. Hardwareoptimierungen oder die Suche nach einer Webcam, die H.264 direkt ausgibt, und diesen Kodierungsschritt überspringen.

Weitere Informationen finden Sie unter Verwenden Sie Hardware.

Interner Datenstream-Fehler

Wenn Sie eine GStreamer Pipeline erstellen, verbinden Sie Elemente, indem Sie das Quell-Pad eines Elements mit dem Sink-Pad eines anderen Elements verknüpfen. Dieser Verbindungsprozess ermöglicht den Datenfluss vom Quellelement zum Senkenelement und bildet so eine Datenpipeline.

Die Fehlermeldung „Pad Link failed“ im Protokoll weist darauf hin, dass beim Versuch, eine Verbindung (Link) zwischen den Pads zweier Elemente in Ihrer Pipeline herzustellen, ein Problem GStreamer aufgetreten ist.

Pad link failed Error received from element udpsrc0: Internal data stream error.

Auflösung

Stellen Sie fest, welche Elemente nicht miteinander verknüpft werden können. Um den Umfang der Pipeline einzugrenzen, entfernen Sie Elemente aus der Pipeline. Ersetzen Sie das Element ganz rechts durch Elemente fakesink und entfernen Sie sie nacheinander.

Möglicherweise müssen Sie die Capsfilter-Elemente anpassen und/oder ändern, welche Elemente Ihre Pipeline verwendet.

Häufig wird nach einem framerate oder gefragtresolution, das die Kamera nicht unterstützt. Verwenden Siegst-device-monitor-1.0, um die unterstützten frameratesresolutions, und zu erhaltenformats. Sie können das GStreamerVideoscale-Element verwenden, um die Videoauflösung anzupassen, und mit Videorate können Sie die Videobildrate anpassen.