

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

# 解决与存储会话连接的问题
<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报价来启动与受控对等体的连接。对于 peer-to-peer会话，观看者参与者通过 Signaling 向主参与者发送报价来启动连接。连接到存储会话进行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 中没有 senderClientId 字段，这与 peer-to-peer主服务器不同，后者总是接收带有 SDP 选件和 ICE 候选 senderClientId 字段。

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

在[发送 SDP 答案](https://docs.aws.amazon.com//kinesisvideostreams-webrtc-dg/latest/devguide/SendSdpAnswer.html)并与存储会话[交换 ICE 候选](https://docs.aws.amazon.com//kinesisvideostreams-webrtc-dg/latest/devguide/SendIceCandidate.html)内容时，我们建议在消息`correlationId`中包含 a。在消息`correlationId`中包含允许存储会话返回`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音频和视频的SDP示例答案的片段。 VP8 

```
...
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 答案中，查看视频和音频收发器的方向性。社民党中的台词是这样的：

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

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

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

如果不满足服务要求，则如果在发送答案时提供了 correlationID，则 IllegalArgumentException 将返回值为 400 的 StatusResponse。

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

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

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

从存储会话中收到的 ICE 候选对象不包含 SDPMID 属性，也不带有。 senderClientId

查看您的应用程序逻辑，以便将从远程接收的 ICE 候选对象添加到应用程序的 C RTCPeer onnection 对象中。

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

需要通过 addIceCandidate API 将从存储会话中收到的所有候选ICE添加到 RTCPeer连接中。

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

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

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

1. 这些样本维护着 RTCPeer与其连接 senderClientId 的映射。

1. 这些样本保留了另一张地图，显示了 senderClientId 待处理的候选冰上候选人名单。

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

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