本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
将视频流式传输到你的 Kinesis 视频流
要运行示例应用程序,您需要具有以下信息:
-
在先决条件一节中创建的流的名称。
-
在创建有权写入 Kinesis Video Streams 的IAM用户中创建的账户凭证 (访问密钥 ID 和秘密访问密钥)。
设置凭证和区域。
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
根据您的输入媒体,选择以下选项之一:
利用硬件
某些 Raspberry Pi 型号带有硬件加速的 H.264 编码器。你可以用它们来代替x264enc
,后者是一个软件编码器。
-
确保GStreamer插件已安装:
sudo apt-get install gstreamer1.0-tools gstreamer1.0-plugins-bad
-
类型:
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
"v4l2h264enc
和v4l2convert
: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"
解决方案:
根据缺少哪个元素,确定相应的操作:
-
kvssink
: 请参阅下载并构建 Kinesis Video Streams C++ 制作器 SDK。 libcamerasrc
: “缓冲池激活失败” 错误 要安装该libcamerasrc
GStreamer元素,请参阅。omxh264enc
或v4l2h264enc
:安装软件先决条件按照步骤安装所有GStreamer库。如果你已经全部安装了它们但这些元素没有出现,那就意味着你的 Raspberry Pi 没有硬件。
x264enc
改用软件编码器。其他:安装软件先决条件按照操作安装所有GStreamer库。在不同的GStreamer插件组中可以找到不同的GStreamer元素(好、坏、丑),因此请务必全部安装它们。
“缓冲池激活失败” 错误
如果您收到类似以下的错误,则表示正在使用的管道正在使用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
。键入以下内容来安装该libcamera
GStreamer元素:
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_MODEL
CMake标志明确设置为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
常见的情况是要求相机不支持framerate
或resolution
相机不支持。gst-device-monitor-1.0
用于获取支持的framerates
resolutions
、和formats
。你可以使用 videoscal