对 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 格式对帧数据进行编码。