本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
将视频流式传输到您的 Kinesis 视频流
要运行示例应用程序,您需要具有以下信息:
-
在先决条件一节中创建的流的名称。
-
在创建有权写入 Kinesis Video Streams 的 IAM 用户中创建的账户凭证 (访问密钥 ID 和秘密访问密钥)。
GStreamer 能够找到该插件。
kvssink请参阅下载并构建 Kinesis 视频流 C++ 制作人 SDK了解更多信息。
设置凭证和区域。
export AWS_ACCESS_KEY_ID=YourAccessKeyexport AWS_SECRET_ACCESS_KEY=YourSecretKeyexport 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根据您的输入媒体,选择以下选项之一:
利用硬件
一些树莓派型号带有硬件加速编码器 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 \ !omxh264enccontrol-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\ !v4l2h264encextra-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" -
运行时问题
以下是一些经常遇到的运行时问题以及如何对其进行故障排除。
没有这样的元素 “xxxxxxxxxx”
如果你收到如下错误,则表示你缺少了 GStreamer 插件:
WARNING: erroneous pipeline: no element "videoconvert"
解决方法:
根据缺少哪个元素,确定相应的操作:
-
kvssink: 参见下载并构建 Kinesis 视频流 C++ 制作人 SDK。 libcamerasrc: 请参见“缓冲池激活失败” 错误安装libcamerasrcGStreamer 元素。omxh264enc或v4l2h264enc:安装软件必备条件按照步骤安装所有 GStreamer 库。如果你已经安装了它们,但这些元素没有出现,这意味着你的树莓派没有硬件。
x264enc改用软件编码器。其他:安装软件必备条件按照步骤安装所有 GStreamer 库。不同的GStreamer插件组中有不同的GStreamer元素(好的、坏的、丑的),所以一定要把它们全部安装起来。
“缓冲池激活失败” 错误
如果你收到如下错误,则表示正在使用的管道正在使用v4l2src,但应该libcamerasrc改用。
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)
例如,如果您在未libcamerasrc安装摄像头模块 2 的情况下使用以下管道,则在 GStreamer 尝试自动检测要使用哪些元素时,可能会遇到此错误。
gst-launch-1.0 autovideosrc ! videoconvert ! autovideosink
解决方法:
确保libcamerasrc已安装并将其用作源元素,而不是v4l2src。键入以下命令来安装 libcamerasrc GStreamer 元素:
sudo apt-get update sudo apt-get install gstreamer1.0-libcamera
安装完成后libcamerasrc,如果你使用的是autovideosrc元素,GStreamer 应该自动切换到使用正确的源代码,libcamerasrc而不是. v4l2src
总线错误
如果您在启动后不久收到总线错误kvssink(通常在 HTTP 调用PutMedia完成时),则表示您的树莓派不支持未对齐的内存访问。日志将如下所示:
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 使用未对齐的内存访问来优化内存使用量,但并非所有设备都支持这种方式。
解决方法:
要在对齐的内存访问模式下使用 SDK,需要在编译ON时明确将 ALIGNED_MEMORY_MODEL CMake 标志设置为kvssink,因为它的默认值为OFF。下载并构建 Kinesis 视频流 C++ 制作人 SDK有关更多详细说明,请参阅。
时间戳冻结,管道停顿
x264enc在 GStreamer 流水线中使用时,可能会遇到流水线的时间表显著减慢或在几秒钟内完全停止的情况。
发生这种情况是因为x264enc默认设置会引入较高的编码延迟,这会超过默认输入缓冲区的容量。结果,输入缓冲区填满,导致上游元素阻塞和管道停滞。
有关更多信息,请参阅 GStreamer 文档。
解决方法:
x264enc使用zerolatency调整选项进行配置。通过针对实时场景进行优化,确保更快地处理和输出帧,这显著减少了编码延迟。
示例配置:
... ! x264enctune=zerolatencybyte-stream=true speed-preset=ultrafast bframes=0 key-int-max=60 ! ...
注意
虽然该解决方案可以有效防止管道停滞,但它可能会影响编码效率和质量。对于同时需要低延迟和高质量的场景,可以考虑其他方法,例如使用硬件优化或寻找可以 H.264 直接输出的网络摄像头,跳过此编码步骤。
有关更多信息,请参阅 利用硬件。
无法在同一 v4l2 设备上同时运行多个管道
诸如之类的设备一次/dev/video0只能由一个进程访问。如果多个进程尝试同时访问它,则第二个进程将等到第一个进程完成。
解决方法:
创建环回设备,允许多个进程同时使用环回接口。有关更多信息,请参阅 Stack Exchange
内部数据流错误
创建 GStreamer 管道时,您可以通过将一个元素的源焊盘链接到另一个元素的接收板来连接元素。这种链接过程允许数据从源元素流向汇元素,形成数据管道。
日志中的错误消息 “Pad 链接失败” 表明 GStreamer 在尝试在管道中两个元素的 Pad 之间建立连接(链接)时遇到了问题。
Pad link failed
Error received from element udpsrc0: Internal data stream error.
解决方法:
确定哪些元素无法相互关联。要缩小管道范围,请从管道中移除元素。将最右边的元素替换为一个元素,fakesink并逐个移除元素。
您可能需要调整 capsfilter
常见情况是要求提供resolution相机不支持的framerate或。gst-device-monitor-1.0在终端中使用以获取支持的frameratesresolutions、和formats。您可以使用 videos
要检查单个 GStreamer 元素支持的格式,请在终端gst-inspect-1.0 element-name中键入。