

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

# Amazon Kinesis Video Streams with WebRTC 故障排除
<a name="troubleshooting"></a>

使用以下信息来排查 Amazon Kinesis Video Streams with WebRTC 可能遇到的常见问题。

## 建立 peer-to-peer会话的问题
<a name="establish-session"></a>

WebRTC 可以帮助缓解由于以下原因而出现的问题：
+ 网络地址转换（NAT）
+ 防火墙
+ 对等设备之间的代理

WebRTC 提供了一个框架，可在对等设备连接期间帮助协商和维护连接。它还提供了一种在无法协商 peer-to-peer连接的情况下通过`TURN`服务器中继媒体的机制。

考虑到建立连接所需的所有组件，有必要了解一些可用来帮助解决会话建立相关问题的工具。

**Topics**
+ [会话描述协议 (SDP) 提议和应答](#sdp)
+ [评估 ICE 候选项的生成](#ice-candidate)
+ [确定使用了哪些候选项来建立连接](#determine-candidate)
+ [与冰有关的超时](#troubleshooting-ice-timeouts)

### 会话描述协议 (SDP) 提议和应答
<a name="sdp"></a>

会话描述协议 (SDP) 提议和应答将对等设备之间的 RTC 会话进行初始化。

要了解有关 SDP 协议的更多信息，请参阅[规范](https://www.rfc-editor.org/rfc/rfc4566#section-5)。
+ **选**件由 “观众” 生成，他们希望通过WebRTC在Kinesis Video Streams中以 “主人” 的身份与连接到信令频道的对等方建立联系。
+ **应答**由提议的接收者生成。

提议和应答都是在客户端生成的，尽管它们可能包含迄今为止已经收集到的 ICE 候选项。

适用于 [C 的 Kinesis Video Streams WebRTC SDK](https://github.com/awslabs/amazon-kinesis-video-streams-webrtc-sdk-c#getting-the-sdps) 包含一个简单的环境变量，你可以将其设置以记录 SDP。这有助于了解收到的提议和生成的应答。

 SDPs 要`stdout`从 SDK 登录，请设置以下环境变量：`export DEBUG_LOG_SDP=TRUE`。您还可以使用该`sdpOffer`事件在 JavaScript基于客户端的客户端中记录 SDP 的报价和答案。要查看此演示，请参阅[GitHub](https://github.com/awslabs/amazon-kinesis-video-streams-webrtc-sdk-js/blob/983b62f07330e05277fd072f8062fecd8233bce7/examples/master.js#L123)。

有关更多信息，请参阅 [使用 WebRTC 监控 Kinesis Video Streams](kvswebrtc-monitoring-cw.md)。

如果未返回 SDP 答案，则可能是对等设备无法接受 SDP 提议，因为该提议不包含任何兼容的媒体编解码器。您将看到类似以下内容的日志：

```
I/webrtc_video_engine.cc: (line 808): SetSendParameters: {codecs: [VideoCodec[126:H264]], conference_mode: no, extensions: [], extmap-allow-mixed: false, max_bandwidth_bps: -1, mid: video1}
E/webrtc_video_engine.cc: (line 745): No video codecs supported.
E/peer_connection.cc: (line 6009): Failed to set remote video description send parameters for m-section with mid='video1'. (INVALID_PARAMETER)
E/peer_connection.cc: (line 3097): Failed to set remote offer sdp: Failed to set remote video description send parameters for m-section with mid='video1'.
E/KinesisVideoSdpObserver: onSetFailure(): Error=Failed to set remote offer sdp: Failed to set remote video description send parameters for m-section with mid='video1'.
D/KVSWebRtcActivity: Received SDP offer for client ID: null. Creating answer
E/peer_connection.cc: (line 2373): CreateAnswer: Session error code: ERROR_CONTENT. Session error description: Failed to set remote video description send parameters for m-section with mid='video1'..
E/KinesisVideoSdpObserver: onCreateFailure(): Error=Session error code: ERROR_CONTENT. Session error description: Failed to set remote video description send parameters for m-section with mid='video1'..
```

在查看 SDP 提议的内容时，请查找以 `a=rtpmap` 开头的行，以查看请求的是哪些媒体编解码器。

```
...
a=rtpmap:126 H264/90000
...
a=rtpmap:111 opus/48000/2
...
```

**如果您使用 Safari 作为查看器连接到发送 H.265 媒体的主机，则会遇到以下情况：**
+ `InvalidAccessError: Failed to set remote answer sdp: Called with SDP without DTLS fingerprint.`
+ `InvalidAccessError: Failed to set remote answer sdp: rtcp-mux must be enabled when BUNDLE is enabled.`

确认问题出在浏览器生成的 SDP 报价上。在 SDP 报价中，搜索以 H.265 开头的线路`a=rtpmap`，然后检查是否有 H.265 的线路。它应如下所示：

```
a=rtpmap:104 H265/90000
```

如果该编解码器不存在，请在 Safari 设置中启用 WebRTC 的 H.265 编解码器。

在 Safari 浏览器顶部导航栏中，执行以下操作：
+ 选择 **Safari 浏览器** > **设置...** > **高级**。选中 “**显示 Web 开发者的功能**” 复选框。
+ 选择 “**功能标志**”。选中 **WebRTC H265 编解码器复选框**。

重新启动浏览器以使更改生效。

### 评估 ICE 候选项的生成
<a name="ice-candidate"></a>

ICE 候选项由每个向 `STUN` 服务器发出调用的客户端生成。对于 Kinesis Video Streams with WebRTC 来说，`STUN` 服务器是 `stun:stun.kinesisvideo.{aws-region}.amazonaws.com:443`。

除了调用 `STUN` 服务器获取候选项外，客户端通常还会调用 `TURN` 服务器。他们进行此调用是为了在无法建立直接 peer-to-peer连接时将中继服务器用作后备服务器。

您可以使用以下工具来生成 ICE 候选对象：
+ [Trickle ICE WebRTC](https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/) 样本，其使用 Trickle ICE 来收集候选项
+ [IceTest.Info](https://icetest.info/)

使用这两个工具。您可以输入 `STUN` 和 `TURN` 服务器信息来收集候选项。

[要通过 WebRTC 获取 Kinesis Video Streams 的`TURN`服务器信息和必要凭证，您可以调用 API 操作。GetIceServerConfig ](https://docs.aws.amazon.com//kinesisvideostreams/latest/dg/API_AWSAcuitySignalingService_GetIceServerConfig.html)

以下 AWS CLI 调用演示了如何获取此信息以用于这两个工具。

```
export CHANNEL_ARN="YOUR_CHANNEL_ARN"

aws kinesisvideo get-signaling-channel-endpoint \
    --channel-arn $CHANNEL_ARN \
    --single-master-channel-endpoint-configuration Protocols=WSS,HTTPS,Role=MASTER
```

[https://docs.aws.amazon.com//kinesisvideostreams/latest/dg/API_GetSignalingChannelEndpoint.html](https://docs.aws.amazon.com//kinesisvideostreams/latest/dg/API_GetSignalingChannelEndpoint.html) 命令的输出如下所示：

```
{
  "ResourceEndpointList": [
    {
      "Protocol": "HTTPS",
      "ResourceEndpoint": "https://your-endpoint.kinesisvideo.us-east-1.amazonaws.com"
    },
    {
      "Protocol": "WSS",
      "ResourceEndpoint": "wss://your-endpoint.kinesisvideo.us-east-1.amazonaws.com"
    }
  ]
}
```

使用 HTTPS `ResourceEndpoint` 值获取 `TURN` 服务器列表，如下所示：

```
export ENDPOINT_URL="https://your-endpoint.kinesisvideo.us-east-1.amazonaws.com"

aws kinesis-video-signaling get-ice-server-config \
    --channel-arn $CHANNEL_ARN \
    --service TURN \
    --client-id my-amazing-client \
    --endpoint-url $ENDPOINT_URL
```

响应包含 `TURN` 服务器的详细信息，包括 TCP 和 UDP 的端点以及访问它们所需的凭证。

**注意**  
响应中的 TTL 值决定了这些凭证的有效期限（以秒为单位）。在 Trickle [ICE WebRTC](https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/) 示例或.Info [IceTest中](https://icetest.info/)使用这些值，使用 Kinesis Video Streams 托管服务端点生成 ICE 候选值。

### 确定使用了哪些候选项来建立连接
<a name="determine-candidate"></a>

了解成功建立会话时使用了哪些候选项可能会有所帮助。如果您的浏览器客户端正在运行已建立的会话，则可以使用内置的 webrtc-internals 实用程序在 Google Chrome 中确定这些信息。

在一个浏览器选项卡中打开 WebRTC 会话。

在另一个选项卡中，打开 `chrome://webrtc-internals/`。您可以在此选项卡中查看所进行会话的所有信息。

您将看到有关已建立连接的信息。例如：

![显示有关已建立连接信息的屏幕示例。](http://docs.aws.amazon.com/zh_cn/kinesisvideostreams-webrtc-dg/latest/devguide/images/webrtc-internals1.en.png)


您还可以确认已建立连接的以下指标。

![该图像显示 20 个较小的图表，这些图表显示一系列统计数据。](http://docs.aws.amazon.com/zh_cn/kinesisvideostreams-webrtc-dg/latest/devguide/images/webrtc-internals2.en.png)


### 与冰有关的超时
<a name="troubleshooting-ice-timeouts"></a>

中为 ICE 设置了默认超时值[KvsRtcConfiguration](https://awslabs.github.io/amazon-kinesis-video-streams-webrtc-sdk-c/structKvsRtcConfiguration.html)。对于大多数用户来说，默认值应该足够了，但是您可能需要对其进行调整，以提高通过较差的网络建立连接的机会。您可以在应用程序中配置这些默认值。

查看日志以了解默认设置：

```
2024-01-08 19:43:44.433 INFO    iceAgentValidateKvsRtcConfig():
	iceLocalCandidateGatheringTimeout: {{10000}} ms
	iceConnectionCheckTimeout: {{12000}} ms
	iceCandidateNominationTimeout: {{12000}} ms
	iceConnectionCheckPollingInterval: {{50}} ms
```

如果您的网络质量较差并且想要提高连接几率，请尝试调整以下值：
+ `iceLocalCandidateGatheringTimeout`-增加此超时限制，以收集更多潜在候选人尝试连接。目标是尝试所有可能的候选对，因此，如果您的网络状况不佳，请增加此限制以留出更多时间进行收集。

  例如，如果主机候选人不起作用，需要尝试服务器反身 (srflx) 或中继候选人，则可能需要延长此超时时间。由于网络不佳，候选人聚集速度很慢，应用程序不想在此步骤上花费超过20秒。增加超时时间可以为收集潜在候选人尝试连接提供更多时间。
**注意**  
我们建议该值应小于`iceCandidateNominationTimeout`，因为提名步骤需要有时间与新候选人合作。
+ `iceConnectionCheckTimeout`-在不稳定或运行缓慢的网络中，数据包交换和绑定请求/响应需要时间，因此会增加此超时时间。增加此超时允许至少一对候选人尝试由另一对候选人提名。
+ `iceCandidateNominationTimeout`-延长此超时时间以确保尝试使用本地中继候选的候选配对。

  例如，如果收集第一个本地中继候选需要大约 15 秒，请将超时设置为大于 15 秒的值，以确保成功尝试与本地中继候选的候选配对。如果将该值设置为小于 15 秒，SDK 将在尝试潜在候选对时失败，从而导致连接建立失败。
**注意**  
我们建议将此值设置为大于`iceLocalCandidateGatheringTimeout`，以使其生效。
+ `iceConnectionCheckPollingInterval`[-每个规格此值默认为 50 毫秒。](https://datatracker.ietf.org/doc/html/rfc8445#section-14.2)更改此值会更改连接检查的频率，本质上还会更改 ICE 状态机转换的频率。

  在具有良好系统资源的可靠、高性能的网络环境中，您可以降低该值以帮助更快地建立连接。增加该值可以帮助减少网络负载，但建立连接的速度可能会减慢。
**重要**  
我们不建议更改此默认值。