

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

# 解决与存储会话连接的问题
<a name="troubleshoot-establish-storage"></a>

本节为与设置和配置用于录制视频流的存储器相关的故障排除提供指导。

**Topics**
+ [控制和控制同行](#troubleshoot-control-peers)
+ [查看支持的编解码器](#troubleshoot-review-codecs)
+ [如果频道未映射到直播，也会抛出 400 InvalidArgumentException](#troubleshoot-channel-mapping)

## 控制和控制同行
<a name="troubleshoot-control-peers"></a>

在 WebRTC 中，控制对等体通过发送 SDP 报价来启动与受控对等方的连接。对于点对点会话，查看者参与者通过信令向主参与者发送报价来启动连接。当连接到存储会话进行 WebRTC 摄取时，存储会话是控制对等体。对于主参与者，他们仍然是受控参与者。但是，观众参与者从控制切换到受控。

致电[JoinStorageSession](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/API_webrtc_JoinStorageSession.html)或时 [ JoinStorageSessionAsViewer](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/API_webrtc_JoinStorageSessionAsViewer.html)，所有参与者都必须回复SDP答案，并与存储会话交换ICE候选人。

有关序列图，请参阅了解 WebRTC 摄取和存储。

**重要**  
从存储会话接收的信令消息在 JSON 中没有发件人ClientId 字段，这与点对点主消息不同，点对点主消息始终接收发件人ClientId 字段以及 SDP 报价和 ICE 候选字段。

## 查看支持的编解码器
<a name="troubleshoot-review-codecs"></a>

当[发送 SDP 答案](https://docs.aws.amazon.com/kinesisvideostreams-webrtc-dg/latest/devguide/SendSdpAnswer.html)并[与存储会话](https://docs.aws.amazon.com/kinesisvideostreams-webrtc-dg/latest/devguide/SendIceCandidate.html)交换 ICE 候选时，我们建议在消息`correlationId`中加入。在消息`correlationId`中包含 a 允许存储会话返回`statusResponse`消息。这些消息将`correlationId`包含输入消息的，允许您跟踪该消息`statusResponse`属于哪条消息。这使您可以立即收到有关您的SDP答案被拒绝的原因的反馈。

有关 `correlationId` 和 `statusResponse` 的更多信息，请参阅 [异步消息接收](async-message-reception-api.md)。

存储会话可能拒绝 SDP 答案的一个常见原因是存储会话无法接受答案中指定的编解码器。样本`statusResponse`可能如下所示：

```
{
  "correlationId": "1700186220273",
  "errorType": "InvalidArgumentException",
  "statusCode": "400",
  "success": false
}
```

当您查看 SDP 答案内容时，请查看以开头的行`a=rtpmap`并验证编解码器是否与存储会话支持的编解码器相匹配。以下是包含 opus 音频和 VP8 视频的 SDP 示例答案的片段。

```
...
a=rtpmap:111 opus/48000/2
...
a=rtpmap:120 VP8/90000
...
```

[JoinStorageSession](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/API_webrtc_JoinStorageSession.html)有关支持的编解码器的列表，请参见。

## 如果频道未映射到直播，也会抛出 400 InvalidArgumentException
<a name="troubleshoot-channel-mapping"></a>

### 查看收发器方向
<a name="troubleshoot-transceiver-directions"></a>

在SDP答案中，查看视频和音频收发器的方向性。SDP 中的台词如下所示：

```
a=sendrecv
a=recvonly
```

对于大师参赛者，有以下要求：
+ H.264 视频：仅限发送
+ Opus 音频：sendonly 或 sendrecv

对于观众参与者，有以下要求：
+ H.264 视频：recvonly
+ Opus 音频：recvonly 或 sendrecv

如果未满足服务要求，则如果在发送答案时提供了相关性 ID，则 IllegalArgumentException 将返回一个 400 的 StatusResponse。

使用 KVS-provided WebRTC 摄取示例应用程序时：
+ 主参与者：确保 “发送视频” 和 “发送音频” 设置均已启用
+ 观众参与者：确保禁用 “发送视频” 设置

### 查看 ICE 候选人转换
<a name="troubleshoot-ice-candidate-conversion"></a>

当从 KVS 信令 SDK 接收 ICE 候选对象时，应用程序可能需要将字符串转换为 ICE 候选对象。

从存储会话中收到的 ICE 候选文件不包含 SDPMID 属性，也不附带发件人。ClientId

查看您的应用程序逻辑，将从远程接收的 ICE 候选人添加到应用程序的 RTCPeerConnection 对象中。

### 查看 ICE 候选人排队逻辑
<a name="troubleshoot-ice-candidate-queuing"></a>

从存储会话中收到的所有 ICE 候选文件都需要 RTCPeerConnection 通过添加 IceCandidate API 添加到中。

尽管存储会话在ICE候选人之前发送SDP报价，但由于信号消息传输的异步性质，应用程序可能会在收到报价之前收到ICE候选人。

在这种情况下，你需要实现一个临时缓冲区来存放ICE候选人。

在 KVS 示例应用程序中实现的逻辑如下所示：

1. 样本维护了发件人ClientId 到其的地图 RTCPeerConnection。

1. 这些样本保留了发件人的ClientId 另一张地图，列出了待处理的ICE候选人名单。

1. 收到ICE候选人后，请查看 PeerConnection 地图。如果 PeerConnection 地图还没有连接，请将其添加到待处理列表中。否则，请将 ICE 候选人添加到 PeerConnection.

1. 收到报价后，它会创建 RTCPeerConnection 并将其添加到 PeerConnection 地图中。然后，将待处理队列中的所有 ICE 候选人添加到该队列中 PeerConnection。