View a markdown version of this page

Kinesis 视频流疑难解答 - Amazon Kinesis Video Streams
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

Kinesis 视频流疑难解答

使用以下信息来解决 Amazon Kinesis Video Streams 遇到的常见问题。

一般性问题

本节介绍您在使用 Kinesis 视频流时可能遇到的一般问题。

延迟太高

延迟可能是由发送到 Kinesis 视频流服务的片段的持续时间造成的。降低创建者与服务间延迟的一种方法是配置媒体管道,以缩短片段持续时间。

要减少每个片段中发送的帧数,请减少以下值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 视频流时可能遇到的 API 问题。

错误:“Unknown options”

下列错误可导致 GetMediaGetMediaForFragmentList 失败:

Unknown options: <filename>.mkv

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

错误:“无法确定要授权的 service/operation 姓名”

下列错误可导致 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

错误:“凭证的范围应限定为有效区域。”

如果签名区域与终端节点区域不匹配,则会发生此错误。

例如,如果您指定us-west-2为签名区域,但尝试连接到 kinesisvideo.us-east-1.amazonaws.com (us-east-1) 终端节点,则会收到此错误。

在某些应用程序(例如 kvssink)中,区域回退链默认为。us-west-2确认您根据正在使用的应用程序正确设置了区域。

HLS 问题

如果您的视频流无法正确播放,请参阅对 HLS 问题进行故障排除

Java 问题

本节介绍如何解决在使用 Kinesis 视频流时遇到的常见 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 控制台。

制作人库问题

此部分介绍了在采用 上传到 Kinesis Video Streams 时可能会遇到的问题。

无法编译生产者 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 格式对其进行编码。如果未显示您的流,请验证以下内容:

  • NAL_ADAPTATION_ANNEXB_NALS | NAL_ADAPTATION_ANNEXB_CPD_NALS如果原始直播 Annex-B 采用格式,则将设置为。NAL 适应标志这是 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 CPD(编解码器私有数据)以 SPS 和 PPS 的形式出现在数据流中,则可以适应 avCC 格式。除非媒体管道单独提供 CPD,否则应用程序可以通过查找第一个 Idr 帧(其中应包含 SPS 和 PPS)从帧中提取 CPD,提取两个 NALU(将是 Ab (Sps) Ab (Pps))并将其设置在 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 演示版时遇到以下错误,请确认您已为正确的设备版本编译了应用程序。(例如,验证你在树莓派 2 上运行时没有为树莓派 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 中。

Timestamp/range 在树莓派上运行时的断言

如果时间戳范围断言发生在运行时,请更新固件并重启设备:

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/AmazonKinesisVideoDemoApp/src/main/java/com/amazonaws/kinesisvideo/demoapp/fragment/StreamConfigurationFragment.java#L169

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

此错误在流中的媒体片段超出最大片段持续时间限制时发生。请参阅本媒体和存档媒体 API 服务配额节中的最大片段持续时间限制。

要解决该问题,请尝试以下操作:

  • 如果您使用 webcam/USB 相机,请执行以下任一操作:

    • 如果您使用基于关键帧的分段,请将编码器设置为在 10 秒内提供关键帧。

    • 如果您不使用基于关键帧的片段,则在中定义直播时编写并检查代码,将最大片段持续时间限制设置为小于 10 秒的值。

    • 如果你在 GStreamer 管道中使用软件编码器(如 x264),则可以在 10 秒内将 key-int-max 属性设置为一个值。例如,将 key-int-max 设置为 60,将 fps 设置为 30,以每 2 秒启用一次关键帧。

  • 如果您使用的是 RPI 摄像机,请将关键帧间隔属性设置为小于 10 秒。

  • 如果你使用的是 IP (RTSP) 摄像机,请将 GOP 大小设置为 60。

使用 IoT 授权时出现“Invalid thing name passed (传递的事物名称无效)”错误

为避免在使用 IoT 凭据进行授权时出现此错误 (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 配置文件和级别与编解码器私有数据中指定的配置文件和级别相匹配。

  • 浏览器支持 profile/level 这种组合。最新的浏览器支持所有配置文件和级别组合。

  • 时间戳准确且采用正确顺序,并且未创建任何重复的时间戳。

  • 您的应用程序正在使用该 H.264 格式对帧数据进行编码。

网络问题

如果您在尝试连接到 Kinesis Video Streams 时看到连接错误,例如 “连接超时” 或 “连接失败”,则可能是由于网络设置中的 IP 地址范围限制所致。

如果您的设置有 Kinesis Video Streams 的 IP 地址范围限制,请更新您的网络配置,将 Kinesis Video Streams IP 地址范围列入允许名单。

重要

IP 范围列表并不是 Kinesis Video Streams IP 地址的详尽列表。包括您看到的 IP 地址范围,请注意 IP 地址可能会随时间而变化。

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