

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

# 直播媒体 (SDKs)
<a name="webrtc-sdks"></a>

在 Amazon Kinesis Video Streams WebRTC 中，对等设备是配置为通过信令通道进行实时、双向直播的设备。带有 WebRTC 的 Amazon Kinesis Vid SDKs eo Streams easy-to-use 是软件库，您可以将其下载并安装在要通过给定信令通道配置为对等设备的设备和应用程序客户端上。

带有 WebRTC 的 Amazon Kinesis Video Streams 包括以下内容： SDKs
+ [亚马逊 Kinesis Video Streams 带有 WebRTC 开发工具包的 C 语言版本，适用于嵌入式设备](kvswebrtc-sdk-c.md)
+ [带有 WebRTC 开发工具包的 Amazon Kinesis Video Streams 适用于网络应用程序 JavaScript](kvswebrtc-sdk-js.md)
+ [适用于安卓的亚马逊 Kinesis Video Streams WebRTC SDK](kvswebrtc-sdk-android.md)
+ [适用于 iOS 的亚马逊 Kinesis Video Streams WebRTC SDK](kvswebrtc-sdk-ios.md)

每个 SDK 都包含相应的示例和 step-by-step说明，可帮助您构建和运行这些应用程序。您可以使用这些样本在Web/Android/iOS应用程序或嵌入式设备的任何组合之间进行低延迟、直播、双向音频和视频流以及数据交换。换句话说，您可以将实时音频和视频从嵌入式摄像头设备流式传输到 Android 或 Web 应用程序，或在两个 Android 应用程序之间进行流式传输。

# 亚马逊 Kinesis Video Streams 带有 WebRTC 开发工具包的 C 语言版本，适用于嵌入式设备
<a name="kvswebrtc-sdk-c"></a>

以下 step-by-step说明描述了如何为嵌入式设备下载、构建和运行带有 WebRTC SDK 的 C 语言开发工具包的 Kinesis Video Streams 及其相应示例。

支持以下编解码器：
+ **音频：**
  + G.711 A-Law
  + G.711 U-Law
  + Opus
+ **视频:**
  + H.264
  + H.265
  + VP8

## 下载 SDK
<a name="gs-download-sdk"></a>

要下载 C 中适用于嵌入式设备的 Kinesis Video Streams with WebRTC 开发工具包，请运行以下命令：

```
$ git clone https://github.com/awslabs/amazon-kinesis-video-streams-webrtc-sdk-c.git
```

## 构建 SDK
<a name="gs-build-sdk"></a>

**重要**  
在 macOS 上完成这些步骤之前，根据您的 macOS 版本，您必须运行 `xcode-select --install` 下载带有命令行工具和标头的软件包。然后打开`/Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg`并按照安装程序安装命令行工具和标头。这些操作只需要在调用 `cmake` 前执行一次。如果您已经安装了命令行工具和标头，则无需再次运行此命令。

完成以下步骤：

****

1. 安装 cmake：
   + 在 macOS 上运行 `brew install cmake pkg-config srtp` 
   + 在 Ubuntu 上运行 `sudo apt-get install pkg-config cmake libcap2 libcap-dev`

1. 获取要用于此演示 AWS 账户 的访问密钥和密钥。

1. 运行以下命令在您下载的 WebRTC C 开发工具包中创建一个 `build` 目录，并从中执行 `cmake`：

   ```
   $ mkdir -p amazon-kinesis-video-streams-webrtc-sdk-c/build; cd amazon-kinesis-video-streams-webrtc-sdk-c/build; cmake ..
   ```

1. 现在，导航到刚使用上述步骤创建的 `build` 目录，然后运行 `make` 以构建 WebRTC C 开发工具包及其提供的示例。
**注意**  
 如果系统尚未安装 `gstreamer`，则无法构建 `kvsWebrtcClientMasterGstSample`。要确保它是（在 macOS 上）构建的，您必须运行：`brew install gstreamer gst-plugins-base gst-plugins-good`

## 运行 SDK 示例
<a name="gs-run-c-sample"></a>

完成上述过程后，您最终会在您的 `build` 目录中使用以下示例应用程序：
+ `kvsWebrtcClientMaster`-此应用程序通过信令通道发送样本 H264/Opus 帧（路径：/samples/h264SampleFrames and /samples/opusSampleFrames）。它也接受传入的音频（如果在浏览器中启用）。在浏览器中勾选时，它会打印终端中收到的音频数据包的元数据。
+ `kvsWebrtcClientViewer` - 此应用程序接受示例 H264/Opus 帧并打印出来。
+ `kvsWebrtcClientMasterGstSample`-此应用程序从管道发送样本 H264/Opus 帧。 GStreamer 

要运行任何这些示例，请完成以下步骤：

1. 使用您的 AWS 账户 凭据设置您的环境：

   ```
   export AWS_ACCESS_KEY_ID=YourAccessKey
   export AWS_SECRET_ACCESS_KEY=YourSecretKey
   export AWS_DEFAULT_REGION=YourAWSRegion
   ```

   如果您使用的是临时 AWS 证书，请同时导出您的会话令牌：

   ```
   export AWS_SESSION_TOKEN=YourSessionToken
   ```

   如果您要设置自定义 CA 证书路径，则可以使用以下方法进行设置：

   ```
   export AWS_KVS_CACERT_PATH=../certs/cert.pem
   ```
**注意**  
默认情况下，SSL CA 证书设置为... /certs/cert.pem，它指向此存储库中的文件。[GitHub](https://github.com/awslabs/amazon-kinesis-video-streams-webrtc-sdk-c/blob/master/certs/cert.pem)

1. 通过将您要向信令通道提供的名称传递给示例应用程序来运行任一应用程序。应用程序使用您提供的名称创建信令通道。例如，要创建一个名为 `myChannel` 的信令通道并开始通过该通道发送示例 H264/Opus 帧，请运行以下命令：

   ```
   ./kvsWebrtcClientMaster myChannel
   ```

   当命令行应用程序打印 `Connection established` 时，您可以继续下一步。

1. 现在您的信令通道已创建，并且连接的主设备正在将媒体流式传输到它，您可以查看此流。例如，您可以在 Web 应用程序中查看此实时流。为此，请按照[使用示例应用程序](kvswebrtc-sdk-js.md#build-sdk-js)中的步骤打开 WebRTC SDK 测试页面，并使用您在上面为主服务器指定的 AWS 相同凭据和相同的信令通道设置以下值：
   + 访问密钥 ID
   + 秘密访问密钥
   + 信令通道名称
   + 客户端 ID（可选）

   选择 **Start viewer (启动查看器)** 以启动示例 H264/Opus 帧的实时视频流式传输。

## 教程视频
<a name="sdk-c-video"></a>

本视频演示了如何连接摄像头并开始使用适用于 WebRTC 的 Amazon Kinesis Video Streams。




# 带有 WebRTC 开发工具包的 Amazon Kinesis Video Streams 适用于网络应用程序 JavaScript
<a name="kvswebrtc-sdk-js"></a>

你可以在网络应用程序中找到带有 WebRTC SDK JavaScript 的 Kinesis Video Streams 及其相应的示例。[GitHub](https://github.com/awslabs/amazon-kinesis-video-streams-webrtc-sdk-js)

**Topics**
+ [安装 SDK](#install-sdk-js)
+ [WebRTC 软件开发工具 JavaScript 包文档](#docs-sdk-js)
+ [使用示例应用程序](#build-sdk-js)
+ [编辑示例应用程序](#run-sdk-js)

## 安装 SDK
<a name="install-sdk-js"></a>

是否以及如何安装带有 WebRTC SDK 的 Kinesis Video Streams 取决于代码是在模块 JavaScript 中执行还是浏览器脚本执行`Node.js`。

------
#### [ NodeJS module ]

在 Node.js 中安装带有 WebRTC SDK JavaScript 的 Kinesis Video Streams 的首选方法是[使用 Node.js 包管理器 npm](https://www.npmjs.com/)。

该软件包托管在 [https://www.npmjs.com/package/amazon-kinesis-video-streams-w](https://www.npmjs.com/package/amazon-kinesis-video-streams-webrtc?activeTab=readme) ebrtc。

要在`Node.js`项目中安装此 SDK，请使用终端导航到与项目相同的目录`package.json`：

键入以下内容：

```
npm install amazon-kinesis-video-streams-webrtc
```

你可以像典型的 Node.js 模块一样导入 SDK 类：

```
// JavaScript
const SignalingClient = require('amazon-kinesis-video-streams-webrtc').SignalingClient;
// TypeScript
import { SignalingClient } from 'amazon-kinesis-video-streams-webrtc';
```

------
#### [ Browser ]

您无需安装开发工具包以在浏览器脚本中使用它。您可以在 HTML 页面中 AWS 使用脚本直接加载托管 SDK 包。

要在浏览器中使用 SDK，请在您的 HTML 页面中添加以下脚本元素：

```
<script src="https://unpkg.com/amazon-kinesis-video-streams-webrtc/dist/kvs-webrtc.min.js"></script>
```

页面中加载开发工具包之后，可从全局变量 `KVSWebRTC`（或 `window.KVSWebRTC`）使用开发工具包。

例如 `window.KVSWebRTC.SignalingClient`。

------

## WebRTC 软件开发工具 JavaScript 包文档
<a name="docs-sdk-js"></a>

SDK 方法的文档位于 GitHub 自述文件的 “[文档](https://github.com/awslabs/amazon-kinesis-video-streams-webrtc-sdk-js?tab=readme-ov-file#documentation)” 下。

在 “[用法](https://github.com/awslabs/amazon-kinesis-video-streams-webrtc-sdk-js?tab=readme-ov-file#usage)” 部分中，提供了有关将此 SDK 与用于构建基于 Web 的 JavaScript 查看器应用程序的 AWS SDK 集成的更多信息。

有关完整应用程序（包括主角色和查看者角色）的示例，请参阅`examples`目录。

## 使用示例应用程序
<a name="build-sdk-js"></a>

带有 WebRTC 的 Kinesis Video Streams 还托管了一个示例应用程序，您可以使用该应用程序创建新的信令信道或连接到现有频道并将其用作主频道或查看器。

带有 WebRTC 的 Kinesis Video Streams 示例应用程序位于。[GitHub](https://awslabs.github.io/amazon-kinesis-video-streams-webrtc-sdk-js/examples/index.html)

示例应用程序的代码位于`examples`目录中。

**Topics**
+ [peer-to-peer从示例应用程序流式传输到 AWS 管理控制台](#sdk-js-stream-console)
+ [peer-to-peer从示例应用程序流式传输到示例应用程序](#sdk-js-stream-test)
+ [peer-to-peer使用 WebRTC Ingestion 从示例页面直播到示例页面](#sdk-js-stream-ingestion)

### peer-to-peer从示例应用程序流式传输到 AWS 管理控制台
<a name="sdk-js-stream-console"></a>



1. 打开 [Kinesis Video Streams with WebRTC 示例应用程序](https://awslabs.github.io/amazon-kinesis-video-streams-webrtc-sdk-js/examples/index.html)并完成以下操作：
   + AWS 区域。 例如，`us-west-2`。
   + 您的 IAM 用户或角色的 AWS 访问密钥和密钥。如果您使用的是长期 AWS 证书，请将会话令牌留空。
   + 要连接的信令通道的名称。

     如果要连接到新的信令信道，请选择 C **reate Channel** 以使用框中提供的值创建一个信令信道。
**注意**  
对于当前账户和地区，您的信令频道名称必须是唯一的。您可以使用字母、数字、下划线 (\$1) 和连字符 (-)，但不能使用空格。
   + 是发送音频、视频还是两者。
   + WebRTC 摄取和存储。展开节点并选择以下选项之一：
     + 选择 “**自动确定摄取模式**”。
     + **确保未选择 “**自动确定摄取模式”**，并将手动覆盖设置为 “关闭”。**
**注意**  
**自动确定摄取模式**让应用程序调用 [DescribeMediaStorageConfiguration](https://docs.aws.amazon.com//kinesisvideostreams/latest/dg/API_DescribeMediaStorageConfiguration.html)API 来确定要在哪个模式下运行（或 Peer-to-peer WebRTC 摄取）。这个额外的 API 调用会增加少量启动时间。  
如果您提前知道此信令通道在哪种模式下运行，请使用手动替代来跳过此 API 调用。
   + 移民局候选人一代。保留`STUN`/`TURN`选中状态并保持`Trickle ICE`启用状态。

1. 选择 **Start Master** 以连接到信令信道。

   如果需要，允许访问您的摄像头 and/or 麦克风。

1. 在中打开 [Kinesis Video Stream](https://console.aws.amazon.com//kinesisvideo/home/) s 控制台。 AWS 管理控制台

   确保选择了正确的区域。

1. 在左侧导航栏中，选择**[信令频道](https://console.aws.amazon.com//kinesisvideo/home#/signalingChannels/)**。

   在上面选择信令通道的名称。如果需要，请使用搜索栏。

1. 展开 “**媒体播放查看器**” 部分。

1. 选择视频**播放**器上的播放按钮。这作为一个人加入了WebRTC会话。`viewer`

   在演示页面上发送的媒体应显示在 AWS 管理控制台。

### peer-to-peer从示例应用程序流式传输到示例应用程序
<a name="sdk-js-stream-test"></a>

1. 打开 [Kinesis Video Streams with WebRTC 示例](https://awslabs.github.io/amazon-kinesis-video-streams-webrtc-sdk-js/examples/index.html)应用程序并填写以下信息：
   + AWS 区域。 例如，`us-west-2`。
   + 您的 IAM 用户或角色的 AWS 访问密钥和密钥。如果您使用的是长期 AWS 证书，请将会话令牌留空。
   + 要连接的信令通道的名称。

     如果要连接到新的信令信道，请选择 C **reate Channel** 以使用框中提供的值创建一个信令信道。
**注意**  
对于当前账户和地区，您的信令频道名称必须是唯一的。您可以使用字母、数字、下划线 (\$1) 和连字符 (-)，但不能使用空格。
   + 是发送音频、视频还是两者。
   + WebRTC 摄取和存储。展开节点并选择以下选项之一：
     + 选择 “**自动确定摄取模式**”。
     + **确保未选择 “**自动确定摄取模式”**，并将手动覆盖设置为 “关闭”。**
**注意**  
**自动确定摄取模式**让应用程序调用 [DescribeMediaStorageConfiguration](https://docs.aws.amazon.com//kinesisvideostreams/latest/dg/API_DescribeMediaStorageConfiguration.html)API 来确定要在哪个模式下运行（或 Peer-to-peer WebRTC 摄取）。这个额外的 API 调用会增加少量启动时间。  
如果您提前知道此信令通道在哪种模式下运行，请使用手动替代来跳过此 API 调用。
   + 移民局候选人一代。保留`STUN`/`TURN`选中状态并保持`Trickle ICE`启用状态。

1. 选择 **Start Master** 以`master`角色身份连接到信令通道。

   如果需要，允许访问您的摄像头 and/or 麦克风。

1. 打开另一个浏览器选项卡，然后打开 [Kinesis Video Streams with WebRTC 示例应用程序](https://awslabs.github.io/amazon-kinesis-video-streams-webrtc-sdk-js/examples/index.html)。上一次运行的所有信息都应加载完毕。

1. 向下滚动并选择 “**启动查看器**”，以`viewer`角色身份连接到信令频道。

   您应该会看到`master`和之间正在交换媒体`viewer`。

### peer-to-peer使用 WebRTC Ingestion 从示例页面直播到示例页面
<a name="sdk-js-stream-ingestion"></a>

1. [从浏览器提取媒体](ingest-media.md#ingest-browser)按照操作连接主参与者并确保其已连接到存储会话。

1. 按照操作[将观众添加到摄取会话中](ingest-media.md#ingest-add-viewers)添加观看者参与者。

   查看者参与者将连接存储会话并从中接收媒体。他们可以将可选音频发送回存储会话。

   存储会话负责混合从主参与者和查看者参与者那里收到的媒体，然后将其发送到相应的目的地。

1. 你可以通过 [Kinesis Video Streams](https://docs.aws.amazon.com//kinesisvideostreams/latest/dg/how-playback.html) 播放来查看和消费摄取的媒体。

## 编辑示例应用程序
<a name="run-sdk-js"></a>

要出于开发目的编辑 SDK 和示例应用程序，请按照以下说明进行操作。

**先决条件**

NodeJS 版本 16\$1

**注意**  
我们建议从 [https://nodejs 下载最新的长期支持 (LTS) 版本。 org/en/download](https://nodejs.org/en/download)。

**编辑示例应用程序**

1. 下载带有 WebRTC SDK 的 Kinesis Video Streams。 JavaScript

   在终端中键入以下内容：

   ```
   git clone https://github.com/awslabs/amazon-kinesis-video-streams-webrtc-sdk-js.git
   ```

1. 导航到包含 package.json 文件的目录。该文件位于存储库的根目录中。

   在终端中键入以下内容：

   ```
   cd amazon-kinesis-video-streams-webrtc-sdk-js
   ```

1. 安装依赖项。

   在终端中键入以下 [npm CLI](https://docs.npmjs.com/cli/v10/commands) 命令：

   ```
   npm install
   ```

1. 启动 Web 服务器以开始提供网页。

   在终端中键入以下 [npm CLI](https://docs.npmjs.com/cli/v10/commands) 命令：

   ```
   npm run develop
   ```

1. 在浏览器中，访问 [http://localhost:3001/](http://localhost:3001/)。

   您可以通过编辑`examples`目录中的文件来编辑网页。

# 适用于安卓的亚马逊 Kinesis Video Streams WebRTC SDK
<a name="kvswebrtc-sdk-android"></a>

以下 step-by-step说明描述了如何使用安卓版 WebRTC SDK 下载、构建和运行 Kinesis Video Streams 及其相应示例。

**注意**  
亚马逊 Kinesis Video Streams 不 IPv6 支持安卓设备上的地址。查看有关在您的 [Android 设备 IPv6 上禁](https://www.cactusvpn.com/tutorials/how-to-disable-ipv6-on-android/)用的更多信息。

## 下载 SDK
<a name="download-sdk-android"></a>

要在 Android 中下载 WebRTC 开发工具包，请运行以下命令：

```
$ git clone https://github.com/awslabs/amazon-kinesis-video-streams-webrtc-sdk-android.git
```

## 构建 SDK
<a name="build-sdk-android"></a>

要在 Android 中构建 WebRTC 开发工具包，请完成以下步骤：

1. 选择**以项目形式打开**打开 `amazon-kinesis-video-streams-webrtc-sdk-android/build.gradle`，将安卓 WebRTC SDK 导入 Android Studio 集成式开发环境（IDE）。

1. 如果您第一次打开项目，它会自动同步。如果不是，则发起同步。当您看到编译错误时，请选择**安装缺失 SDKs 的 SDK 软件包**，然后选择 “**接受**” 并完成安装，从而选择安装所需的任何内容。

1. 配置 Amazon Cognito（用户池和身份池）设置。有关详细步骤，请参阅[为软件开发工具包配置 Amazon Cognito](#build-sdk-android-cognito)。这会生成构建 Android WebRTC 开发工具包所需的身份验证和授权设置。

1. 在 Android IDE 中，打开 `awsconfiguration.json`（从 `src/main/res/raw/`）。此文件如下所示：

   ```
   {
     "Version": "1.0",
     "CredentialsProvider": {
       "CognitoIdentity": {
         "Default": {
           "PoolId": "REPLACE_ME",
           "Region": "REPLACE_ME"
         }
       }
     },
     "IdentityManager": {
       "Default": {}
     },
     "CognitoUserPool": {
       "Default": {
         "AppClientSecret": "REPLACE_ME",
         "AppClientId": "REPLACE_ME",
         "PoolId": "REPLACE_ME",
         "Region": "REPLACE_ME"
       }
     }
   }
   ```

   使用通过运行[为软件开发工具包配置 Amazon Cognito](#build-sdk-android-cognito)中的步骤生成的值更新 `awsconfiguration.json`。

1. 确保您的 Android 设备已连接到运行 Android IDE 的计算机。在 Android IDE 中，选择连接的设备，然后构建并运行 WebRTC Android 开发工具包。

   此步骤将在您的 Android 设备上安装一个名为 `AWSKinesisVideoWebRTCDemoApp` 的应用程序。使用此应用程序，您可以验证移动、网络和物联网设备客户端之间的 Web audio/video RTC 直播。

## 运行示例应用程序
<a name="run-sdk-android"></a>

****

完成以下步骤：

1. 在您的 Android 设备上，打开**AWSKinesisVideoWebRTCDemo应用程序**并使用新的（先创建）或现有的 Amazon Cognito 账户登录。

1. 在**AWSKinesisVideoWebRTCDemo应用程序**中，导航到**信道配置**页面，然后创建新的信令信道或选择现有信令信道。
**注意**  
目前，使用此 SDK 中的示例应用程序，您只能在 **AWSKinesisVideoWebRTCDemoApp** 中运行一个信令通道。

1. 可选：如果您想以查看器身份连接到此通道，请选择唯一的 **Client Id (客户端 ID)**。仅当多个查看器连接到一个通道时，才需要客户端 ID。这有助于通道的主设备识别各自的查看器。

1. 选择 AWS 区域 以及是否要发送音频或视频数据，或者两者兼而有之。

1. 要验证 peer-to-peer直播，请执行以下任一操作：
**注意**  
请务必在本演示中使用的所有客户端上指定相同的信令频道名称、 AWS 区域、观众 ID 和 AWS 账户 ID。
   + Peer-to-peer 在两台 Android 设备之间进行直播：主设备和查看器
     + 使用上述步骤，在两个 Android 设备上下载、构建和运行 Android WebRTC 开发工具包。
     + 在一台 Android 设备上以主模式打开**AWSKinesisVideoWebRTCDemo应用程序**（选择 S **TART MASTER**），开始新的会话（信令信道）。
**注意**  
目前，任何给定信令通道只能有一个主设备。
     + 在查看器模式下在第二台 Android 设备上打开**AWSKinesisVideoWebRTCDemo应用程序**，以连接到在上述步骤中启动的信令频道（会话）（选择 S **TART VIEWER**）。

       验证查看者是否可以看到主人的 audio/video 数据。
   + Peer-to-peer 在嵌入式 SDK 主站和安卓设备查看器之间进行流式传输
     + 在摄像头设备上，下载、构建 [亚马逊 Kinesis Video Streams 带有 WebRTC 开发工具包的 C 语言版本，适用于嵌入式设备](kvswebrtc-sdk-c.md) 并以主设备模式运行它。
     + 使用上述步骤，在 Android 设备上下载、构建和运行 Android WebRTC 开发工具包。在查看器模式下在此 Android 设备上打开**AWSKinesisVideoWebRTCDemo应用程序**，确认查看者可以看到嵌入式 SDK 主 audio/video 服务器的数据。
   + Peer-to-peer 在作为主设备的 Android 设备和作为查看器的网络浏览器之间进行流式传输
     + 使用上述步骤，在 Android 设备上下载、构建和运行 Android WebRTC 开发工具包。在主模式下打开此 Android 设备上的**AWSKinesisVideoWebRTCDemo应用程序**（选择 S **TART MASTER**），开始新的会话（信令信道）。
     + 下载、构建 [带有 WebRTC 开发工具包的 Amazon Kinesis Video Streams 适用于网络应用程序 JavaScript](kvswebrtc-sdk-js.md) 并以查看器身份运行它，并验证查看器是否可以看到 Android 主设备的音频/视频。

## 为软件开发工具包配置 Amazon Cognito
<a name="build-sdk-android-cognito"></a>

### 先决条件
<a name="androidsdk-prerequisites"></a>
+ 建议使用 [Android Studio](https://developer.android.com/studio/index.html) 检查、编辑和运行应用程序代码。我们建议使用最新的稳定版本。
+ 在示例代码中，您需要提供亚马逊 Cognito 凭证。

按照以下步骤设置 Amazon Cognito 用户池和身份池。

### 设置用户池
<a name="setup-user-pool"></a>

**设置用户池**

1. 登录 [Amazon Cognito 控制台](https://console.aws.amazon.com/cognito/home)并验证区域是否正确。

1. 在左侧导航栏中，选择 “**用户池**”。

1. 在 “**用户池**” 部分，选择 “**创建用户池**”。

1. 完成以下各节：

   1. **第 1 步：配置登录体验**-在 **Cognito 用户池登录**选项部分，选择相应的选项。

      选择**下一步**。

   1. **步骤 2：配置安全要求**-选择相应的选项。

      选择**下一步**。

   1. **第 3 步：配置注册体验**-选择相应的选项。

      选择**下一步**。

   1. **步骤 4：配置消息传送**-选择相应的选项。

      在 **IAM 角色选择**字段中，选择现有角色或创建新角色。

      选择**下一步**。

   1. **第 5 步：集成您的应用程序**-选择相应的选项。

      在 “**初始应用程序客户端**” 字段中，选择 “**机密客户端**”。

      选择**下一步**。

   1. **步骤 6：查看并创建**-查看您在前面部分中的选择，然后选择**创建用户池**。

1. 在 “**用户池**” 页面上，选择您刚刚创建的池。

   复制**用户池 ID** 并记下来以备后用。在`awsconfiguration.json`文件中，这是`CognitoUserPool.Default.PoolId`。

1. 选择 “**应用程序集成**” 选项卡，然后转到页面底部。

1. 在**应用程序客户端列表**部分，选择您刚刚创建的**应用程序客户端名称**。

   复制**客户端 ID** 并记下来以备后用。在`awsconfiguration.json`文件中，这是`CognitoUserPool.Default.AppClientId`。

1. 出示**客户机密**并记下来以备后用。在`awsconfiguration.json`文件中，这是`CognitoUserPool.Default.AppClientSecret`。

### 设置身份池
<a name="setup-identity-pool"></a>

**设置身份池**

1. 登录 [Amazon Cognito 控制台](https://console.aws.amazon.com/cognito/home)并验证区域是否正确。

1. 在左侧导航栏中，选择 “**身份池**”。

1. 选择**创建身份池**。

1. 配置身份池。

   1. **步骤 1：配置身份池信任**-完成以下部分：
      + **用户访问权限**-选择**经过身份验证的访问权限**
      + **经过身份验证的身份源**-选择 **Amazon Cognito** 用户池

      选择**下一步**。

   1. **步骤 2：配置权限**-在 “**经过身份验证的角色**” 部分，填写以下字段：
      + **IAM 角色**-选择**创建新的 IAM 角色**
      + **IAM 角色名称**-输入名称并记下来供后续步骤使用。

      选择**下一步**。

   1. **步骤 3：Connect 身份提供商**-在 “**用户池详细信息**” 部分中，填写以下字段：
      + **用户池 ID**-选择您之前创建的用户池。
      + **应用程序客户端 ID**-选择您之前创建的应用程序客户端 ID。

      选择**下一步**。

   1. **步骤 4：配置属性**-在 “**身份池名称” 字段中键入名称**。

      选择**下一步**。

   1. **第 5 步：查看并创建**-查看您在每个部分中的选择，然后选择**创建身份池**。

1. 在**身份池**页面上，选择您的新身份池。

   复制**身份池 ID** 并记下来以备后用。在`awsconfiguration.json`文件中，这是`CredentialsProvider.CognitoIdentity.Default.PoolId`。

1. 更新 IAM 角色的权限。

   1. 登录 AWS 管理控制台 并打开 IAM 控制台，网址为[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

   1. 在左侧的导航栏中，选择 “**角色**”。

   1. 找到并选择您在上面创建的角色。
**注意**  
如果需要，请使用搜索栏。

   1. 选择附加的权限策略。

      选择**编辑**。

   1. 选择 **JSON** 选项卡，然后将策略替换为以下内容：

      ```
      {
          "Version": "2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "cognito-identity:*",
                      "kinesisvideo:*"
                  ],
                  "Resource": [
                      "*"
                  ]
              }
          ]
      }
      ```

      选择**下一步**。

   1. 如果尚未选中 “将**此新版本设为默认版本”** 旁边的复选框。

      选择**保存更改**。

# 适用于 iOS 的亚马逊 Kinesis Video Streams WebRTC SDK
<a name="kvswebrtc-sdk-ios"></a>

以下 step-by-step说明描述了如何在 iOS 中下载、构建和运行 Kinesis Video Streams WebRTC SDK 及其相应示例。

## 下载 SDK
<a name="download-sdk-js"></a>

要在 iOS 中下载 WebRTC 开发工具包，请运行以下命令：

```
$ git clone https://github.com/awslabs/amazon-kinesis-video-streams-webrtc-sdk-ios.git
```

## 构建 SDK
<a name="build-sdk-ios"></a>

完成以下步骤：

1. 通过`KinesisVideoWebRTCDemoApp.xcworkspace`打开（路径 amazon-kinesis-video-streams：webrtc-sdk-ios-AWSKinesis VideoWeb RTCDemo /Swift/ App.xcWorkspace），将 XCode iOS WebRTC SDK 导入 iOS 电脑上的集成开发环境 (IDE)。

1. 如果您第一次打开该项目，它会自动构建。如果没有，则开始构建。

   您可能会看到以下错误：

   ```
   error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.
   ```

   如果您看到此错误，请执行以下操作：

   1. 将当前工作目录更改为 `amazon-kinesis-video-streams-webrtc-sdk-ios/Swift` 并在命令行中运行以下命令：

      ```
      pod cache clean --all
      pod install
      ```

   1. 将当前工作目录更改为 `amazon-kinesis-video-streams-webrtc-sdk-ios` 并在命令行中运行以下命令：

      ```
      $ git checkout Swift/Pods/AWSCore/AWSCore/Service/AWSService.m
      ```

   1. `Build`。

1. 配置 Amazon Cognito（用户池和身份池）设置。有关详细步骤，请参阅[为软件开发工具包配置 Amazon Cognito](#build-sdk-ios-cognito)。这会生成构建 iOS WebRTC 开发工具包所需的身份验证和授权设置。

1. 在 IDE 中，打开 `awsconfiguration.json` 文件（来自 `/Swift/KVSiOSApp`）。此文件如下所示：

   ```
   {
       "Version": "1.0",
       "CredentialsProvider": {
           "CognitoIdentity": {
               "Default": {
                   "PoolId": "REPLACEME",
                   "Region": "REPLACEME"
               }
           }
       },
       "IdentityManager": {
           "Default": {}
       },
       "CognitoUserPool": {
           "Default": {
               "AppClientSecret": "REPLACEME",
               "AppClientId": "REPLACEME",
               "PoolId": "REPLACEME",
               "Region": "REPLACEME"
           }
       }
   }
   ```

   使用通过运行[为软件开发工具包配置 Amazon Cognito](kvswebrtc-sdk-android.md#build-sdk-android-cognito)中的步骤生成的值更新 `awsconfiguration.json`。

1. 在 IDE 中，打开 `Constants.swift` 文件（来自 `/Swift/KVSiOSApp`）。此文件如下所示：

   ```
   import Foundation
   import AWSCognitoIdentityProvider
   
   let CognitoIdentityUserPoolRegion = AWSRegionType.USWest2
   let CognitoIdentityUserPoolId = "REPLACEME"
   let CognitoIdentityUserPoolAppClientId = "REPLACEME"
   let CognitoIdentityUserPoolAppClientSecret = "REPLACEME"
   
   let AWSCognitoUserPoolsSignInProviderKey = "UserPool"
   let CognitoIdentityPoolID = "REPLACEME"
   
   let AWSKinesisVideoEndpoint = "https://kinesisvideo.us-west-2.amazonaws.com"
   let AWSKinesisVideoKey = "kinesisvideo"
   
   let VideoProtocols =  ["WSS", "HTTPS"]
   
   let ConnectAsMaster = "connect-as-master"
   let ConnectAsViewer = "connect-as-viewer"
   
   let MasterRole = "MASTER"
   let ViewerRole = "VIEWER"
   
   let ClientID = "ConsumerViewer"
   ```

   使用通过运行[为软件开发工具包配置 Amazon Cognito](kvswebrtc-sdk-android.md#build-sdk-android-cognito)中的步骤生成的值更新 `Constants.swift`。

1. 确保你的 iOS 设备已连接到你正在运行的 Mac 电脑 XCode。在中 XCode，选择连接的设备，然后构建并运行 WebRTC iOS 开发工具包。

   此步骤将在 iOS 设备上安装名为 `AWSKinesisVideoWebRTCDemoApp` 的应用程序。使用此应用程序，您可以验证移动、网络和物联网设备客户端之间的 Web audio/video RTC 直播。

## 运行示例应用程序
<a name="run-sdk-ios"></a>

****

完成以下步骤：

1. 在你的 iOS 设备上，打开**AWSKinesisVideoWebRTCDemo应用程序**，然后使用新的（先创建）或现有的 Amazon Cognito 账户登录。

1. 在**AWSKinesisVideoWebRTCDemo应用程序**中，导航到**信道配置**页面，然后创建新的信令信道或选择现有信令信道。
**注意**  
目前，使用此 SDK 中的示例应用程序，您只能在 **AWSKinesisVideoWebRTCDemoApp** 中运行一个信令通道。

1. （可选）如果您想以查看器身份连接到此通道，请选择唯一的 **Client Id (客户端 ID)**。仅当多个查看器连接到一个通道时，才需要客户端 ID。这有助于通道的主设备识别各自的查看器。

1. 选择 AWS 区域 以及是否要发送音频或视频数据，或者两者兼而有之。

1. 要验证 peer-to-peer直播，请执行以下任一操作：
**注意**  
请务必在本演示中使用的所有客户端上指定相同的信令频道名称、 AWS 区域、观众 ID 和 AWS 账户 ID。
   + Peer-to-peer 在两台 iOS 设备之间进行流式传输：主设备和查看器
     + 使用上述步骤，在两个 iOS 设备上下载、构建和运行 iOS WebRTC 开发工具包。
     + 在一台 iOS 设备上以主模式打开**AWSKinesisVideoWebRTCDemo应用程序**（选择**启动主**模式），开始新的会话（信令信道）。
**注意**  
目前，任何给定信令通道只能有一个主设备。
     + 在查看器模式下在第二台 iOS 设备上打开**AWSKinesisVideoWebRTCDemo应用程序**，连接上面步骤中启动的信令频道（会话）（选择**启动查看器**）。

       验证查看者是否可以看到主人的 audio/video 数据。
   + Peer-to-peer 在嵌入式 SDK 主设备和 iOS 设备查看器之间进行流式传输
     + 在摄像头设备上，下载、构建 [亚马逊 Kinesis Video Streams 带有 WebRTC 开发工具包的 C 语言版本，适用于嵌入式设备](kvswebrtc-sdk-c.md) 并以主设备模式运行它。
     + 使用上述步骤，在一个 iOS 设备上下载、构建和运行 iOS WebRTC 开发工具包。在查看器模式下打开此 iOS 设备上的**AWSKinesisVideoWebRTCDemo应用程序**，并确认 iOS 查看器可以看到嵌入式 SDK 主 audio/video 服务器的数据。
   + Peer-to-peer 在作为主设备的 iOS 设备和作为查看器的网络浏览器之间进行流式传输
     + 使用上述步骤，在一个 iOS 设备上下载、构建和运行 iOS WebRTC 开发工具包。在主模式下打开此 iOS 设备上的**AWSKinesisVideoWebRTCDemo应用程序**（选择**启动主**模式），开始新的会话（信令信道）。
     + 下载、构建并以查看者[带有 WebRTC 开发工具包的 Amazon Kinesis Video Streams 适用于网络应用程序 JavaScript](kvswebrtc-sdk-js.md)身份运行，并验证查看者是否可以看到 Android 主服务器的音频/视频。 JavaScript 

## 为软件开发工具包配置 Amazon Cognito
<a name="build-sdk-ios-cognito"></a>

### 先决条件
<a name="iossdk-prerequisites"></a>
+ 我们建议 XCode 检查、编辑和运行应用程序代码。我们推荐最新版本。
+ 在示例代码中，您需要提供亚马逊 Cognito 凭证。

按照以下步骤设置 Amazon Cognito 用户池和身份池。

### 设置用户池
<a name="setup-user-pool"></a>

**设置用户池**

1. 登录 [Amazon Cognito 控制台](https://console.aws.amazon.com/cognito/home)并验证区域是否正确。

1. 在左侧导航栏中，选择 “**用户池**”。

1. 在 “**用户池**” 部分，选择 “**创建用户池**”。

1. 完成以下各节：

   1. **第 1 步：配置登录体验**-在 **Cognito 用户池登录**选项部分，选择相应的选项。

      选择**下一步**。

   1. **步骤 2：配置安全要求**-选择相应的选项。

      选择**下一步**。

   1. **第 3 步：配置注册体验**-选择相应的选项。

      选择**下一步**。

   1. **步骤 4：配置消息传送**-选择相应的选项。

      在 **IAM 角色选择**字段中，选择现有角色或创建新角色。

      选择**下一步**。

   1. **第 5 步：集成您的应用程序**-选择相应的选项。

      在 “**初始应用程序客户端**” 字段中，选择 “**机密客户端**”。

      选择**下一步**。

   1. **步骤 6：查看并创建**-查看您在前面部分中的选择，然后选择**创建用户池**。

1. 在 “**用户池**” 页面上，选择您刚刚创建的池。

   复制**用户池 ID** 并记下来以备后用。在`awsconfiguration.json`文件中，这是`CognitoUserPool.Default.PoolId`。

1. 选择 “**应用程序集成**” 选项卡，然后转到页面底部。

1. 在**应用程序客户端列表**部分，选择您刚刚创建的**应用程序客户端名称**。

   复制**客户端 ID** 并记下来以备后用。在`awsconfiguration.json`文件中，这是`CognitoUserPool.Default.AppClientId`。

1. 出示**客户机密**并记下来以备后用。在`awsconfiguration.json`文件中，这是`CognitoUserPool.Default.AppClientSecret`。

### 设置身份池
<a name="setup-identity-pool"></a>

**设置身份池**

1. 登录 [Amazon Cognito 控制台](https://console.aws.amazon.com/cognito/home)并验证区域是否正确。

1. 在左侧导航栏中，选择 “**身份池**”。

1. 选择**创建身份池**。

1. 配置身份池。

   1. **步骤 1：配置身份池信任**-完成以下部分：
      + **用户访问权限**-选择**经过身份验证的访问权限**
      + **经过身份验证的身份源**-选择 **Amazon Cognito** 用户池

      选择**下一步**。

   1. **步骤 2：配置权限**-在 “**经过身份验证的角色**” 部分，填写以下字段：
      + **IAM 角色**-选择**创建新的 IAM 角色**
      + **IAM 角色名称**-输入名称并记下来供后续步骤使用。

      选择**下一步**。

   1. **步骤 3：Connect 身份提供商**-在 “**用户池详细信息**” 部分中，填写以下字段：
      + **用户池 ID**-选择您之前创建的用户池。
      + **应用程序客户端 ID**-选择您之前创建的应用程序客户端 ID。

      选择**下一步**。

   1. **步骤 4：配置属性**-在 “**身份池名称” 字段中键入名称**。

      选择**下一步**。

   1. **第 5 步：查看并创建**-查看您在每个部分中的选择，然后选择**创建身份池**。

1. 在**身份池**页面上，选择您的新身份池。

   复制**身份池 ID** 并记下来以备后用。在`awsconfiguration.json`文件中，这是`CredentialsProvider.CognitoIdentity.Default.PoolId`。

1. 更新 IAM 角色的权限。

   1. 登录 AWS 管理控制台 并打开 IAM 控制台，网址为[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

   1. 在左侧的导航栏中，选择 “**角色**”。

   1. 找到并选择您在上面创建的角色。
**注意**  
如果需要，请使用搜索栏。

   1. 选择附加的权限策略。

      选择**编辑**。

   1. 选择 **JSON** 选项卡，然后将策略替换为以下内容：

      ```
      {
          "Version": "2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "cognito-identity:*",
                      "kinesisvideo:*"
                  ],
                  "Resource": [
                      "*"
                  ]
              }
          ]
      }
      ```

      选择**下一步**。

   1. 如果尚未选中 “将**此新版本设为默认版本”** 旁边的复选框。

      选择**保存更改**。

# C SDK 的客户端指标
<a name="kvswebrtc-reference"></a>

使用 Amazon Kinesis Video Streams with WebRTC 构建的应用程序由各种移动部件组成，包括网络、信号、候选交换、对等连接和数据交换。C 语言版 Kinesis Video Streams with WebRTC 支持各种客户端指标，使您能够监控和跟踪这些组件在应用程序中的性能和使用情况。支持的指标分为两大类：专为 Kinesis Video Streams 实现信令和网络而定义的自定义指标，以及源自 [W3C](https://www.w3.org/TR/webrtc-stats/) 标准的媒体和数据相关协议特定指标。请注意，C 语言版 Kinesis Video Streams with WebRTC 目前仅支持 W3C 标准指标的子集。

**Topics**
+ [信令指标](#kvswebrtc-reference-signaling)
+ [C SDK 支持 W3C 标准指标](#kvswebrtc-reference-w3cstandard)

## 信令指标
<a name="kvswebrtc-reference-signaling"></a>

信令指标可用于了解信令客户端在应用程序运行时的行为。您可以使用 `STATUS signalingClientGetMetrics (SIGNALING_CLIENT_HANDLE, PSignalingClientMetrics)` API 获取这些信令指标。下面是一个示例使用模式：

```
SIGNALING_CLIENT_HANDLE signalingClientHandle;
SignalingClientMetrics signalingClientMetrics;
STATUS retStatus = signalingClientGetMetrics(signalingClientHandle, &signalingClientMetrics);
printf("Signaling client connection duration: %" PRIu64 " ms",
       (signalingClientMetrics.signalingClientStats.connectionDuration / HUNDREDS_OF_NANOS_IN_A_MILLISECOND));
```

`signalingClientStats` 的定义可以在 [Stats.h](https://github.com/awslabs/amazon-kinesis-video-streams-webrtc-sdk-c/blob/master/src/include/com/amazonaws/kinesis/video/webrtcclient/Stats.h) 中找到。

目前支持以下信令指标：


****  

| 指标 | 说明 | 
| --- | --- | 
| cpApiCall延迟 | 计算控制面板 API 调用的延迟。使用指数移动平均线（EMA）进行计算。相关的电话包括：describeChannel、CreateChannel 和 DeleteChannel。 getChannelEndpoint  | 
| dpApiCall延迟 | 计算数据面板 API 调用的延迟。使用指数移动平均线（EMA）进行计算。关联的呼叫包括: getIceConfig. | 
| signalingClientUptime | 这表示客户端对象存在的时间。每次调用此指标时，都会发出最新的正常运行时间值。 | 
| connectionDuration | 如果连接已建立，则会发出连接处于活动状态的持续时间。否则，会发出值为 0。这与发出客户端正常运行时间信号不同，因为连接来来去去 signalingClientUptime ，但表示客户端对象本身。 | 
| numberOfMessages已发送 | 当对等设备发送提议、应答或 ICE 候选项时，此值会更新。 | 
| numberOfMessages已收到 | 与 “ numberOfMessages已发送” 不同，此指标会针对任何类型的信令消息进行更新。信令消息的类型可在 SIGNALING\$1MESSAGE\$1TYPE 中找到。 | 
| iceRefreshCount | 当调用时，该 getIceConfig 值会递增。它的调用速率基于收到的 ICE 配置中的 TTL。每次收到一组新的 ICE 配置时，都会将计时器设置为下次刷新，前提是配置中凭证的有效期减去一段宽限期。 | 
| numberOfErrors | 该计数器用于跟踪信令客户端中生成的错误数量。跟踪获取 ICE 配置、获取信令状态、跟踪信令指标、发送信令消息以及将信令客户端连接到 Web 套接字以获取消息时生成的错误。 send/receive  | 
| numberOfRuntime错误 | 该指标包括信令客户端核心运行时发生的错误。此处跟踪重新连接失败、消息接收失败和 ICE 配置刷新错误等情况。 | 
| numberOfReconnects | 该指标在每次重新连接时都会递增。该指标有助于了解设置中网络连接的稳定性。 | 

## C SDK 支持 W3C 标准指标
<a name="kvswebrtc-reference-w3cstandard"></a>

使用 WebRTC C SDK 构建的应用程序目前支持 [W3C](https://www.w3.org/TR/webrtc-stats/) 标准指标的子集。这些指标为以下类别：
+ 联网：
  + [ICE 候选项](https://www.w3.org/TR/webrtc-stats/#icecandidate-dict*)：这些指标提供有关选定的本地和远程候选项的信息，以便在对等设备之间进行数据交换。这包括候选项的服务器来源、IP 地址、为通信选择的候选类型和候选优先级。这些指标可用作快照报告。
  + [ICE 服务器](https://www.w3.org/TR/webrtc-stats/#ice-server-dict*)：这些指标用于收集有关支持的不同 ICE 服务器的操作信息。这有助于尝试了解主要用于通信和连接检查的服务器。在某些情况下，如果候选项收集失败，则将有助于检查这些指标。
  + I@@ [ce Candidation Pair](https://www.w3.org/TR/webrtc-stats/#candidatepair-dict*)：这些指标用于了解对等体之间交换的数量以及与时间相关的测量值。 bytes/packets 
+ 媒体和数据：
  + [远程入站 RTP](https://www.w3.org/TR/webrtc-stats/#remoteinboundrtpstats-dict*)：这些指标代表发送方发送的数据流的端点视角。
  + [出站 RTP](https://www.w3.org/TR/webrtc-stats/#dom-rtcoutboundrtpstreamstats)：这些指标提供有关传出 RTP 流的信息。在分析不连贯的流或流停止时，它们也非常有用。
  + [入站 RTP](https://www.w3.org/TR/webrtc-stats/#dom-rtcinboundrtpstreamstats)：这些指标提供有关传入媒体的信息。
  + [数据通道指标](https://www.w3.org/TR/webrtc-stats/#dcstats-dict*)：这些指标可以帮助您分析通过数据通道发送和接收的消息和字节数。可以使用通道 ID 提取指标。

您可以使用 `STATUS rtcPeerConnectionGetMetrics (PRtcPeerConnection, PRtcRtpTransceiver, PRtcStats)` API 收集与 ICE、RTP 和数据通道相关的指标。下面是一个用法示例：

```
RtcStats rtcStats;
rtcStats.requestedTypeOfStats = RTC_STATS_TYPE_LOCAL_CANDIDATE;
STATUS retStatus = rtcPeerConnectionGetMetrics (pRtcPeerConnection, NULL, &rtcStats);
printf(“Local Candidate address: %s\n”, rtcStats.rtcStatsObject.localIceCandidateStats.address);
```

以下是另一个示例，展示了获取收发器相关统计数据的使用模式：

```
RtcStats rtcStats;
PRtcRtpTransceiver pVideoRtcRtpTransceiver;
rtcStats.requestedTypeOfStats = RTC_STATS_TYPE_OUTBOUND_RTP;
STATUS retStatus = rtcPeerConnectionGetMetrics (pRtcPeerConnection, pVideoRtcRtpTransceiver, &rtcStats);
printf(“Number of packets discarded on send: %s\n”, rtcStats.rtcStatsObject.outboundRtpStreamStats.packetsDiscardedOnSend);
```

在上面的示例中，如果 rtcPeerConnection GetMetrics () 的第二个参数为 NULL，则返回列表中第一个收发器的数据。

[的定义 rtcStatsObject 可以在 [Stats.h](https://github.com/awslabs/amazon-kinesis-video-streams-webrtc-sdk-c/blob/master/src/include/com/amazonaws/kinesis/video/webrtcclient/Stats.h). 中找到，的定义 RtcStats 可以在 Include.H 中找到。](https://github.com/awslabs/amazon-kinesis-video-streams-webrtc-sdk-c/blob/master/src/include/com/amazonaws/kinesis/video/webrtcclient/Include.h)

可以在 WebRTC C SDK 存储库的[示例](https://github.com/awslabs/amazon-kinesis-video-streams-webrtc-sdk-c/tree/master/samples)目录 APIs 和 K [inesis Video Stream 演示存储库中找到不同指标的示例用法](https://github.com/aws-samples/amazon-kinesis-video-streams-demos/tree/master/canary/webrtc-c/src)。

使用 WebRTC C SDK 构建的应用程序目前支持以下 [W3C](https://www.w3.org/TR/webrtc-stats/) 标准指标。

**Topics**
+ [Networking](#kvswebrtc-reference-ice)
+ [媒体](#kvswebrtc-reference-media)
+ [数据通道](#kvswebrtc-reference-datachannel)

### Networking
<a name="kvswebrtc-reference-ice"></a>

ICE 服务器指标：


****  

| 指标 | 说明 | 
| --- | --- | 
| URL | 正在跟踪的 STUN/TURN 服务器的 URL | 
| 端口： | 客户端使用的端口号 | 
| 协议 | 从 ICE 服务器 URI 中提取的传输协议。如果值为 UDP，ICE 会尝试翻转 UDP，否则 ICE 会尝试翻转。TCP/TLS. If the URI does not contain transport, ICE tries TURN over UDP and TCP/TLS如果是 STUN 服务器，此字段为空。 | 
| 发送的请求总数 | 每个 srflx 候选请求以及从 TURN 候选项发送绑定请求时，该值都会更新。 | 
| 收到的回复总数 | 每次收到 STUN 绑定响应时，该值都会更新。 | 
| 往返总时间 | 每次收到请求的等效响应时，该值都会更新。在以校验和为密钥的哈希映射中跟踪请求数据包。 | 

ICE 候选项统计信息：仅包括有关所选候选项（本地和远程）的信息。


****  

| 指标 | 说明 | 
| --- | --- | 
| address | 表示本地和远程候选的 IP 地址。 | 
| port | 候选端口号 | 
| protocol | 用于获取候选项的协议。有效值为 UDP/TCP。 | 
| candidateType | 所选候选项的类型 - 主机、srflx 或中继。 | 
| priority | 所选本地和远程候选项的优先级。 | 
| url | 所选本地候选项的来源。这表明所选候选项是从 STUN 服务器还是 TURN 服务器接收。 | 
| relayProtocol | 如果使用 TURN 服务器来获取选定的本地候选项，则此字段表示使用了哪种协议来获取它。有效值为 TCP/UDP。 | 

ICE 候选对统计信息：仅包含有关所选候选对的信息。


****  

| 指标 | 说明 | 
| --- | --- | 
| localCandidateId | 配对中所选本地候选项的 ID。 | 
| remoteCandidateId | 配对中所选远程候选项的 ID。 | 
| state | 正在检查的候选对状态。 | 
| nominated | 设置为 TRUE，因为正在提取选定候选对的统计信息。 | 
| packetsSent | 发送的数据包数。这是在 writeFrame 调用中的 . 调用中计算得出的。这些信息也可以从传出的 RTP 统计数据中提取，但是由于 Ice 候选对包含 lastPacketSent 时间戳，因此计算两个时间点之间发送的数据包数量可能会很有用。 | 
| packetsReceived | 每次调用时都会更新此信息。 incomingDataHandler  | 
| bytesSent | 这是在 writeFrame() 调用中的 iceAgentSendPacket() 中计算得出的。这在计算比特率时很有用。当前，这还包括标头和填充，因为 ICE 层忽略了 RTP 数据包格式。 | 
| bytesReceived | 每次调用时都会更新此信息。 incomingDataHandler 当前，这还包括标头和填充，因为 ICE 层忽略了 RTP 数据包格式。 | 
| lastPacketSentTimestamp | 每次发送数据包时都会更新此信息。它可以与 packetsSent 和记录的开始时间结合使用，应用于当前数据包传输速率。 | 
| lastPacketReceivedTimestamp | 在 incomingDataHandler() 中接收数据时更新此信息。可以与 packetsReceived 结合使用来推断当前的数据包接收速率。开始时间必须记录在应用程序层的 transceiverOnFrame() 回调中。 | 
| firstRequestTimestamp | 当第一个 STUN 绑定请求在 iceAgentSendStunPacket() 中成功发出时记录此信息。它可以与 lastRequestTimestamp 和 requestsSent 一起使用，以查找 STUN 绑定请求之间的平均时间。 | 
| lastRequestTimestamp | 每次 STUN 绑定请求在 iceAgentSendStunPacket() 中成功发出时都会记录此信息。 | 
| lastResponseTimestamp | 每次收到 STUN 绑定响应时都会记录此信息。 | 
| totalRoundTrip时间 | 在收到请求的绑定响应时更新。请求和响应根据校验和映射到哈希表中。 | 
| currentRoundTrip时间 | 当收到有关候选对请求的绑定响应时，最新的往返时间会更新。 | 
| requestsReceived | 在收到每个 STUN 绑定请求时，该计数器都会更新。 | 
| requestsSent | 在 iceAgentSendStunPacket() 中发出每个 STUN 绑定请求时，该计数器都会更新。 | 
| responsesSent | 在 handleStunPacket() 中为响应绑定请求而发出每个 STUN 绑定响应时，该计数器都会更新。 | 
| responsesReceived | 在 handleStunPacket()中收到每个 STUN 绑定响应时，该计数器都会更新。 | 
| packetsDiscardedOn发送 |  数据包发送失败时更新。换句话说，它会在 iceUtilsSendData()失败时更新。这有助于确定在特定持续时间内丢弃的数据包的百分比。 | 
| bytesDiscardedOn发送 | 数据包发送失败时更新。换句话说，它会在 iceUtilsSendData()失败时更新。这在确定特定持续时间内丢弃的数据包的百分比时很有用。请注意，计数器还包括数据包的标头。 | 

### 媒体
<a name="kvswebrtc-reference-media"></a>

出站 RTP 统计信息


****  

| 指标 | 说明 | 
| --- | --- | 
| voiceActivityFlag | 这目前是 Include.h 中定义的 RtcEncoderStats 的组成部分 如果最后一个音频数据包包含语音，则该标志设置为 TRUE。样本中目前未设置该标志。 | 
| packetsSent | 这表示为选定的 SSRC 发送的 RTP 数据包总数。这是 [https://www.w3 的一部分。 org/TR/webrtc-stats/ \$1sentrtpstats-dict\$1](https://www.w3.org/TR/webrtc-stats/#sentrtpstats-dict*) 并作为出站统计数据的一部分包含在内。每次调用 writeFrame() 时，该值都会递增。 | 
| bytesSent | 发送的总字节数，不包括 RTP 标头和填充。每次 writeFrame 调用时，该值都会更新。 | 
| encoderImplementation | 它由应用程序层作为 RtcEncoderStats 对象的一部分进行更新。 | 
| packetsDiscardedOn发送 | 如果 ICE 代理在 iceAgentSendPacket 调用中由于任何原因未能发送加密的 RTP 数据包，则会更新此字段。 | 
| bytesDiscardedOn发送 | 如果 ICE 代理在 iceAgentSendPacket 调用中由于任何原因未能发送加密的 RTP 数据包，也会更新此字段。 | 
| framesSent | 只有当媒体流堆栈类型为 MEDIA\$1STREAM\$1TRACK\$1KIND\$1VIDEO 时，该值才会递增。 | 
| hugeFramesSent | 当帧大小是帧平均大小的2.5倍时，此计数器会更新。帧的大小是通过计算 fps（基于上次已知的帧计数时间和按时间间隔编码的帧数）并使用应用程序 RtcEncoderStats 设置的 targetBitRate 来获得的。 | 
| framesEncoded | 仅在成功对帧进行编码后，才会针对视频轨道更新此计数器。它会在每次 writeFrame 调用时更新。 | 
| keyFramesEncoded | 仅在成功编码关键帧后，才会针对视频轨道更新此计数器。它会在每次 writeFrame 调用时更新。 | 
| framesDiscardedOn发送 | 当由于 iceAgentSendPacket 调用失败而导致帧发送失败时，会更新此信息。一个帧由一组数据包组成，当前，如果在 framesDiscardedOn发送时由于错误而丢弃了任何数据包，则发送将失败。 | 
| frameWidth | 理想情况下，这表示最后一个编码帧的帧宽。目前，应用程序将其设置为 RtcEncoderStats \$1的一部分的值，意义不大。 | 
| frameHeight | 理想情况下，这表示最后一个编码帧的帧高。目前，该值由应用程序设置为一个值，作为其中的一部分 RtcEncoderStats ，意义不大。 | 
| frameBitDepth |  这表示最后一个编码帧的每像素宽度的位深度。目前，这是由应用程序设置为出站统计信息的一部分， RtcEncoderStats 并转换为出站统计信息。 | 
| nackCount | 每次收到 RTP 数据包上的 NACK 并重新尝试发送该数据包时，都会更新此值。堆栈支持在收到 NACK 时重新传输数据包。 | 
| firCount | 该值将在收到 FIR 数据包时更新 (onRtcpPacket->on FIRPacket rtCP)。它表示流落后且必须跳帧才能赶上的频率。目前无法解码 FIR 数据包以提取字段，因此，即使设置了计数，也不会采取任何操作。 | 
| pliCount | 该值将在收到 PLI 数据包时更新 (onRtcpPacket-> PLIPacket onrtCP)。它表示在一帧或多帧中丢失了一定数量的编码视频数据。 | 
| sliCount | 该值将在收到 SLI 数据包时更新 (onRtcpPacket-> SLIPacket onrtCP)。它表示丢包影响单个帧的频率。 | 
| qualityLimitationResolution更改 | 目前，堆栈支持此指标，但是，并非每个编码帧的帧宽和帧高都受到监控。 | 
| lastPacketSentTimestamp | 发送最后一个数据包的时间戳。它会在每次 writeFrame 调用时更新。 | 
| headerBytesSent | 为此 SSRC 发送的 RTP 标头和填充字节总数，不包括实际的 RTP 有效负载。 | 
| bytesDiscardedOn发送 | 当由于 iceAgentSend数据包调用失败而导致帧发送失败时，会更新此信息。帧由一组数据包组成，这些数据包又由字节组成，当前，如果在 bytesDiscardedOn发送时由于错误而丢弃了任何数据包，则发送将失败。 | 
| retransmittedPacketsSent | 收到时重新传输的数据包的PLI/SLI/NACK数量。目前，由于不支持基于 PLI 和 SLI 的重新传输，堆栈仅计算 NACK 重新发送的数据包。 | 
| retransmittedBytesSent | 接收时重新传输的字节数。PLI/SLI/NACK目前，由于不支持基于 PLI 和 SLI 的重新传输，堆栈仅计算 NACK 重新发送的字节数。 | 
| targetBitrate | 这是在应用程序级别设置的。 | 
|  totalEncodedBytes目标 | 每次对帧进行编码时，目标帧大小（以字节为单位）都会增加该值。这是使用框架结构中的大小参数进行更新的。 | 
| framesPerSecond | 这是根据最后一个已知编码帧的记录时间和一秒钟内发送的帧数计算得出的。 | 
| totalEncodeTime | 在应用程序中将其设置为任意值，并在内部转换为出站统计信息。 | 
| totalPacketSend延迟 | 由于 Packet 会立即发送 iceAgentSend数据包，因此该值当前设置为 0。 | 

远程入站 RTP 统计信息：


****  

| 指标 | 说明 | 
| --- | --- | 
| roundTripTime | 该值是从 RTCP 接收方收到类型为 201 的 RTCP 报文(接收方报告)的报告中提取的。该报告包含诸如上次发送方报告和自上次发送方报告以来的延迟等详细信息，以计算往返时间。大约每 200 毫秒生成一次发送方报告，其中包括从出站统计信息中提取的信息，例如发送的数据包数量和发送的字节数。 | 
| totalRoundTrip时间 | 计算出的往返时间总和 | 
| fractionLost | 表示自上次发送 reporfractionLost 以来 SSRC 丢失的 RTP 数据包的比例 sender/receiver 。 | 
| reportsReceived | 每次收到接收方报告类型数据包时都会更新。 | 
| roundTripTime测量 | 表示已收到的包含有效往返时间的 SSRC 报告总数。但是，目前这个值仍是递增的，所以它的含义与 reportsReceived 相同。 | 

入站 RTP 统计信息：


****  

| 指标 | 说明 | 
| --- | --- | 
| packetsReceived | 当收到特定 SSRC 的数据包时，计数器会更新。 | 
| jitter | 此指标表示特定 SSRC 的数据包抖动（以秒为单位进行衡量）。 | 
| jitterBufferDelay | 该指标表示抖动缓冲区中每个数据包所花费的时间总和。 | 
| jitterBufferEmitted计数 | 来自抖动缓冲区的音频样本或视频帧的总数。 | 
| packetsDiscarded | 当抖动缓冲区已满且无法将数据包推入其中时，计数器会更新。这可以用来计算在固定时间内丢弃的数据包的百分比。 | 
| framesDropped | 当调用 onFrameDroppedFunc() 时会更新此值。 | 
| lastPacketReceivedTimestamp | 表示收到此 SSRC 的最后一个数据包的时间戳。 | 
| headerBytesReceived | 收到 RTP 数据包后，计数器即会更新。 | 
| bytesReceived | 接收的字节数。其中不包括标头字节。此指标可用于计算传入比特率。 | 
| packetsFailedDecryption | 当 SRTP 数据包的解密失败时，该值会递增。 | 

### 数据通道
<a name="kvswebrtc-reference-datachannel"></a>

数据渠道指标：


****  

| 指标 | 说明 | 
| --- | --- | 
| label | 标签是正在检查的数据通道的名称。 | 
| protocol | 由于我们的堆栈使用 SCTP，因此协议设置为恒定 SCTP。 | 
| dataChannelIdentifier | 用于唯一标识数据通道的偶数或奇数标识符。如果 SDK 是提议者，则更新为奇数值；如果 SDK 是应答者，则更新为偶数值。 | 
| state | 查询统计信息时数据通道的状态。目前，支持的两种状态是 RTC\$1DATA\$1CHANNEL\$1STATE\$1CONNECTING（通道创建时）和 RTC\$1DATA\$1CHANNEL\$1STATE\$1OPEN（在 onOpen() 事件中设置）。 | 
| messagesSent | 当 SDK 通过数据通道发送消息时，计数器会更新。 | 
| bytesSent | 该计数器用发送出去的消息中的字节更新。这可以用来了解有多少字节由于失败而没有发送，也就是说，可以用来了解发送的字节百分比。 | 
| messagesReceived | 该指标在 onMessage() 回调中递增。 | 
| bytesReceived | 该指标在 onMessage() 回调中生成。 | 