

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

# 创建冗余 HLS 清单
<a name="hls-redundant-manifests"></a>

在标准 MediaLive 频道中创建 HLS 输出组时，可以启用冗余清单。通过使用冗余清单，下游系统（读取清单）可以更好地处理 MediaLive 的输出故障。

如果启用了冗余清单功能，每个管道的主清单引用自己的子清单以及另一个管道的子清单。下游系统查找一个管道的子清单的路径。如果该管道存在问题，该管道的子清单将存在问题。然后，下游系统可以参考主清单以查找另一个管道的子清单。这样，下游系统就可以始终继续处理清单和媒体。

要成功实施冗余清单，您必须确保下游系统可以按照 HLS 规范中所述的方式处理冗余清单。

**注意**  
本节中有关 HLS 清单的信息假定您熟悉创建通道的一般步骤，如[从头开始创建通道](creating-channel-scratch.md)中所述。  
控制台中与此功能相关的关键字段位于**创建通道**页面上 **HLS 输出组**部分的**清单和分段**分组中。要查看填写这些字段的步骤，请参阅[过程](creating-hls-output-group.md#hls-create-procedure)。

**Topics**
+ [设置冗余清单的过程](hls-rm-procedure.md)
+ [HLS 清单的媒体内容](hls-rm-manifests-contents.md)
+ [适用于大多数下游系统的规则](hls-redundant-manif-most-systems.md)
+ [Akamai 的规则 CDNs](hls-redundant-manif-akamai.md)
+ [将冗余清单和其他功能结合使用](hls-redundant-manif-combine.md)

# 设置冗余清单的过程
<a name="hls-rm-procedure"></a>

在 MediaLive HLS 输出中设置冗余清单分为两个部分。您必须在输出组中打开该功能。您还必须调整输出名称和目的地路径设计（与未实施冗余清单的 HLS 输出相比）。

以下字段专门与冗余清单有关：
+ **HLS output group - Manifests and Segments - Redundant manifests (HLS 输出组 - 清单和分段 - 冗余清单)** 字段

**设置冗余清单**

1. 与下游系统的操作员沟通以确定其是否支持冗余清单。

1. 查看[输出目标的字段 – 发送到 HTTP 服务器](hls-destinations-http.md)中的信息。清单被视为从中 MediaLive输出。因此，有关输出目标的一般规则适用于冗余清单。

1.  URLs 为这两条管道设计。对 HLS 文件有特殊要求。 URLs 请阅读相应的章节：
   + [适用于大多数下游系统的规则](hls-redundant-manif-most-systems.md) 
   + [Akamai 的规则 CDNs](hls-redundant-manif-akamai.md)

   这些规则为[输出目标的字段 – 发送到 HTTP 服务器](hls-destinations-http.md)中的信息提供补充。

1. 如果您还需要使用清单的自定义路径，请确保查看[自定义路径的工作方式](hls-manifests-how-work.md#hls-custom-manifest-paths)中的信息。在设计自定义路径时，必须考虑自定义路径的规则 URLs。

1. 在 **HLS output group (HLS 输出组)** 部分中，对于 **Manifest and segments (清单和分段)**，为 **Redundant manifest (冗余清单)** 选择 **ENABLED (已启用)**。该字段适用于输出组中的所有输出。

1. 按照设计，填写以下字段：
   + **Output group - HLS group destination (输出组 - HLS 组目标)** 部分
   + **Output group - HLS settings - CDN (输出组 - HLS 设置 - CDN)** 部分
   + **Output group - Location - Directory structure (输出组 - 位置 - 目录结构)**
   + **Output group - Location - Segments per subdirectory (输出组 - 位置 - 每个子目录的分段)**
   + **HLS 输出 – 输出设置 – 名称修饰符**
   + **HLS 输出 – 输出设置 – 分段修饰符**
   + **HLS 输出组 – 位置 – 基本 URL 清单**（如果您还要设置自定义路径）
   + **HLS 输出组 – 位置 – 基本 URL 内容**（如果您还要设置自定义路径） 

有关该功能如何更改 HLS 清单内容的信息，请参阅[HLS 清单的媒体内容](hls-rm-manifests-contents.md)。

## 该设置的结果
<a name="hls-redundant-manif-results"></a>

以下是有关冗余清单在三种故障场景中的工作方式的信息。

### 场景 A – 输入丢失操作是发出输出
<a name="hls-redundant-manif-results-emit"></a>

如果其中一个管道上的输入丢失并且[**输入丢失操作**字段](hls-other-features.md#hls-resiliency)设置为 **EMIT\$1OUTPUT，则**会 MediaLive继续更新父清单和子清单。

从下游系统的角度看，两个管道的父清单或子清单都没有发生变化。媒体文件中的内容是填充内容，但这并不影响下游系统读取清单的方式。

### 场景 B – 输入丢失操作是暂停输出
<a name="hls-redundant-manif-results-pause"></a>

如果其中一条管道上的输入丢失（例如，在管道 0 上），并且 “**输入丢失” 操作**字段设置为 **PAUSE\$1OUTPUT， MediaLive 则执行**以下操作：
+ 它删除管道 0 的子清单列表。
+ 它向管道 0 的子清单位置发送请求以删除子清单。

读取管道 0 上的主清单的下游系统的结果：系统不再查找管道 0 的子清单列表。系统将在管道 0 主清单中查找替代子清单。如果它找到管道 1 的子清单，它将进行切换以读取该子清单。

读取管道 1 的主清单的下游系统不会受到影响，因为这些系统可能读取管道 1 的子清单（因为它们先出现在清单中）。

### 场景 C – 管道故障
<a name="hls-redundant-manif-results-pipeline-failure"></a>

管道也可能会发生故障。该故障与输入故障不同。在管道发生故障时（例如，管道 0），将出现以下情况：
+ 输出停止。
+ 未删除管道 0 的主清单。它仍包含管道 0 的子清单列表。
+ 未更新子清单，因为没有生成新的媒体文件。子清单是*过时的*。
+ 管道 1 的主清单没有发生变化。它仍包含管道 0（和管道 1）的子清单列表。

读取管道 0 的主清单的下游系统的结果：系统将查找管道 0 的子清单列表，但该清单将是过时的。如果系统可以检测到清单是过时的，它可能会返回到管道 0 主清单并搜索替代子清单。如果它找到管道 1 的子清单，它将进行切换以读取该子清单。

读取管道 1 的主清单的下游系统不受影响。这些系统可能读取管道 1 的子清单（因为它们先出现在清单中）。

**注意**  
如果 HLS 输出的下游系统是 AWS Elemental MediaStore，则可以设置 MediaStore 为删除陈旧的输入。请参阅[对象生命周期策略的组件](https://docs.aws.amazon.com/mediastore/latest/ug/policies-object-lifecycle-components.html)。子清单被删除后，会回 MediaStore 退到遵循场景 B 的 “清单已删除” 逻辑。

# HLS 清单的媒体内容
<a name="hls-rm-manifests-contents"></a>

在 HLS 输出中设置冗余清单时， MediaLive 会更改清单的内容。它更改清单中的媒体信息（视频、音频和字幕信息）。所有这些信息将显示为 `#EXT-X-STREAM-INF` 标签。

以下几节介绍了标准（非冗余）清单和冗余清单中的这些标签的数量和内容。

## 标准清单的显示内容
<a name="hls-redundant-manif-what-standard-like"></a>

对于标准通道，具有两个管道。每个管道生成自己的一组清单。因此，对于管道 0，具有一个主清单、一组子清单和一组媒体文件。同样，管道 1 具有一组相同的文件。这些清单仅引用自己的管道的文件。

每个管道的主清单中的视频信息可能如下所示：

```
#EXT-X-STREAM-INF:BANDWIDTH=629107 ... 
curling-high.m3u8
```

## 冗余清单的显示内容
<a name="hls-redundant-manif-what-redundant-like"></a>

如果启用了冗余清单功能，每个主清单将引用自己的管道和另一个管道的子清单。

该功能不会影响子清单。子清单仅引用自己的媒体文件。

以下示例说明了可能如何显示清单中的视频信息。假设管道 0 的 baseFilename 是 *first-curling*，而管道 1 的 baseFilename 是 *other-curling*。

管道 0 的清单可能如下所示（先显示管道 0 的子清单信息）：

```
#EXT-X-STREAM-INF:BANDWIDTH=629107 ... 
first-curling-high.m3u8

#EXT-X-STREAM-INF:BANDWIDTH=629107 ... 
other-curling-high.m3u8
```

管道 1 的清单中的视频信息可能如下所示（先显示管道 1 的子清单信息）：

```
#EXT-X-STREAM-INF:BANDWIDTH=629107 ... 
other-curling-high.m3u8

#EXT-X-STREAM-INF:BANDWIDTH=629107 ... 
first-curling-high.m3u8
```

# 适用于大多数下游系统的规则
<a name="hls-redundant-manif-most-systems"></a>

只要下游系统可以使用特定的规则，您就可以在 MediaLive HLS 输出组中设置冗余清单。如果要为 Akamai 以外的任何下游系统设置冗余清单，请阅读本节。如果下游系统是 Akamai CDN，请参阅[Akamai 的规则 CDNs](hls-redundant-manif-akamai.md)。

必须确保下游系统可以按照以下规则运行。
+ MediaLive 将两个管道中的文件推送到同一个位置 (protocol/domain/path)。
+ 如果位置相同，则管道的基本文件名必须不同。
+ 如果您还实施[自定义清单路径](hls-manifests-how-work.md#hls-custom-manifest-paths)，则清单中的 URL 必须是相同的。


|  字段  |  规则  | 
| --- | --- | 
|  Protocol/domain/path两个目的地 URIs （A 和 B）的一部分  |  在两个字段中必须是相同的。 | 
|  两个目的地 URIs （A 和 B）的基本文件名部分  |  在每个字段中必须是不同的。 它*不能* 使用包含日期或时间的[变量标识符](variable-data-identifiers.md)。  | 
|  NameModifier 对于每个输出  |  该字段只有一个实例。两个管道使用相同的值。 它*不能* 使用包含日期或时间的[变量标识符](variable-data-identifiers.md)。  | 
|  段修饰符  |  该字段只有一个实例。两个管道使用相同的值。 它*可以* 使用包含日期或时间的[变量标识符](variable-data-identifiers.md)。  | 
| 基本 URL 清单 A 和 基本 URL 清单 B  |  只有在您还实施了[自定义清单路径](hls-manifests-how-work.md#hls-custom-manifest-paths)时，这些字段才适用。 填写两个字段。  | 
| 基本 URL 内容 A 和 基本 URL 内容 B  |  只有在您还实施了[自定义清单路径](hls-manifests-how-work.md#hls-custom-manifest-paths)时，这些字段才适用。 填写两个字段。  | 

# Akamai 的规则 CDNs
<a name="hls-redundant-manif-akamai"></a>

只要下游系统可以使用特定的规则，您就可以在 MediaLive HLS 输出组中设置冗余清单。如果要为 Akamai CDN 设置冗余清单，请查看此部分。如果下游系统不是 Akamai CDN，请参阅[适用于大多数下游系统的规则](hls-redundant-manif-most-systems.md)。

必须确保下游系统可以按照以下规则运行。


|  字段  |  规则  | 
| --- | --- | 
|  Protocol/domain/path两个目的地 URIs （A 和 B）的一部分  | 可以彼此不同，也可以相同。 | 
|  BaseFilename 两个目的地 URIs （A 和 B）的一部分  |  可以彼此不同，也可以相同。 它*不能* 使用包含日期或时间的[变量标识符](variable-data-identifiers.md)。 protocol/domain/path和 baseFileName 的组合在 A 和 B 中必须是唯一的。此规则可确保来自两个管道的输出文件不会相互覆盖。  | 
|  名称修饰符  |  该字段只有一个实例。两个管道使用相同的值。 它*不能* 使用包含日期或时间的[变量标识符](variable-data-identifiers.md)。  | 
|  段修饰符  |  该字段只有一个实例。两个管道使用相同的值。 它*可以* 使用包含日期或时间的[变量标识符](variable-data-identifiers.md)。  | 
| 基本 URL 清单 A 和 基本 URL 清单 B  |  只有在您还实施了[自定义清单路径](hls-manifests-how-work.md#hls-custom-manifest-paths)时，这些字段才适用。通常，使用 Akamai CDNs，您可以实现自定义清单路径。 填写两个字段。  | 
| 基本 URL 内容 A 和 基本 URL 内容 B  |  只有在您还实施了[自定义清单路径](hls-manifests-how-work.md#hls-custom-manifest-paths)时，这些字段才适用。 填写两个字段。  | 

# 将冗余清单和其他功能结合使用
<a name="hls-redundant-manif-combine"></a>

## 将冗余清单和自定义路径功能结合使用
<a name="hls-redundant-manif-with-custom-paths"></a>

在 MediaLive HLS 输出组中设置冗余清单时，也可以设置自定义路径。请务必遵守您的下游系统 – [Akamai CDN](hls-redundant-manif-akamai.md) 或[其它下游系统](hls-redundant-manif-most-systems.md) – 的[自定义路径](hls-custom-paths-rules.md)和冗余清单规则。

## 将冗余清单与音频渲染组结合使用
<a name="hls-redundant-manif-with-args"></a>

**注意**  
本节中的信息假定您熟悉音频渲染组清单。有关更多信息，请参阅 [示例清单](sample-manifest.md)。

以下是在包含音频格式副本组的 HLS 输出组中设置冗余清单时所 MediaLive 执行的处理的信息。

MediaLive 自动调整父清单中对音频格式副本组的引用。

在每对行（例如，高分辨率视频的）中， MediaLive 调整格式副本组的名称。`#EXT-X-STREAM-INF`这样，每个管道的渲染组引用都是不同的，从而确保在客户端播放器读取清单时，它从同一管道中选择视频和音频。

管道 0 的视频的 `#EXT-X-STREAM`。记下 *AUDIO* 的值：

```
#EXT-X-STREAM-INF:BANDWIDTH=541107,...AUDIO="aac-audio-0", ... 
```

 管道 1 的视频的 `#EXT-X-STREAM`。记下 *AUDIO* 的值：

```
#EXT-X-STREAM-INF:BANDWIDTH =541107, ...AUDIO="aac-audio-1",... 
```