

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

# 对 Kinesis Video Streams 进行故障排除
<a name="troubleshooting"></a>

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

**Topics**
+ [一般性问题](#troubleshooting-general)
+ [API 问题](#troubleshooting-api)
+ [HLS 问题](#troubleshooting-hls)
+ [Java 问题](#troubleshooting-java)
+ [制作人库问题](#troubleshooting-producer)
+ [直播解析器库问题](#troubleshooting-parser)
+ [网络问题](#troubleshooting-network)

## 一般性问题
<a name="troubleshooting-general"></a>

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

**Topics**
+ [延迟太高](#troubleshooting-general-latency)

### 延迟太高
<a name="troubleshooting-general-latency"></a>

延迟可能是由发送到 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 问题
<a name="troubleshooting-api"></a>

本节介绍您在使用 Kinesis Video Streams 时可能遇到的 API 问题。

**Topics**
+ [错误：“Unknown options”](#troubleshooting-api-unknown-options)
+ [错误：“无法确定要授权的 service/operation 名称”](#troubleshooting-api-name-auth)
+ [错误：“Failed to put a frame in the stream（无法将帧放入流）”](#troubleshooting-api-putframe)
+ [错误：“服务在收到最终版本之前关闭 AckEvent 了连接”](#troubleshooting-api-closeconnection)
+ [错误：“STATUS\_STORE\_OUT\_OF\_MEMORY”](#troubleshooting-api-storeoutofmemory)
+ [错误：“证书的范围应限于有效区域。”](#troubleshoot-api-credential)

### 错误：“Unknown options”
<a name="troubleshooting-api-unknown-options"></a>

下列错误可导致 `GetMedia` 和 `GetMediaForFragmentList` 失败：

```
Unknown options: <filename>.mkv
```

如果您配置的`output`类型为， Amazon CLI 则会出现此错误`json`。 Amazon CLI 使用默认输出类型 (`none`) 重新配置。[有关配置的信息 Amazon CLI，请参阅《*Amazon CLI 命令参考*》中的 configure。](https://docs.amazonaws.cn/cli/latest/reference/configure)

### 错误：“无法确定要授权的 service/operation 名称”
<a name="troubleshooting-api-name-auth"></a>

下列错误可导致 `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（无法将帧放入流）”
<a name="troubleshooting-api-putframe"></a>

下列错误可导致 `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 故障排除](https://docs.amazonaws.cn/cli/latest/userguide/troubleshooting.html)以了解更多信息。

### 错误：“服务在收到最终版本之前关闭 AckEvent 了连接”
<a name="troubleshooting-api-closeconnection"></a>

下列错误可导致 `PutMedia` 失败：

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

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

### 错误：“STATUS\_STORE\_OUT\_OF\_MEMORY”
<a name="troubleshooting-api-storeoutofmemory"></a>

下列错误可导致 `PutMedia` 失败：

```
The content store is out of memory.
```

当内容存储没有分配到足够的大小时，会发生此错误。要增加内容存储的大小，请增加 `StorageInfo.storageSize` 的值。有关更多信息，请参阅 [StorageInfo](producer-reference-structures-producer.md#producer-reference-structures-producer-storageinfo)。

### 错误：“证书的范围应限于有效区域。”
<a name="troubleshoot-api-credential"></a>

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

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

在某些应用程序（例如 [kvssink](examples-gstreamer-plugin.md)）中，区域回退链默认为。`us-west-2`根据您使用的应用程序，验证您是否正确设置了您的区域。

## HLS 问题
<a name="troubleshooting-hls"></a>

如果您的视频流无法正确播放，请参阅[HLS 问题疑难解答](hls-playback.md#how-hls-ex1-ts)。

## Java 问题
<a name="troubleshooting-java"></a>

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

**Topics**
+ [启用 Java 日志](#troubleshooting-java-log)

### 启用 Java 日志
<a name="troubleshooting-java-log"></a>

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

1. 在 `dependencies` 节点中，将 `log4j` 添加到 `pom.xml``` 文件：

   ```
   <dependency>
       <groupId>log4j</groupId>
       <artifactId>log4j</artifactId>
       <version>1.2.17</version>
   </dependency>
   ```

1. 在 `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 控制台。

## 制作人库问题
<a name="troubleshooting-producer"></a>

此部分介绍了在采用 [上传到 Kinesis Video Streams](producer-sdk.md) 时可能会遇到的问题。

**Topics**
+ [无法编译制作者 SDK](#troubleshooting-producer-compile)
+ [视频流未显示在控制台中](#troubleshooting-producer-console)
+ [使用 GStreamer 演示应用程序流式传输数据时出现错误：“请求中包含的安全令牌无效”](#troubleshooting-producer-general-securitytoken)
+ [错误：“Failed to submit frame to Kinesis Video client”(无法将帧提交到 Kinesis 视频客户端)](#troubleshooting-producer-failed-frame-client)
+ [GStreamer 应用程序在 OS X 上停止，并显示 “流式传输已停止，原因未协商” 消息](#troubleshooting-producer-failed-stream-osx)
+ [错误：在 Raspberry Pi 的演示 GStreamer 中创建 Kinesis 视频客户端时出现 “分配堆失败”](#troubleshooting-producer-raspberrypi-heap)
+ [错误：在 Raspberry Pi 上运行 GStreamer 演示时出现 “非法指令”](#troubleshooting-producer-raspberrypi-illegalinstruction)
+ [摄像机在 Raspberry Pi 上加载失败](#troubleshooting-producer-raspberrypi-camera)
+ [在 macOS High Sierra 上未找到摄像机](#troubleshooting-producer-sierra-camera)
+ [在 macOS High Sierra 上编译时，找不到 jni.h 文件](#troubleshooting-producer-sierra-compile)
+ [运行 GStreamer 演示应用程序时出现 curl 错误](#troubleshooting-producer-curl)
+ [Raspberry Pi 上运行时的时间戳/范围断言](#troubleshooting-producer-raspberrypi-timestamp-assert)
+ [Raspberry Pi 上的 gst\_value\_set\_fraction\_range\_full 断言](#troubleshooting-producer-raspberrypi-gst-assert)
+ [Android 上的 STATUS\_MKV\_INVALID\_ANNEXB\_NALU\_IN\_FRAME\_DATA (0x3200000d) 错误](#troubleshooting-producer-android-invalid-annexb)
+ [已达到最大片段持续时间错误](#troubleshooting-producer-maxfragmentduration)
+ [使用 IoT 授权时出现“Invalid thing name passed (传递的事物名称无效)”错误](#troubleshooting-producer-thingname)

### 无法编译制作者 SDK
<a name="troubleshooting-producer-compile"></a>

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

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

### 视频流未显示在控制台中
<a name="troubleshooting-producer-console"></a>

要在控制台中显示视频流，它必须使用 H.264 以 AvCC 格式编码。如果未显示您的流，请验证以下内容：
+ 如果原始流使用 Annex-B 格式，则您的 [NAL 适应标志](producer-reference-nal.md) 设置为 `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，提取两个（将是 Ab (Sps) Ab NALUs (Pps)）并将其设置在 CPD 中，然后将其设置在 CPD 中。`StreamDefinition`

### 使用 GStreamer 演示应用程序流式传输数据时出现错误：“请求中包含的安全令牌无效”
<a name="troubleshooting-producer-general-securitytoken"></a>

如果发生此错误，则您的凭证存在问题。请验证以下内容：
+ 如果您使用的是临时凭证，则您必须指定一个会话令牌。
+ 请验证您的临时凭证没有过期。
+ 请验证您已设置了适当的权限。
+ 在 macOS 上，请验证您没有在 Keychain 中缓存凭证。

### 错误：“Failed to submit frame to Kinesis Video client”(无法将帧提交到 Kinesis 视频客户端)
<a name="troubleshooting-producer-failed-frame-client"></a>

如果发生此错误，则表明源流中的时间戳设置不正确。尝试以下操作：
+ 使用最新的开发工具包示例，它可能包含能够修复您的问题的更新。
+ 将高质量视频流设置为更高的比特率，如果摄像机支持，则修复源流中的任何抖动。

### GStreamer 应用程序在 OS X 上停止，并显示 “流式传输已停止，原因未协商” 消息
<a name="troubleshooting-producer-failed-stream-osx"></a>

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 视频客户端时出现 “分配堆失败”
<a name="troubleshooting-producer-raspberrypi-heap"></a>

 GStreamer 示例应用程序尝试分配 512 MB 的 RAM，但这可能在您的系统上不可用。您可以通过降低 `KinesisVideoProducer.cpp` 中的以下值来减少此分配：

```
device_info.storageInfo.storageSize = {{512}} * 1024 * 1024;
```

### 错误：在 Raspberry Pi 上运行 GStreamer 演示时出现 “非法指令”
<a name="troubleshooting-producer-raspberrypi-illegalinstruction"></a>

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

```
INFO - Initializing curl.
Illegal instruction
```

### 摄像机在 Raspberry Pi 上加载失败
<a name="troubleshooting-producer-raspberrypi-camera"></a>

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

```
ls /dev/video*
```

如果未找到，请运行以下命令：

```
vcgencmd get_camera
```

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

```
supported=1 detected=1
```

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

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

1. 运行以下命令以升级固件：

   ```
   sudo rpi-update
   ```

1. 重启设备。

1. 运行以下命令以加载驱动程序：

   ```
   sudo modprobe bcm2835-v4l2
   ```

1. 验证是否已检测到摄像机：

   ```
   ls /dev/video*
   ```

### 在 macOS High Sierra 上未找到摄像机
<a name="troubleshooting-producer-sierra-camera"></a>

在 macOS High Sierra 上，如果有多个摄像机可用，则演示应用程序无法找到摄像机。

### 在 macOS High Sierra 上编译时，找不到 jni.h 文件
<a name="troubleshooting-producer-sierra-compile"></a>

要纠正该错误，请将 Xcode 安装更新为最新的版本。

### 运行 GStreamer 演示应用程序时出现 curl 错误
<a name="troubleshooting-producer-curl"></a>

要解决运行 GStreamer 演示应用程序时的 curl 错误，请将[此证书文件](https://www.amazontrust.com/repository/SFSRootCAG2.pem)复制到。`/etc/ssl/cert.pem`

### Raspberry Pi 上运行时的时间戳/范围断言
<a name="troubleshooting-producer-raspberrypi-timestamp-assert"></a>

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

```
sudo rpi-update 
$ sudo reboot
```

### Raspberry Pi 上的 gst\_value\_set\_fraction\_range\_full 断言
<a name="troubleshooting-producer-raspberrypi-gst-assert"></a>

如果 `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) 错误
<a name="troubleshooting-producer-android-invalid-annexb"></a>

如果 [NAL 适应标志](producer-reference-nal.md) 对于媒体流不正确，则会出现以下错误：

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

如果发生此错误，请为您的媒体提供正确的 `.withNalAdaptationFlags` 标记（例如，`NAL_ADAPTATION_ANNEXB_CPD_NALS`）。在 [Android](producer-sdk-android.md) 的以下行中提供此标记：

[ https://github.com/awslabs/aws-sdk-android-samples/blob/master/AmazonKinesisVideoDemoApp/src/main/java/com/amazonaws/kinesisvideo/demoapp/fragment/StreamConfigurationFragment.java \#L169](https://github.com/awslabs/aws-sdk-android-samples/blob/master/AmazonKinesisVideoDemoApp/src/main/java/com/amazonaws/kinesisvideo/demoapp/fragment/StreamConfigurationFragment.java#L169)

### 已达到最大片段持续时间错误
<a name="troubleshooting-producer-maxfragmentduration"></a>

此错误在流中的媒体片段超出最大片段持续时间限制时发生。请参阅本[媒体和存档媒体 API 服务配额](limits.md#limits-akv-data)节中的最大片段持续时间限制。

要解决该问题，请尝试以下操作：
+ 如果您使用的是 webcam/USB 相机，请执行以下操作之一：
  + 如果您使用的是基于关键帧的分段，请将编码器设置为在 10 秒内提供关键帧。
  + 如果您没有使用基于关键帧的分段，则在中定义直播时[编写并检查代码](producersdk-cpp-write.md)，请将最大片段持续时间限制设置为小于 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 (传递的事物名称无效)”错误
<a name="troubleshooting-producer-thingname"></a>

要避免在使用物联网凭据进行授权时出现此错误 (`HTTP Error 403: Response: {"message":"Invalid thing name passed"}`)，请确保`stream-name`（`kvssink`元素的必填参数）的值与的值相同`iot-thingname`。有关更多信息，请参阅 [GStreamer 元素参数参考](examples-gstreamer-plugin-parameters.md)。

## 直播解析器库问题
<a name="troubleshooting-parser"></a>

此部分介绍了在采用 [使用解析器库进行直播](parser-library.md) 时可能会遇到的问题。

**Topics**
+ [无法从流中访问单个帧](#troubleshooting-parser-frame)
+ [片段解码错误](#troubleshooting-parser-fragment)

### 无法从流中访问单个帧
<a name="troubleshooting-parser-frame"></a>

要访问消费者应用程序中来自流媒体源的单个帧，请验证您的直播是否包含正确的编解码器私有数据。有关流中数据格式的信息，请参阅 [数据模型](how-data.md)。

[要了解如何使用编解码器私有数据访问帧，请参阅 GitHub 网站上的以下测试文件：KinesisVideoRendererExampleTest.java](https://github.com/aws/amazon-kinesis-video-streams-parser-library/blob/master/src/test/java/com/amazonaws/kinesisvideo/parser/examples/KinesisVideoRendererExampleTest.java)

### 片段解码错误
<a name="troubleshooting-parser-fragment"></a>

如果您的片段未采用浏览器支持的 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 格式对帧数据进行编码。

## 网络问题
<a name="troubleshooting-network"></a>

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

如果您的设置对 Kinesis Video Streams 有 IP 地址范围限制，请更新您的网络配置以将 Kinesis Vide [o](https://ip-ranges.amazonaws.com/ip-ranges.json) Streams IP 地址范围列入许可名单。

**重要**  
IP 范围列表并不是 Kinesis Video Streams IP 地址的详尽列表。包括您看到的 IP 地址范围，并注意 IP 地址可能会随着时间的推移而发生变化。

有关更多信息，请参阅 [Amazon IP 范围](https://docs.amazonaws.cn//vpc/latest/userguide/aws-ip-ranges.html)。要在 IP 范围发生变化时收到通知，请按照[订阅程序](https://docs.amazonaws.cn//vpc/latest/userguide/aws-ip-ranges.html#subscribe-notifications)进行操作。