

# IVS RTMP 发布 \$1 实时直播功能
<a name="rt-rtmp-publishing"></a>

本文档概述使用 RTMP 发布到 IVS 暂存区的过程。有关各种摄取选项的其他详细信息，请参阅[流摄取](https://docs.aws.amazon.com/ivs/latest/RealTimeUserGuide/rt-stream-ingest.html)文档

## 先决条件
<a name="rtmp-prerequisites"></a>

### 创建舞台
<a name="rtmp-create-stage"></a>

要创建暂存区，请使用以下命令：

`aws ivs-realtime create-stage --name "test-stage"`

有关详细信息，包括响应，请参阅 [CreateStage](https://docs.aws.amazon.com/ivs/latest/RealTimeAPIReference/API_CreateStage.html)。

**重要提示：**请注意响应中的 `endpoints` 字段，其列出了 RTMP 和 RTMPS 端点。设置 RTMP 编码器时需要这些端点。

### 创建摄取配置
<a name="rtmp-create-an-ingest-configuration"></a>

要使用 RTMPS 发布到暂存区，必须先创建摄取配置并将其与您的暂存区相关联。当您发布到暂存区时（使用摄取配置中的流密钥和暂存区中的 RTMP 端点），媒体将以参与者身份发布到暂存区。您可以选择指定 `userId` 和自定义 `attributes`，其将与连接到暂存区的[参与者](https://docs.aws.amazon.com/ivs/latest/RealTimeAPIReference/API_Participant.html)相关联。

```
aws ivs-realtime create-ingest-configuration \
  --name 'test' \
  --stage-arn arn:aws:ivs:us-east-1:123456789012:stage/8faHz1SQp0ik \
  --user-id '123' \
  --ingest-protocol 'RTMPS'
```

有关详细信息，包括响应，请参阅 [CreateIngestConfiguration](https://docs.aws.amazon.com/ivs/latest/RealTimeAPIReference/API_CreateIngestConfiguration.html)。

创建摄取配置时，您可以预先将其与特定暂存区 ARN 相关联。如果没有此关联，则流密钥将无法使用。此外，摄取配置（包括 `stageArn` 字段）可以通过 [UpdateIngestConfiguration](https://docs.aws.amazon.com/ivs/latest/RealTimeAPIReference/API_UpdateIngestConfiguration.html) 操作进行更新，这样您就可以在不同的舞台重复使用相同的配置。

**注意：**摄取配置 `insecureIngest` 字段默认为 `false`，需要使用 RTMPS。RTMP 连接将被拒绝。如果必须使用 RTMP，则请将 `insecureIngest` 设置为 `true`。我们建议使用 RTMPS，除非是在需要 RTMP 的特定且经过验证的使用场景。

## RTMP 单轨道视频
<a name="rtmp-singletrack"></a>

下面我们介绍如何使用 OBS Studio；但是，您可以使用符合 IVS [媒体规范](https://docs.aws.amazon.com/ivs/latest/RealTimeUserGuide/rt-stream-ingest.html#supported-media-specifications)的任何 RTMP 编码器。

### OBS 指南
<a name="rtmp-singletrack-obs"></a>

1. 下载并安装此软件：[https://obsproject.com/download](https://obsproject.com/download)。

1. 单击**设置**。在**设置**面板的**流**部分，从**服务**下拉列表中选择**自定义**。

1. 对于**服务器**，请输入暂存区的 RTMP 或 RTMPS 端点。

1. 在**流密钥**中，输入来自摄取配置的 `streamKey`。

1. 如常配置视频设置，但有一些限制：

   1. IVS 实时直播功能支持高达 720p 的输入，速度为 8.5 Mbps。如果超出这些限制，则流将断开连接。

   1. 建议在**输出**面板中将**关键帧间隔**设置为 1s 或 2s。较低的关键帧间隔可以让观众更快地开始视频播放。还建议将 **CPU 使用率预设**设置为 **veryfast**，将**调谐**设置为 **zerolatency**，以实现最低延迟。

   1. 由于 OBS 不支持联播，因此建议将比特率保持在 2.5 Mbps 以下。这样，使用较低带宽连接的观众也能观看。

   1. 禁用 B 帧，因为带有 B 帧的流将自动断开连接。请执行以下操作之一：
      + 在 x264 选项中，输入 `bframes=0 sliced-threads=0`。
      + 如果可以选择 B 帧，则将其设置为 0（例如，对于 NVENC）。

   注意：RTMP 流必须同时包含音频和视频轨道，否则会被断开。

1. 选择**开始直播**

**重要提示：**如果编码器的最大比特率设置为 8.5 Mbps，则发布者偶尔会从会话中消失。这是因为最大比特率设置只是一个目标，而编码器偶尔会超出目标值。为防止这种情况，请将编码器的最大比特率设置得更低；例如设置为 6 Mbps。

## E-RTMP 多轨道视频
<a name="rtmp-multitrack"></a>

IVS 支持 E-RTMP（增强型实时消息协议）的多轨道视频功能，允许将单个 RTMP 流中多种质量的视频发布到 IVS 暂存区。这支持自适应比特率流，因此订阅用户可以自动以网络连接的最佳质量观看。

摄取后，不同质量的视频会作为联播层传送给订阅用户。要配置订阅用户接收的层，请参阅实时直播功能广播 SDK 指南中的“联播分层编码”部分：[Android](https://docs.aws.amazon.com/ivs/latest/RealTimeUserGuide/broadcast-android.html)、[iOS](https://docs.aws.amazon.com/ivs/latest/RealTimeUserGuide/broadcast-ios.html) 和 [Web](https://docs.aws.amazon.com/ivs/latest/RealTimeUserGuide/broadcast-web.html)。

有关示例代码，请参阅 GitHub 上的 [aws-samples/sample-amazon-ivs-multitrack-video](https://github.com/aws-samples/sample-amazon-ivs-multitrack-video)。

下图说明了多轨道视频发布的工作原理：

![\[将多轨道视频发布到暂存区。”\]](http://docs.aws.amazon.com/zh_cn/ivs/latest/RealTimeUserGuide/images/E-RTMP.png)


### OBS 指南
<a name="rtmp-multitrack-obs"></a>

1. 下载并安装 OBS Studio：

   1. Windows：从 OBS Studio 30.2 开始支持多轨道视频。

   1. macOS：从 OBS Studio 31.1 测试版（仅限 Apple Silicon）开始，支持多轨道视频。

   1. 下载地址：[https://obsproject.com/download](https://obsproject.com/download)。

1. 单击**设置**。在**设置**面板的**流**部分，从**服务**下拉列表中选择 **Amazon IVS**。

1. 对于**服务器**，将设置保留为**自动**。

1. 在**流密钥**中，输入来自摄取配置的 `streamKey`。

1. 在**多轨道视频**部分下，选中**启用多轨道视频**。

1. 在**视频**面板中，设置所需的**基础（画布分辨率）**和**输出（缩放）分辨率**。IVS 实时直播功能支持高达 720p 的输入。如果超出此限制，则流将断开连接。

   启用多轨道视频后，视频轨道数量、比特率和关键帧间隔等设置将根据设备的功能自动配置。

1. 选择**开始流式传输**。

### 使用 FFFmpeg 发布
<a name="rtmp-multitrack-ffmpeg"></a>

您可以使用 FFmpeg 将实时视频和音频发布到通过 RTMP 传输的 IVS 实时流媒体中。FFmpeg 是一个免费的开源项目，包括一个全面的软件库和工具，用于处理视频、音频以及其他多媒体内容。

以下示例命令发布包含颜色图案和色调的流：

```
ffmpeg \
 -re \
 -f lavfi -i testsrc=d=300:s=1280x720:r=60,format=yuv420p \
 -f lavfi -i sine=f=440:b=4:d=300 \
 -c:v libx264 \
 -b:v 2500k \
 -g 60 -bf 0 \
 -profile:v baseline \
 -preset veryfast \
 -tune zerolatency \
 -x264opts sliced-threads=0 \
 -c:a aac \
 -ac 2 \
 -b:a 160k \
 -ar 48000 \
 -f flv \
 rtmps://$INGEST_ENDPOINT/app/$STREAM_KEY
```

在示例中，用 IVS 控制台或 API 中您自己的值替换 `$INGEST_ENDPOINT` 和 `$STREAM_KEY`。

此配置符合 IVS 实时流媒体的[支持的媒体规范](https://docs.aws.amazon.com/ivs/latest/RealTimeUserGuide/rt-stream-ingest.html#supported-media-specifications)，包括 H.264 视频（基准配置文件、无 B 帧、无切片线程）和 AAC 音频。

## 私有摄取到舞台
<a name="private-ingest-stages"></a>

您可以使用接口 VPC 端点将 RTMP(S) 和 E-RTMP(S) 流从 Amazon VPC 内的资源或从 Direct Connect 发布到舞台。这样就可以在您的 VPC 和 IVS 之间建立私有连接，确保摄取流量位于 AWS 网络内。要为 IVS 设置和配置接口 VPC 端点，请参阅《IVS 低延迟直播用户指南》中的 [IVS 私有摄取](https://docs.aws.amazon.com//ivs/latest/LowLatencyUserGuide/private-ingest-ll.html)**。

## 冗余输入
<a name="redundant-ingest"></a>

冗余输入支持从两个不同的编码器同时流式传输到单个阶段，并自动对同一源媒体进行失效转移。这有助于防止源编码器故障和第一英里网络问题。冗余输入受 RTMP(S) 和 E-RTMP(S) 流支持。

[要启用冗余输入，在通过 CreateIngestConfiguration 创建输入配置时，将 `redundantIngest` 设置为 `true`。](https://docs.aws.amazon.com/ivs/latest/RealTimeAPIReference/API_CreateIngestConfiguration.html)IVS 提供两个 RTMP 流密钥。使用相同的输入端点，配合各自的流密钥，配置两个独立的编码器。

每个物理流在参与者 API（例如 ListParticipants）中显示为独立的参与者。然而，订阅用户只能订阅一个虚拟参与者，该虚拟参与者由输入配置中的顶级 `participantId` 标识。IVS 会自动控制虚拟参与者使用哪个物理流。如果启用了单个参与者录制，每个物理参与者将被单独录制。如果启用了服务器端合成，则只有虚拟参与者出现在合成画面中。

冗余输入还支持全天候连续流式传输。IVS 对单个发布者的限制为 24 小时，但使用冗余输入时，IVS 错开两个物理流的连接超时时间，并自动切换虚拟参与者所使用的物理流，从而让订阅用户体验到不间断的全天候流式传输。

### 要求
<a name="redundant-ingest-requirements"></a>
+ 为实现不间断切换，流必须保持同步锁定，并且编码参数（包括分辨率和帧率）必须保持一致。

### 建议
<a name="redundant-ingest-recommendations"></a>
+ 建议为每个编码器使用独立的网络连接及不同的网络路径（例如不同的 ISP），以最大程度防范第一英里网络问题，避免单点故障。
+ 同时保持两个编码器的流均为活跃状态。
+ 在生产环境使用前，请测试失效转移场景。