本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
对 Kinesis Video Streams 进行故障排除
使用以下信息来解决亚马逊 Kinesis Video Streams 遇到的常见问题。
一般性问题
本节介绍您在使用 Kinesis Video Streams 时可能遇到的一般问题。
问题
延迟太高
延迟可能是由发送到 Kinesis Video Streams 服务的片段持续时间造成的。降低创建者与服务间延迟的一种方法是配置媒体管道,以缩短片段持续时间。
要减少每个片段中发送的帧数,请减少以下值kinesis_video_gstreamer_sample_app.cpp
:
g_object_set(G_OBJECT (data.encoder), "bframes", 0, "key-int-max",
45
, "bitrate", 512, NULL);
注意
由于视频渲染的内部实现,Mozilla Firefox 浏览器中的延迟较高。
API问题
本节介绍您在使用 Kinesis Video Streams 时可能遇到API的问题。
问题
错误:“Unknown options”
下列错误可导致 GetMedia
和 GetMediaForFragmentList
失败:
Unknown options: <filename>.mkv
如果您配置的output
类型为, AWS CLI 则会出现此错误json
。 AWS CLI 使用默认输出类型 (none
) 重新配置。有关配置的信息 AWS CLI,请参阅《AWS CLI 命令参考》中的 configure。
错误:“Unable to determine service/operation name to be authorized(无法确定要授权的服务/操作名称)”
下列错误可导致 GetMedia
失败:
Unable to determine service/operation name to be authorized
如果未正确指定终端节点,则可能会发生此错误。获取终端节点时,请务必在调用中包含以下参数,具体取决于API要GetDataEndpoint
调用的:
--api-name GET_MEDIA --api-name PUT_MEDIA --api-name GET_MEDIA_FOR_FRAGMENT_LIST --api-name LIST_FRAGMENTS
错误:“Failed to put a frame in the stream(无法将帧放入流)”
下列错误可导致 PutMedia
失败:
Failed to put a frame in the stream
如果连接或权限不适用于服务,则可能会发生此错误。在中运行以下命令 AWS CLI,并验证是否可以检索直播信息:
aws kinesisvideo describe-stream --stream-name
StreamName
--endpointhttps://ServiceEndpoint.kinesisvideo.region.amazonaws.com
如果呼叫失败,请参阅AWS CLI 故障排除以了解更多信息。
错误:“服务在收到最终版本之前关闭 AckEvent 了连接”
下列错误可导致 PutMedia
失败:
com.amazonaws.SdkClientException: Service closed connection before final AckEvent was received
如果未正确实施 PushbackInputStream
,则可能会发生此错误。验证unread()
方法的实现是否正确。
错误:“STATUS_ _ OUT _OF STORE MEMORY _”
下列错误可导致 PutMedia
失败:
The content store is out of memory.
当内容存储没有分配到足够的大小时,会发生此错误。要增加内容存储的大小,请增加 StorageInfo.storageSize
的值。有关更多信息,请参阅 StorageInfo。
HLS问题
如果您的视频流无法正确播放,请参阅HLS 问题疑难解答。
Java 问题
本节介绍如何解决在使用 Kinesis Video Streams 时遇到的常见 Java 问题。
启用 Java 日志
要解决有关 Java 示例和库的问题,启用和检查调试日志会很有帮助。要启用调试日志,请执行以下操作:
-
在
dependencies
节点中,将log4j
添加到pom.xml
文件:
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
-
在
target/classes
目录中,创建一个名为log4j.properties
的文件,该文件包含以下内容:# Root logger option log4j.rootLogger=DEBUG, stdout # Redirect log messages to console log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n log4j.logger.org.apache.http.wire=DEBUG
然后,调试日志打印到IDE控制台。
制作人库问题
此部分介绍了在采用 创建者库 时可能会遇到的问题。
问题
- 无法编译制作器 SDK
- 视频流未显示在控制台中
- 使用GStreamer演示应用程序流式传输数据时出现错误:“请求中包含的安全令牌无效”
- 错误:“Failed to submit frame to Kinesis Video client”(无法将帧提交到 Kinesis 视频客户端)
- GStreamer应用程序在 OS X 上停止,并显示 “流式传输已停止,原因未协商” 消息
- 错误:在 Raspberry Pi 的演示GStreamer中创建 Kinesis 视频客户端时出现 “分配堆失败”
- 错误:在 Raspberry Pi 上运行GStreamer演示时出现 “非法指令”
- 摄像机在 Raspberry Pi 上加载失败
- 在 macOS High Sierra 上未找到摄像机
- 在 macOS High Sierra 上编译时,找不到 jni.h 文件
- 运行GStreamer演示应用程序时出现 curl 错误
- Raspberry Pi 上运行时的时间戳/范围断言
- Raspberry Pi 上的 gst_value_set_fraction_range_full 断言
- STATUS_ _ MKV _ INVALID _ NALU _IN ANNEXB _ FRAME _ DATA (0x3200000d) 安卓系统出现错误
- 已达到最大片段持续时间错误
- 使用 IoT 授权时出现“Invalid thing name passed (传递的事物名称无效)”错误
无法编译制作器 SDK
验证所需的库是否在您的路径中。要验证这一点,请使用以下命令:
env | grep LD_LIBRARY_PATH LD_LIBRARY_PATH=/home/local/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp/kinesis-video-native-build/downloads/local/lib
视频流未显示在控制台中
要在控制台中显示视频流,它必须使用 H.264 以 AvCC 格式编码。如果未显示您的流,请验证以下内容:
-
如果原始流使用 Annex-B 格式,则您的 NAL 适配标志 设置为
NAL_ADAPTATION_ANNEXB_NALS | NAL_ADAPTATION_ANNEXB_CPD_NALS
。这是StreamDefinition
构造函数中的默认值。 -
您是否正确提供了编解码器私有数据。对于 H.264,这是序列参数集 (SPS) 和图片参数集 (PPS)。根据您的媒体源,此数据可从媒体源中单独检索或编码到帧中。
许多基本流采用以下格式,其中
Ab
是 Annex-B 启动代码 (001 或 0001):Ab(Sps)Ab(Pps)Ab(I-frame)Ab(P/B-frame) Ab(P/B-frame)…. Ab(Sps)Ab(Pps)Ab(I-frame)Ab(P/B-frame) Ab(P/B-frame)
CPD(编解码器私有数据),如果 H.264 以SPS和的形式出现在流中PPS,则可以适应 aVCC 格式。除非媒体管道CPD单独给出,否则应用程序可以通过查找第一个 Idr 帧(其中应包含SPS和PPS)CPD从帧中提取,提取两个NALUs(将是 Ab (Sps) Ab (Pps))并将其设置在输入CPD中
StreamDefinition
。
使用GStreamer演示应用程序流式传输数据时出现错误:“请求中包含的安全令牌无效”
如果发生此错误,则您的凭证存在问题。请验证以下内容:
-
如果您使用的是临时凭证,则您必须指定一个会话令牌。
-
请验证您的临时凭证没有过期。
-
请验证您已设置了适当的权限。
-
在 macOS 上,请验证您没有在 Keychain 中缓存凭证。
错误:“Failed to submit frame to Kinesis Video client”(无法将帧提交到 Kinesis 视频客户端)
如果发生此错误,则表明源流中的时间戳设置不正确。尝试以下操作:
-
使用最新的SDK示例,其中可能包含修复您问题的更新。
-
将高质量视频流设置为更高的比特率,如果摄像机支持,则修复源流中的任何抖动。
GStreamer应用程序在 OS X 上停止,并显示 “流式传输已停止,原因未协商” 消息
OS X 上的流式处理可能停止,并显示以下消息:
Debugging information: gstbasesrc.c(2939): void gst_base_src_loop(GstPad *) (): /GstPipeline:test-pipeline/GstAutoVideoSrc:source/GstAVFVideoSrc:source-actual-src-avfvide: streaming stopped, reason not-negotiated (-4)
一种可能的解决方法是从gst_caps_new_simple
调用中删除帧速率参数kinesis_video_gstreamer_sample_app.cpp
:
GstCaps *h264_caps = gst_caps_new_simple("video/x-h264", "profile", G_TYPE_STRING, "baseline", "stream-format", G_TYPE_STRING, "avc", "alignment", G_TYPE_STRING, "au", "width", GST_TYPE_INT_RANGE, 320, 1920, "height", GST_TYPE_INT_RANGE, 240, 1080,
"framerate", GST_TYPE_FRACTION_RANGE, 0, 1, 30, 1,
NULL);
错误:在 Raspberry Pi 的演示GStreamer中创建 Kinesis 视频客户端时出现 “分配堆失败”
GStreamer示例应用程序尝试分配 512 MBRAM,这可能在您的系统上不可用。您可以通过降低 KinesisVideoProducer.cpp
中的以下值来减少此分配:
device_info.storageInfo.storageSize =
512
* 1024 * 1024;
错误:在 Raspberry Pi 上运行GStreamer演示时出现 “非法指令”
如果您在运行GStreamer演示时遇到以下错误,请确认您已将应用程序编译为正确的设备版本。(例如,当你在 Raspberry Pi 2 上运行时,请确认你没有针对 Raspberry Pi 3 进行编译。)
INFO - Initializing curl. Illegal instruction
摄像机在 Raspberry Pi 上加载失败
要检查摄像机是否已加载,请运行以下命令:
ls /dev/video*
如果未找到,请运行以下命令:
vcgencmd get_camera
该输出值应该类似于以下内容:
supported=1 detected=1
如果驱动程序无法检测到摄像机,请执行以下操作:
-
检查物理摄像机相机设置并验证其是否已正确连接。
-
运行以下命令以升级固件:
sudo rpi-update
-
重启设备。
-
运行以下命令以加载驱动程序:
sudo modprobe bcm2835-v4l2
-
验证是否已检测到摄像机:
ls /dev/video*
在 macOS High Sierra 上未找到摄像机
在 macOS High Sierra 上,如果有多个摄像机可用,则演示应用程序无法找到摄像机。
在 macOS High Sierra 上编译时,找不到 jni.h 文件
要纠正该错误,请将 Xcode 安装更新为最新的版本。
运行GStreamer演示应用程序时出现 curl 错误
要解决运行GStreamer演示应用程序时的 curl 错误,请将此证书文件/etc/ssl/cert.pem
Raspberry Pi 上运行时的时间戳/范围断言
如果时间戳范围断言发生在运行时,请更新固件并重启设备:
sudo rpi-update $ sudo reboot
Raspberry Pi 上的 gst_value_set_fraction_range_full 断言
如果 uv4l
服务正在运行,则将显示以下断言:
gst_util_fraction_compare (numerator_start, denominator_start, numerator_end, denominator_end) < 0' failed
如果发生这种情况,请停止 uv4l
服务并重新启动应用程序。
STATUS_ _ MKV _ INVALID _ NALU _IN ANNEXB _ FRAME _ DATA (0x3200000d) 安卓系统出现错误
如果 NAL 适配标志 对于媒体流不正确,则会出现以下错误:
putKinesisVideoFrame(): Failed to put a frame with status code 0x3200000d
如果发生此错误,请为您的媒体提供正确的 .withNalAdaptationFlags
标记(例如,NAL_ADAPTATION_ANNEXB_CPD_NALS
)。在 Android 创建者库 的以下行中提供此标记:
已达到最大片段持续时间错误
此错误在流中的媒体片段超出最大片段持续时间限制时发生。请参阅本媒体和存档媒体 API 服务配额节中的最大片段持续时间限制。
要解决该问题,请尝试以下操作:
-
如果您使用的是网络USB摄像头/摄像头,请执行以下操作之一:
-
如果您使用的是基于关键帧的分段,请将编码器设置为在 10 秒内提供关键帧。
-
如果您没有使用基于关键帧的分段,则在中定义直播时第 2 步:编写并检查代码,请将最大片段持续时间限制设置为小于 10 秒的值。
-
如果您在GStreamer管道中使用软件编码器(如 x264),则可以在 10 秒钟内将该 key-int-max 属性设置为一个值。例如,设置为 60, key-int-max 将 fps 设置为 30,每隔 2 秒启用一次关键帧。
-
-
如果您使用的是RPI摄像头,请将关键帧间隔属性设置为小于 10 秒。
-
如果您使用的是 IP (RTSP) 摄像头,请将GOP大小设置为 60。
使用 IoT 授权时出现“Invalid thing name passed (传递的事物名称无效)”错误
要避免在使用物联网凭据进行授权时出现此错误 (HTTP Error 403: Response: {"message":"Invalid thing name passed"}
),请确保stream-name
(kvssink
元素的必填参数)的值与的值相同iot-thingname
。有关更多信息,请参阅 gStreamer 元素参数参考。
直播解析器库问题
此部分介绍了在采用 视频流解析器库 时可能会遇到的问题。
无法从流中访问单个帧
要在使用者应用程序中访问来自流媒体源的单个帧,请验证您的直播是否包含正确的编解码器私有数据。有关流中数据格式的信息,请参阅 数据模型。
要了解如何使用编解码器私有数据访问帧,请参阅 GitHub 网站上的以下测试文件:KinesisVideoRendererExampleTest.java
片段解码错误
如果您的片段未采用浏览器支持的 H.264 格式和级别进行正确编码,则在控制台中播放流时,您可能会看到以下错误:
Fragment Decoding Error There was an error decoding the video data. Verify that the stream contains valid H.264 content
如果出现此错误,请确认以下几点:
-
帧的分辨率与编解码器私有数据中指定的分辨率匹配。
-
已编码的帧的 H.264 配置文件和级别与编解码器私有数据中指定的配置文件和级别匹配。
-
浏览器支持配置文件/级别组合。最新的浏览器支持所有配置文件和级别组合。
-
时间戳准确且采用正确顺序,并且未创建任何重复的时间戳。
-
您的应用程序使用 H.264 格式对帧数据进行编码。
网络问题
如果您在尝试连接 Kinesis Video Streams 时看到连接错误,例如 “连接超时” 或 “连接失败”,则可能是由于您的网络设置中的 IP 地址范围限制所致。
如果您的设置对 Kinesis Video Streams 有 IP 地址范围限制,请更新您的网络配置以将 Kinesis Vide o
重要
IP 范围列表并不是 Kinesis Video Streams IP 地址的详尽列表。包括您看到的 IP 地址范围,并注意 IP 地址可能会随着时间的推移而发生变化。
有关更多信息,请参阅 AWS IP 范围。要在 IP 范围发生变化时收到通知,请按照订阅程序进行操作。