Amazon Kinesis Video Streams with WebRTC 故障排除 - Kinesis Video Streams
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

Amazon Kinesis Video Streams with WebRTC 故障排除

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

建立 peer-to-peer会话的问题

WebRTC 可以帮助缓解由于以下原因而出现的问题:

  • 网络地址转换(NAT)

  • 防火墙

  • 对等设备之间的代理

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

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

会话描述协议 (SDP) 提议和应答

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

要了解有关 SDP 协议的更多信息,请参阅规范

  • 件由 “观众” 生成,他们希望通过WebRTC在Kinesis Video Streams中以 “主人” 的身份与连接到信令频道的对等方建立联系。

  • 应答由提议的接收者生成。

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

适用于 C 的 Kinesis Video Streams WebRTC SDK 包含一个简单的环境变量,你可以将其设置以记录 SDP。这有助于了解收到的提议和生成的应答。

SDPs 要stdout从 SDK 登录,请设置以下环境变量:export DEBUG_LOG_SDP=TRUE。您还可以使用该sdpOffer事件在 JavaScript基于客户端的客户端中记录 SDP 的报价和答案。要查看此演示,请参阅GitHub

有关更多信息,请参阅 使用 WebRTC 监控 Kinesis Video Streams

如果未返回 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 候选项的生成

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

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

您可以使用以下工具来生成 ICE 候选对象:

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

要通过 WebRTC 获取 Kinesis Video Streams 的TURN服务器信息和必要凭证,您可以调用 API 操作。GetIceServerConfig

以下 Amazon 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

get-signaling-channel-endpoint 命令的输出如下所示:

{ "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 示例或.Info IceTest中使用这些值,使用 Kinesis Video Streams 托管服务端点生成 ICE 候选值。

确定使用了哪些候选项来建立连接

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

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

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

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

显示有关已建立连接信息的屏幕示例。

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

该图像显示 20 个较小的图表,这些图表显示一系列统计数据。

与冰有关的超时

中为 ICE 设置了默认超时值KvsRtcConfiguration。对于大多数用户来说,默认值应该足够了,但是您可能需要对其进行调整,以提高通过较差的网络建立连接的机会。您可以在应用程序中配置这些默认值。

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

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 毫秒。更改此值会更改连接检查的频率,本质上还会更改 ICE 状态机转换的频率。

    在具有良好系统资源的可靠、高性能的网络环境中,您可以降低该值以帮助更快地建立连接。增加该值可能有助于减少网络负载,但建立连接的速度可能会减慢。

    重要

    我们不建议更改此默认值。