View a markdown version of this page

Transmita vídeo a su transmisión de vídeo de Kinesis - Amazon Kinesis Video Streams

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Transmita vídeo a su transmisión de vídeo de Kinesis

Para ejecutar la aplicación de ejemplo, necesita la siguiente información:

  1. Configura las credenciales y la región.

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

    Para ver otros métodos de autenticación, consulteProporcione las credenciales a kvssink .

    nota

    El SDK para productores de C++ usa la región EE.UU. Oeste (Oregón) (us-west-2) de forma predeterminada. Para usar el modo predeterminado, Región de AWS cree su transmisión de vídeo de Kinesis en la región del oeste de EE. UU. (Oregón).

    Para usar una región diferente para la transmisión de vídeo de Kinesis, defina la siguiente variable de entorno en su región (por ejemplo,us-east-1):

    export AWS_DEFAULT_REGION=us-east-1
  2. Según el medio de entrada, elija una de las siguientes opciones:

    Sample GStreamer video

    Esta canalización de GStreamer genera una transmisión de vídeo de prueba en directo con un patrón de prueba estándar que se ejecuta a 10 fotogramas por segundo con una resolución de 640 x 480 píxeles. Se añade una superposición que muestra la fecha y hora actuales del sistema. A continuación, el vídeo se codifica en H.264 formato y los fotogramas clave se generan como máximo cada 10 fotogramas, lo que da como resultado una duración del fragmento (también conocido como tamaño de grupo de imágenes (GoP)) de 1 segundo. kvssink toma la transmisión de H.264-encoded vídeo, la empaqueta en el formato contenedor de Matroska (MKV) y la sube a la transmisión de vídeo de Kinesis.

    Use el siguiente comando:

    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"

    Para detener la canalización de GStreamer, selecciona la ventana de la terminal y pulsa CTRL+C.

    La canalización de vídeo de muestra de GStreamer tiene este aspecto:

    Imagen del patrón de prueba estándar con fecha y hora superpuestas.
    USB web cam

    Ejecuta el siguiente comando para que GStreamer detecte automáticamente tu cámara USB:

    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"

    Para detener la canalización de GStreamer, selecciona la ventana del terminal y pulsa CTRL+C.

    En lugar de dejar que GStreamer lo detecte automáticamente, puedes usarlo con un identificador de dispositivo específico. v4l2src Use el siguiente comando:

    gst-device-monitor-1.0

    En el resultado, verás algunos dispositivos y el inicio de un proceso de GStreamer para saber cómo usar el dispositivo:

    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 ! ...

    Para detener la canalización de GStreamer, selecciona la ventana de la terminal y presiona CTRL+C.

    Raspberry Pi camera module 1

    Si utilizas el módulo de cámara Pi 1 o con el módulo de cámara Pi 2bcm2835-v4l2, usa lo siguiente:

    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"

    Para detener la canalización de GStreamer, selecciona la ventana del terminal y presiona CTRL+C.

    Raspberry Pi camera module 2 or 3

    Si usas la libcamera pila moderna, usa la siguiente canalización de GStreamer:

    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"

    Para detener la canalización de GStreamer, selecciona la ventana de la terminal y presiona CTRL+C.

    Sample RTSP camera

    En este ejemplo, solemos alojar localmente una transmisión Gst-Rtsp-Server de cámara RTSP de demostración. A continuación, creamos una canalización de GStreamer para subir esa señal de cámara RTSP a la transmisión de vídeo de Kinesis especificada.

    Para configurarlo en tu Raspberry Pi Gst-Rtsp-Server

    1. Instala las bibliotecas de dependencias necesarias para construir el Gst-Rtsp-Server proyecto. Asegúrese también de tener instalados los requisitos previos del software. Escriba lo siguiente en su terminal:

      sudo apt-get update sudo apt-get install libgstrtspserver-1.0
    2. Descarga la versión 1.22 de GStreamer en tu Raspberry Pi.

      git clone https://gitlab.freedesktop.org/gstreamer/gstreamer.git --single-branch -b 1.22
    3. Cambie los directorios al directorio examples del gst-rtsp-server.

      cd gstreamer cd subprojects cd gst-rtsp-server cd examples
    4. Compila el archivo test-launch.c en un ejecutable llamado test-launch con gcc.

      gcc -o test-launch test-launch.c `pkg-config --cflags --libs gstreamer-rtsp-server-1.0`
    5. Ejecuta el ejecutable con los siguientes argumentos. Nota: Es posible que GStreamer tarde algún tiempo en cargarse por primera vez.

      ./test-launch "videotestsrc is-live=true ! video/x-raw,height=480,width=640,framerate=10/1 ! videoconvert ! x264enc tune=zerolatency bitrate=512 key-int-max=25 bframes=0 ! h264parse ! rtph264pay ! name=pay0 pt=96"

      Debería ver los siguientes datos de salida:

      stream ready at rtsp://127.0.0.1:8554/test
    6. Verifique la transmisión de vídeo del RTSP. Puede usar cualquier visor RTSP. Por ejemplo, el reproductor multimedia VLC. Para usar el reproductor multimedia VLC para ver tu transmisión en vivo, abre una nueva terminal y escribe:

      sudo apt-get install vlc

      para instalar el reproductor multimedia VLC. A continuación, escriba:

      vlc rtsp://127.0.0.1:8554/test

      Debería aparecer una ventana de VLC con la transmisión en vivo. De lo contrario, compruebe que el ejecutable de lanzamiento de prueba siga ejecutándose y compruebe si hay errores en el resultado.

      Otra forma de verificar la transmisión del RTSP es mediante la utilidad gst-discoverer-1.0. Escriba:

      gst-discoverer-1.0 "rtsp://127.0.0.1:8554/test"

      El resultado esperado es el siguiente:

      Analyzing rtsp://127.0.0.1:8554/test Done discovering rtsp://127.0.0.1:8554/test Properties: Duration: 99:99:99.999999999 Seekable: no Live: yes unknown #0: application/x-rtp video #1: H.264 (Constrained Baseline Profile) Stream ID: 359314d7d4bba383223927d7e57d4244d0800e629c626be81c505055c62170e2/video:0:0:RTP:AVP:96 Width: 640 Height: 480 Depth: 24 Frame rate: 10/1 Pixel aspect ratio: 1/1 Interlaced: false Bitrate: 0 Max bitrate: 0

    Para enviar la fuente RTSP a su transmisión de vídeo de Kinesis mediante kvssink

    Esta canalización de GStreamer se utiliza rtspsrc para conectarse al servidor RTSP y obtener la transmisión de vídeo RTP. Pasa los fotogramas artph264depay, que extrae los fotogramas de H.264-encoded vídeo de los paquetes RTP. h264parseagrupa los fotogramas de vídeo en un formato que kvssink pueda entender. kvssinktoma la transmisión de H.264-encoded vídeo, la empaqueta en el formato contenedor de Matroska (MKV) y la sube a la transmisión de vídeo de Kinesis.

    Use el siguiente comando:

    gst-launch-1.0 -v rtspsrc location="rtsp://127.0.0.1:8554/test" short-header=true \ ! rtph264depay \ ! h264parse \ ! video/x-h264,format=avc,alignment=au \ ! kvssink stream-name="YourStreamName"

    Para detener la canalización de GStreamer, selecciona la ventana de la terminal y presiona CTRL+C.

Utiliza hardware

Algunos modelos de Raspberry Pi vienen con codificadores acelerados por hardware H.264 . Puede usarlos en lugar dex264enc, que es un codificador de software.

  1. Asegúrese de que los complementos de GStreamer estén instalados:

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

    gst-inspect-1.0 | grep h264

    Determine si los siguientes elementos están disponibles:

    • omxh264enc

    • v4l2h264enc

    Si están disponibles, puedes utilizarlos. Estos son algunos ejemplos de canalizaciones en los que se utilizan esos elementos:

    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"

    v4l2h264encyv4l2convert:

    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"

Problemas de tiempo de ejecución

Los siguientes son algunos de los problemas de tiempo de ejecución más frecuentes y cómo solucionarlos.

No existe tal elemento «xxxxxxxxx»

Si recibes un error como el siguiente, significa que te falta un complemento de GStreamer:

WARNING: erroneous pipeline: no element "videoconvert"

Solución:

En función del elemento que falta, determina la acción adecuada:

Error «Fallo al activar el grupo de búferes»

Si recibes un error como el siguiente, significa que la canalización que estás utilizando está en usov4l2src, pero debería usarse libcamerasrc en su lugar.

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)

Por ejemplo, si utilizas la siguiente canalización con el módulo de cámara 2 sin libcamerasrc instalar, es posible que aparezca este error cuando GStreamer intente detectar automáticamente qué elementos usar.

gst-launch-1.0 autovideosrc ! videoconvert ! autovideosink

Solución:

Asegúrese de que libcamerasrc está instalado y utilícelo como elemento fuente, en lugar de hacerlo. v4l2src Escriba lo siguiente para instalar el elemento libcamerasrc GStreamer:

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

Una vez libcamerasrc instalado, si estás usando el autovideosrc elemento, GStreamer debería cambiar automáticamente para usar la fuente correcta en lugar de hacerlo. libcamerasrc v4l2src

Error de bus

Si recibes un error de bus poco después de empezar kvssink (normalmente, cuando PutMedia finaliza la llamada HTTP), significa que tu Raspberry Pi no admite el acceso desalineado a la memoria. Los registros tendrán el siguiente aspecto:

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

El PIC de Kinesis Video Streams utiliza un acceso a la memoria no alineado para optimizar el uso de la memoria, lo que no es compatible con todos los dispositivos.

Solución:

Para usar el SDK en el modo de acceso alineado a la memoria, debe establecer explícitamente el indicador ALIGNED_MEMORY_MODEL CMake en el ON momento de la compilaciónkvssink, ya que el valor predeterminado es. OFF Consulta Descargue y cree el SDK para productores de C++ de Kinesis Video Streams para obtener instrucciones más detalladas.

La marca de tiempo se congela y el oleoducto se detiene

Al usarlo x264enc en una canalización de GStreamer, es posible que te encuentres con situaciones en las que el cronograma de la canalización se ralentice considerablemente o se detenga por completo en unos pocos segundos.

Esto se debe a que la configuración x264enc predeterminada puede introducir una latencia de codificación alta, que supera la capacidad del búfer de entrada predeterminado. Como resultado, el búfer de entrada se llena, lo que hace que los elementos ascendentes se bloqueen y la canalización se detenga.

Para obtener más información, consulte la documentación de GStreamer.

Solución:

Configure x264enc con la opción de zerolatency ajuste. Esto reduce considerablemente la latencia de codificación, ya que se optimiza para escenarios en tiempo real, lo que garantiza que los fotogramas se procesen y emitan con mayor rapidez.

Ejemplo de configuración:

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

Si bien esta solución evita eficazmente el estancamiento de la canalización, puede afectar a la eficiencia y la calidad de la codificación. En los casos en los que se requiera una latencia baja y una alta calidad, considere la posibilidad de utilizar enfoques alternativos, como utilizar optimizaciones de hardware o buscar una cámara web que emita la salida H.264 directamente, omitiendo este paso de codificación.

Para obtener más información, consulte Utiliza hardware.

No se pueden ejecutar varias canalizaciones desde el mismo dispositivo v4l2 al mismo tiempo

Solo se /dev/video0 puede acceder a dispositivos como este mediante un proceso a la vez. Si varios procesos intentan acceder a él al mismo tiempo, el segundo espera hasta que finalice el primero.

Solución:

Cree un dispositivo de bucle invertido que permita que varios procesos utilicen la interfaz de bucle invertido al mismo tiempo. Para obtener más información, consulte Stack Exchange. https://raspberrypi.stackexchange.com/questions/19630/take-picam-image-while-motion-is-running/19897#19897

Error de flujo de datos interno

Cuando creas una canalización de GStreamer, conectas los elementos vinculando la plataforma de origen de un elemento a la plataforma de destino de otro elemento. Este proceso de enlace permite el flujo de datos desde el elemento fuente al elemento sumidero, formando una canalización de datos.

El mensaje de error «Error de enlace» que aparece en el registro indica que GStreamer ha detectado un problema al intentar establecer una conexión (enlace) entre los nodos de dos elementos de la canalización.

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

Solución:

Determina qué elementos no se enlazan entre sí. Para reducir el alcance de la canalización, elimine los elementos de la canalización. Sustituya el elemento situado más a la derecha por otros elementos fakesink y elimínelos uno por uno.

Es posible que tengas que ajustar las tapas y los elementos del filtro y and/or cambiar los elementos que utiliza tu oleoducto.

Los casos más comunes son solicitar una framerate o resolution que la cámara no admite. gst-device-monitor-1.0Utilícelo en el terminal para obtener el soporte frameratesresolutions, yformats. Puedes usar el elemento GStreamer de la escala de vídeo para ajustar la resolución del vídeo y Videorate para ajustar la velocidad de fotogramas del vídeo.

Para inspeccionar los formatos admitidos para un elemento individual de GStreamer, escribe en el terminal. gst-inspect-1.0 element-name