对 Kinesis Video Streams 进行故障排除 - Amazon Kinesis Video Streams
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

对 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”

下列错误可导致 GetMediaGetMediaForFragmentList 失败:

Unknown options: <filename>.mkv

如果您配置的output类型为, Amazon CLI 则会出现此错误json。 Amazon CLI 使用默认输出类型 (none) 重新配置。有关配置的信息 Amazon CLI,请参阅《Amazon CLI 命令参考》中的 configure。

错误:“Unable to determine service/operation name to be authorized(无法确定要授权的服务/操作名称)”

下列错误可导致 GetMedia 失败:

Unable to determine service/operation name to be authorized

如果未正确指定终端节点,则可能会发生此错误。获取终端节点时,请务必在调用中包含以下参数,具体取决于要GetDataEndpoint调用的 API:

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

如果连接或权限不适用于服务,则可能会发生此错误。在中运行以下命令 Amazon CLI,并验证是否可以检索直播信息:

aws kinesisvideo describe-stream --stream-name StreamName --endpoint https://ServiceEndpoint.kinesisvideo.region.amazonaws.com

如果呼叫失败,请参阅Amazon CLI 故障排除以了解更多信息。

错误:“服务在收到最终版本之前关闭 AckEvent 了连接”

下列错误可导致 PutMedia 失败:

com.amazonaws.SdkClientException: Service closed connection before final AckEvent was received

如果未正确实施 PushbackInputStream,则可能会发生此错误。验证unread()方法的实现是否正确。

错误:“STATUS_STORE_OUT_OF_MEMORY”

下列错误可导致 PutMedia 失败:

The content store is out of memory.

当内容存储没有分配到足够的大小时,会发生此错误。要增加内容存储的大小,请增加 StorageInfo.storageSize 的值。有关更多信息,请参阅 StorageInfo

HLS 问题

如果您的视频流无法正确播放,请参阅HLS 问题疑难解答

Java 问题

本节介绍如何解决在使用 Kinesis Video Streams 时遇到的常见 Java 问题。

启用 Java 日志

要解决有关 Java 示例和库的问题,启用和检查调试日志会很有帮助。要启用调试日志,请执行以下操作:

  1. dependencies 节点中,将 log4j 添加到 pom.xml 文件:

    <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
  2. 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 控制台。

制作人库问题

此部分介绍了在采用 创建者库 时可能会遇到的问题。

无法编译创建者开发工具包

验证所需的库是否在您的路径中。要验证这一点,请使用以下命令:

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)

    如果 H.264 以 SPS 和 PPS 的形式出现在直播中,CPD(编解码器私有数据)可以适应 aVCC 格式。除非媒体管道单独给出 CPD,否则应用程序可以通过查找第一个 Idr 帧(其中应包含 SPS 和 PPS)从帧中提取 CPD,提取两个 NALU(将是 Ab (Sps) Ab (Pps))并将其设置在 CPD 中,然后将其设置在 CPD 中。StreamDefinition

在采用 GStreamer 演示应用程序流式处理数据时,出现错误:"Security token included in the request is invalid"

如果发生此错误,则您的凭证存在问题。请验证以下内容:

  • 如果您使用的是临时凭证,则您必须指定一个会话令牌。

  • 请验证您的临时凭证没有过期。

  • 请验证您已设置了适当的权限。

  • 在 macOS 上,请验证您没有在 Keychain 中缓存凭证。

错误:“Failed to submit frame to Kinesis Video client”(无法将帧提交到 Kinesis 视频客户端)

如果发生此错误,则表明源流中的时间戳设置不正确。尝试以下操作:

  • 使用最新的开发工具包示例,它可能包含能够修复您的问题的更新。

  • 将高质量视频流设置为更高的比特率,如果摄像机支持,则修复源流中的任何抖动。

GStreamer 应用程序停止运行,OS X 上显示消息 "streaming stopped, reason not-negotiated"

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 视频客户端时,出现错误:"Failed to allocate heap"

GStreamer 示例应用程序尝试分配 512 MB 的 RAM,这可能不适用于您的系统。您可以通过降低 KinesisVideoProducer.cpp 中的以下值来减少此分配:

device_info.storageInfo.storageSize = 512 * 1024 * 1024;

当在 Raspberry Pi 上运行 GStreamer 演示应用程序时,出现错误:"Illegal Instruction"

如果您在运行 GStreamer 演示时遇到以下错误,请确认您已为正确的设备版本编译应用程序。(例如,当你在 Raspberry Pi 2 上运行时,请确认你没有针对 Raspberry Pi 3 进行编译。)

INFO - Initializing curl. Illegal instruction

摄像机在 Raspberry Pi 上加载失败

要检查摄像机是否已加载,请运行以下命令:

ls /dev/video*

如果未找到,请运行以下命令:

vcgencmd get_camera

该输出值应该类似于以下内容:

supported=1 detected=1

如果驱动程序无法检测到摄像机,请执行以下操作:

  1. 检查物理摄像机相机设置并验证其是否已正确连接。

  2. 运行以下命令以升级固件:

    sudo rpi-update
  3. 重启设备。

  4. 运行以下命令以加载驱动程序:

    sudo modprobe bcm2835-v4l2
  5. 验证是否已检测到摄像机:

    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 服务并重新启动应用程序。

Android 上的 STATUS_MKV_INVALID_ANNEXB_NALU_IN_FRAME_DATA (0x3200000d) 错误

如果 NAL 适配标志 对于媒体流不正确,则会出现以下错误:

putKinesisVideoFrame(): Failed to put a frame with status code 0x3200000d

如果发生此错误,请为您的媒体提供正确的 .withNalAdaptationFlags 标记(例如,NAL_ADAPTATION_ANNEXB_CPD_NALS)。在 Android 创建者库 的以下行中提供此标记:

https://github.com/awslabs/ aws-sdk-android-samples /blob/master/ /src/main/java/com/amazonaws/kinesisvideo/demoapp/fragmen AmazonKinesisVideoDemoApp t/ .java #L169 StreamConfigurationFragment

已达到最大片段持续时间错误

此错误在流中的媒体片段超出最大片段持续时间限制时发生。请参阅本媒体和存档媒体 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-namekvssink元素的必填参数)的值与的值相同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 Streams IP 地址范围列入许可名单。

有关更多信息,请参阅 Amazon IP 范围。要在 IP 范围发生变化时收到通知,请按照订阅程序进行操作。