将视频流式传输到你的 Kinesis 视频流 - Amazon Kinesis Video Streams

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

将视频流式传输到你的 Kinesis 视频流

要运行示例应用程序,您需要具有以下信息:

  1. 设置凭证和区域。

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

    有关其他身份验证方法,请参阅向提供凭证 kvssink

    注意

    默认情况下,C++ 制作器SDK使用美国西部(俄勒冈us-west-2)() 区域。要使用默认设置,请在美国西部(俄勒冈)地区 AWS 区域 创建您的 Kinesis 视频流。

    要在 Kinesis 视频流中使用不同的区域,请将以下环境变量设置为您的区域(例如):us-east-1

    export AWS_DEFAULT_REGION=us-east-1
  2. 根据您的输入媒体,选择以下选项之一:

    Sample Gstreamer video

    该GStreamer管道生成具有标准测试模式的实时测试视频流,该视频流以每秒 10 帧的速度运行,分辨率为 640x480 像素。添加了一个显示当前系统时间和日期的叠加层。然后将视频编码为 H.264 格式,最多每 10 帧生成关键帧,从而使片段持续时间(也称为一组图片 (GoP) 大小)为 1 秒。kvssink 获取 H.264 编码的视频流,将其打包为 Matroska (MKV) 容器格式,然后将其上传到您的 Kinesis 视频流。

    运行以下命令:

    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"

    要停止GStreamer管道,请选择终端窗口并按 CTRL+C

    示例视频GStreamer管道如下所示:

    带有叠加日期和时间戳的标准测试模式的图像。
    USB webcam

    运行以下命令以GStreamer自动检测您的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"

    要停止GStreamer管道,请选择终端窗口并按 CTRL+C

    与其让GStreamer自动检测,不如v4l2src使用特定的设备标识符。运行以下命令:

    gst-device-monitor-1.0

    在输出中,您将看到一些设备以及有关如何使用该设备的GStreamer管道的开始:

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

    要停止GStreamer管道,请选择终端窗口并按 CTRL+C

    Raspberry Pi camera module 1

    如果您使用的是 Pi 摄像头模块 1 或 Pi 摄像头模块 2bcm2835-v4l2,请使用以下内容:

    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"

    要停止GStreamer管道,请选择终端窗口并按 CTRL+C

    Raspberry Pi camera module 2 or 3

    如果您使用的是现代libcamera堆栈,请使用以下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"

    要停止GStreamer管道,请选择终端窗口并按 CTRL+C

利用硬件

某些 Raspberry Pi 型号带有硬件加速的 H.264 编码器。你可以用它们来代替x264enc,后者是一个软件编码器。

  1. 确保GStreamer插件已安装:

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

    gst-inspect-1.0 | grep h264

    确定以下元素是否可用:

    • omxh264enc

    • v4l2h264enc

    如果它们可用,你可以使用它们。以下是一些使用这些元素的管道示例:

    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"

    v4l2h264encv4l2convert

    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"

运行时问题

以下是一些经常遇到的运行时问题以及如何解决这些问题。

没有这样的元素 “xxxxxxxxx”

如果你收到类似以下的错误,那就意味着你缺少了一个GStreamer插件:

WARNING: erroneous pipeline: no element "videoconvert"

解决方案:

根据缺少哪个元素,确定相应的操作:

“缓冲池激活失败” 错误

如果您收到类似以下的错误,则表示正在使用的管道正在使用v4l2src,但应该libcamera改用。

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)

例如,如果您在未libcamera安装摄像头模块 2 的情况下使用以下管道,则在尝试自动检测管道时GStreamer可能会遇到此错误。

gst-launch-1.0 autovideosrc ! videoconvert ! autovideosink

解决方案:

确保libcamera已安装并使用它作为源元素,而不是v4l2src。键入以下内容来安装该libcameraGStreamer元素:

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

安装完成后libcamerasrc,如果您正在使用该autovideosrc元素,则GStreamer应自动切换为使用正确的来源,libcamerasrc而不是v4l2src

总线错误

如果您在启动后不久kvssink(通常是在HTTP呼叫PutMedia完成时)收到总线错误,则表示您的 Raspberry Pi 不支持未对齐的内存访问。日志将如下所示:

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 PIC Streams 使用未对齐的内存访问来优化内存使用情况,但并非所有设备都支持这种方式。

解决方案:

要使用对齐的内存访问模式,您需要SDK在编译ON时将该ALIGNED_MEMORY_MODELCMake标志明确设置为kvssink,因为它默认为OFF下载并构建 Kinesis Video Streams C++ 制作器 SDK有关更多详细说明,请参阅。

时间戳冻结,管道停滞

在GStreamer管道x264enc中使用时,您可能会遇到管道的时间表在几秒钟内显著减慢或完全停滞的情况。

之所以出现这种情况,是因为x264enc默认设置会引入较高的编码延迟,这会超过默认输入缓冲区的容量。结果,输入缓冲区被填满,导致上游元素阻塞,管道停滞。

有关更多信息,请参阅 GStreamer 文档

解决方案:

x264enc使用zerolatency调整选项进行配置。这通过针对实时场景进行优化,确保帧的处理和输出速度更快,从而显著减少了编码延迟。

示例配置:

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

虽然此解决方案可以有效防止流水线停滞,但它可能会影响编码效率和质量。对于同时需要低延迟和高质量的场景,可以考虑其他方法,例如使用硬件优化或查找直接输出 H.264 的网络摄像头,跳过此编码步骤。

有关更多信息,请参阅 利用硬件

内部数据流错误

创建GStreamer管线时,通过将一个元素的源焊盘链接到另一个元素的吸盘来连接元素。这种链接过程允许数据从源元素流向接收器元素,从而形成数据管道。

日志中的错误消息 “Pad link failed” 表示尝试在管道中两个元素的焊盘之间建立连接(链接)时GStreamer遇到了问题。

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

解决方案:

确定哪些元素无法相互关联。要缩小管道范围,请从管道中移除元素。将最右边的元素替换为fakesink并逐个移除元素。

您可能需要调整 capsfilter 元素,和/或更改管道使用的元素。

常见的情况是要求相机不支持framerateresolution相机不支持。gst-device-monitor-1.0用于获取支持的frameratesresolutions、和formats。你可以使用 videoscal e GStreamer 元素来调整视频分辨率,使用 videorate 来调整视频帧速率。