

# IVS 回放器 SDK：Video.js 集成
<a name="player-videojs"></a>

本文档介绍了 Amazon Interactive Video Service (IVS) Video.js 播放器中最重要的功能。

**Video.js 播放器集成的最新版本：**1.51.0（[发布说明](https://docs.aws.amazon.com/ivs/latest/LowLatencyUserGuide/release-notes.html#apr16-26-player-web-ll)）

## 开始使用
<a name="videojs-getting-started"></a>

Amazon IVS 对 Video.js 的支持是通过 Video.js [技术](https://videojs.com/guides/tech/)实现的。我们通过脚本标签以及 npm 模块提供支持。Amazon IVS 支持 Video.js 版本 7.6.6 以及更高的 7\* 和 8\* 版本。

请注意，在实例化播放器时，Video.js [源选项](https://videojs.com/guides/options/#sources)不受支持。相反，请正常实例化播放器并调用 Video.js `src()` 函数。如果启用了自动播放，则流将开始播放；否则，使用 `play()` 以开始播放。

### 演示
<a name="videojs-demo"></a>

以下现场演示展示了如何使用 Video.js 集成与我们的内容分发网络中的脚本标签：[Amazon IVS 播放器 Video.js 集成](https://codepen.io/amazon-ivs/pen/NWqewZo/bdc01e977102051eae5fb85482f88276)。

### 使用脚本标签进行设置
<a name="videojs-script-tag-setup"></a>

要使用 `script` 标签设置 Amazon IVS 技术，请执行以下操作：

1. 包含以下标签（针对最新版本的播放器集成）。

   ```
   <script src="https://player.live-video.net/1.51.0/amazon-ivs-videojs-tech.min.js"></script>
   ```

1. 使用 `registerIVSTech` 函数注册技术：

   ```
   registerIVSTech(videojs);
   ```

   其中 `videojs` 是 Video.js 提供的对象。

1. 创建播放器的实例时，添加 `AmazonIVS` 作为 `techOrder` 选项中的第一个技术。

当实例化播放器时，Video.js [源选项](https://videojs.com/guides/options/#sources)不受支持。相反，要设置源代码，请正常实例化播放器，然后调用 Video.js `src()` 函数。如果启用了自动播放，则流将开始播放；否则，使用 `play()` 以开始播放。

### 示例代码
<a name="videojs-sample-code"></a>

在此示例中，`PLAYBACK_URL` 是要加载的源流。此示例使用最新版本的 Amazon IVS 播放器。

```
<!doctype html>
<html lang="en">
<head>
    <link href="https://cdnjs.cloudflare.com/ajax/libs/video.js/7.14.3/video-js.css" rel="stylesheet">
    <script src="https://cdnjs.cloudflare.com/ajax/libs/video.js/7.14.3/video.min.js"></script>
    <script src="https://player.live-video.net/1.51.0/amazon-ivs-videojs-tech.min.js"></script>
</head>

<body>
    <div class="video-container">
        <video id="amazon-ivs-videojs" class="video-js vjs-4-3 vjs-big-play-centered" controls autoplay playsinline></video>
    </div>
    <style>
        body {
            margin: 0;
        }

        .video-container {
            width: 640px;
            height: 480px;
            margin: 15px;
        }
    </style>
    <script>
        (function play() {
            // Get playback URL from Amazon IVS API
            var PLAYBACK_URL = '';
            
            // Register Amazon IVS as playback technology for Video.js
            registerIVSTech(videojs);

            // Initialize player
            var player = videojs('amazon-ivs-videojs', {
               techOrder: ["AmazonIVS"]
            }, () => {
               console.log('Player is ready to use!');
               // Play stream
               player.src(PLAYBACK_URL);
            });
        })();
    </script>
</body>
</html>
```

### 使用 NPM 进行设置
<a name="videojs-npm-setup"></a>

要通过 npm 使用 Amazon IVS 播放器，请执行以下操作：

1. 安装 [video.js](https://www.npmjs.com/package/video.js/v/7.6.6) npm 软件包或确保您的项目具有对 Video.js 库的一些其他访问权限。

1.  安装 `amazon-ivs-player` npm 软件包：

   ```
   npm install amazon-ivs-player
   ```

1. 准备好注册 Amazon IVS 技术时，请导入 `registerIVSTech` 函数：

   ```
   import { registerIVSTech } from 'amazon-ivs-player';
   ```

1. 使用 `registerIVSTech` 函数注册技术：

   ```
   registerIVSTech(videojs, options);
   ```

   其中：
   + `videojs` 是 Video.js 提供的对象。
   + `options` 是 Amazon IVS 技术层的选项。支持的选项为：
     + `wasmWorker`：托管 `amazon-ivs-wasmworker.min.js` 文件的 URL。
     + `wasmBinary`：托管 `amazon-ivs-wasmworker.min.wasm` 文件的 URL。

     工作线程文件位于 `amazon-ivs-player/dist/` 下的 `node_modules/` 文件夹中。您需要托管它们以使用 IVS 播放器。

1. 创建播放器的实例时，添加 `AmazonIVS` 作为 `techOrder` 选项中的第一个技术：

   ```
   const player = videojs('videojs-player', {
       techOrder: ["AmazonIVS"]
   });
   ```

### TypeScript
<a name="videojs-typescript"></a>

如果您使用的是 TypeScript，我们的 npm 软件包包含您可能需要导入和使用的以下类型。
+ `VideoJSEvents`，描述了从 `getIVSEvents()` 返回的结构。
+ `VideoJSIVSTech`，描述了使用 `AmazonIVS` 技术的播放器实例的接口。此值可以与 [@types/video.js](https://www.npmjs.com/package/@types/video.js) npm 软件包公开的 `VideoJsPlayer` 类型[相交](https://www.typescriptlang.org/docs/handbook/advanced-types.html#intersection-types)。
+ `TechOptions`，描述了定义您可以发送到 `registerIVSTech()` 的配置选项的接口。

有关这些类型的更多信息，请参阅 [Amazon IVS 回放器 SDK：Web 参考](https://aws.github.io/amazon-ivs-player-docs/1.51.0/web/)。

## Events
<a name="videojs-events"></a>

要侦听标准 Video.js 事件，请使用 Video.js 播放器的 [on](https://docs.videojs.com/docs/api/player.html#Methodson) 函数。

要侦听特定于 Amazon IVS 的事件，请在 Amazon IVS Web 播放器上添加和删除事件侦听器：

```
player.getIVSPlayer().addEventListener(event, callback);
player.getIVSPlayer().removeEventListener(event, callback);
```

其中 `callback` 是您定义的回调，`event` 为以下值之一：`PlayerEventType` 或 `PlayerState`。有关事件的更多信息，请参阅 [Amazon IVS 回放器 SDK：Web 参考](https://aws.github.io/amazon-ivs-player-docs/1.51.0/web/)。

## 错误
<a name="videojs-errors"></a>

对于一般 Video.js 错误，请在播放器上侦听通用 `error` 事件：

```
player.on("error", callback);
```

对于特定于 Amazon IVS 的错误，请在 Amazon IVS 播放器上侦听其自身的错误：

```
let playerEvent = player.getIVSEvents().PlayerEventType;
player.getIVSPlayer().addEventListener(playerEvent.ERROR, callback);
```

回调将接收带有以下字段的对象：


| 字段 | 描述 | 
| --- | --- | 
| `type` | 错误类型。对应于 `ErrorType` 事件。有关更多信息，请参阅 [Amazon IVS 回放器 SDK：Web 参考](https://aws.github.io/amazon-ivs-player-docs/1.51.0/web/)。 | 
| `code` | 错误代码。 | 
| `source` | 错误源。 | 
| `message` | 人类可读的错误消息。 | 

## 插件
<a name="videojs-plugins"></a>

我们提供了一个插件，可为可用质量创建 UI 切换。要使用此插件，如果您通过以下 `script` 标签使用我们的技术，则必须通过包含 `amazon-ivs-quality-plugin.min.js` 文件来加载该插件（对于最新版本的 IVS 播放器）：

```
<script src="https://player.live-video.net/1.51.0/amazon-ivs-quality-plugin.min.js"></script>
```

如果您使用的是 npm，请导入来自 `amazon-ivs-player` 模块的 `registerIVSQualityPlugin`：

```
import { registerIVSQualityPlugin } from 'amazon-ivs-player';
```

创建 Video.js 播放器的实例后，需要执行以下调用才能进行注册并启用：

```
registerIVSQualityPlugin(videojs); // where videojs is the video.js variable
player.enableIVSQualityPlugin(); // where player is the instance of the videojs player
```

这将创建一个 UI 菜单按钮，允许您选择流的质量。

### 插件和 TypeScript
<a name="videojs-plugins-typescript"></a>

如果您使用的是 TypeScript，我们的 npm 软件包包含您可能需要导入并与我们的插件一起使用的 `VideoJSQualityPlugin` 类型。插件本质上是 mixin，因此该类型接口被用作与 `VideoJSIVSTech` Typescript 接口的[相交类型](https://www.typescriptlang.org/docs/handbook/advanced-types.html#intersection-types)。

## 内容安全策略
<a name="videojs-content-security-policy"></a>

Amazon IVS Video.js API 配置为在使用内容安全策略 (CSP) 的页面上工作。请参阅 [IVS 播放器 SDK：Web 指南](web-content-security-policy.md) 中的“使用内容安全策略”章节。

## 函数
<a name="videojs-functions"></a>

### 播放
<a name="videojs-functions-playback"></a>

Amazon IVS Video.js API 支持 Video.js 框架内部使用的必要接口。客户端应用程序不太可能需要直接使用这些方法，因为 Video.js 进行了必要的集成并提供了一个标准接口。但是，如果需要，访问内部 Video.js 和 Amazon IVS 播放器方法的一种方式是使用 Video.js 播放器对象获取技术所需的对象句柄。

要访问 API，请像平常一样检索 Video.js 播放器的实例：

```
let player = videojs("videoTagId"); //replace videoTagId with your <video> tag’s id
```

然后，可以在该实例上调用函数。

以下是 Amazon IVS 技术层覆盖的 Video.js 函数的子集。有关 Video.js 函数的完整列表，请参阅 [video.js API 文档](https://docs.videojs.com/player)。


| 函数 | 描述和 Amazon IVS 特定信息 | 
| --- | --- | 
| `currentTime` | 获取或设置时间（以秒为单位，从开始算起）。<br />Amazon IVS：我们不建议为实时流设置当前时间。 | 
| `dispose` | 删除播放器实例<br />Amazon IVS：这也会删除 Amazon IVS 技术后端。 | 
| `duration` | 返回视频的持续时长（以秒为单位）。<br />Amazon IVS：对于实时流，这将返回 `Infinity`。 | 
| `负载` | 开始加载 `src()` 数据。<br />Amazon IVS：无操作。 | 
| `play` | 播放通过 `src` 调用设置的流。<br />Amazon IVS：如果实时流已暂停，则播放最新帧的实时流，而不是从暂停的位置继续播放。 | 
| `playbackRate` | 获取或设置视频播放速率。1.0 表示正常速度；0.5 表示正常速度的一半；2.0 表示正常速度的两倍；依此类推。<br />Amazon IVS：在实时流上，get 返回 1，并忽略一个集合。 | 
| `seekable` | 返回可以搜索到的媒体的 `TimeRanges`。<br />Amazon IVS：对于实时流，对返回值 (`TimeRange`) 调用 `end(0)` 将返回无穷大。 | 

### Amazon IVS 特定
<a name="videojs-functions-ivs"></a>

Amazon IVS Video.js 技术具有用于访问特定于 Amazon IVS 功能的行为的附加函数：


| 函数 | 描述 | 
| --- | --- | 
| `getIVSPlayer` | 返回底层 Amazon IVS 播放器实例。完整的 Amazon IVS 播放器 Web API 可通过此实例获得。我们建议尽可能使用基本的 Video.js 播放 API，并仅使用此函数访问 Amazon IVS 特定的功能。您可能需要在 Amazon IVS 播放器实例上访问的最常见函数是 `setQuality()` 和 `addEventListener()` / `removeEventListener()`。 | 
| `getIVSEvents` | 返回一个包含 Amazon IVS 特定枚举的对象。这用于侦听 Amazon IVS 特定错误。有关更多信息，请参阅[Events](#videojs-events)和[错误](#videojs-errors)。 | 

## currentTime
<a name="videojs-currenttime"></a>

获取或设置时间（以秒为单位，从开始算起）。

Amazon IVS：我们不建议为实时流设置当前时间。

### Signatures
<a name="videojs-currenttime-signatures"></a>

```
currentTime
currentTime(time)
```

### 参数
<a name="videojs-currenttime-parameter"></a>


| 参数 | 类型 | 描述 | 
| --- | --- | --- | 
| `time` | 数字 | 如果 `time` 不存在，则获取当前时间。如果 `time` 存在，则将视频播放设置为该时间。 | 

### 返回值
<a name="videojs-currenttime-return"></a>


| 类型 | 描述 | 
| --- | --- | 
| number | 当前时间（以秒为单位，从开始算起）。 | 

## dispose
<a name="videojs-dispose"></a>

删除播放器实例。

Amazon IVS：这也会删除 Amazon IVS 技术后端。

### 签名
<a name="videojs-dispose-signatures"></a>

```
dispose()
```

### 参数
<a name="videojs-dispose-parameter"></a>

无

### 返回值
<a name="videojs-dispose-return"></a>

无

## duration
<a name="videojs-duration"></a>

返回视频的持续时长（以秒为单位）。

Amazon IVS：对于实时流，这将返回 `Infinity`。

### 签名
<a name="videojs-duration-signatures"></a>

```
duration()
```

### 参数
<a name="videojs-duration-parameter"></a>

无

### 返回值
<a name="videojs-duration-return"></a>


| 类型 | 描述 | 
| --- | --- | 
| number | 流的持续时间，以秒为单位。对于实时流，此值为 `Infinity`。 | 

## getIVSEvents
<a name="videojs-getivsevents"></a>

返回一个包含 Amazon IVS 特定枚举的对象。这用于侦听 Amazon IVS 特定的错误和事件。有关更多信息，请参阅：
+ 此文档中的 [Events](#videojs-events) 和 [错误](#videojs-errors)。
+ 有关事件、错误类型和错误源的详细信息，请参阅 [Amazon IVS 回放器 SDK：Web 参考](https://aws.github.io/amazon-ivs-player-docs/1.51.0/web/)。

### 签名
<a name="videojs-getivsevents-signatures"></a>

```
getIVSEvents()
```

### 参数
<a name="videojs-getivsevents-parameter"></a>

无

### 返回值
<a name="videojs-getgetivsevents-return"></a>


| 类型 | 说明 | 
| --- | --- | 
| `object` | 具有 `PlayerEventType`、`PlayerState` 和 `ErrorType` 键的对象，这些键映射到其关联的枚举。 | 

## getIVSPlayer
<a name="videojs-getivsplayer"></a>

返回底层 Amazon IVS 播放器实例。完整的 Amazon IVS 播放器 Web API 可通过此实例获得。我们建议尽可能使用基本的 Video.js 播放 API，并仅使用此函数访问 Amazon IVS 特定的功能。您可能需要在 Amazon IVS 播放器实例上访问的最常见函数是 `setQuality()` 和 `addEventListener()` / `removeEventListener()`。

### 签名
<a name="videojs-getivsplayer-signatures"></a>

```
getIVSPlayer()
```

### 参数
<a name="videojs-getivsplayer-parameter"></a>

无

### 返回值
<a name="videojs-getivsplayer-return"></a>


| 类型 | 描述 | 
| --- | --- | 
| `MediaPlayer` | 已创建的播放器实例。 | 

## 负载
<a name="videojs-load"></a>

开始加载 `src()` 数据。

Amazon IVS：无操作。

### 签名
<a name="videojs-load-signatures"></a>

```
load()
```

### 参数
<a name="videojs-load-parameter"></a>

无

### 返回值
<a name="videojs-load-return"></a>

无

## play
<a name="videojs-play"></a>

播放通过 `src` 调用设置的流。

Amazon IVS：如果实时流已暂停，则播放最新帧的实时流，而不是从暂停的位置继续播放。

### 签名
<a name="videojs-play-signatures"></a>

```
play()
```

### 参数
<a name="videojs-play-parameter"></a>

无

### 返回值
<a name="videojs-play-return"></a>

无

## playbackRate
<a name="videojs-playbackrate"></a>

获取或设置视频播放速率。1.0 表示正常速度；0.5 表示正常速度的一半；2.0 表示正常速度的两倍；依此类推。

Amazon IVS：在实时流上，get 返回 1，并忽略一个集合。

### Signatures
<a name="videojs-playbackrate-signatures"></a>

```
playbackRate
playbackRate(rate)
```

### 参数
<a name="videojs-playbackrate-parameter"></a>


| 参数 | 类型 | 描述 | 
| --- | --- | --- | 
| `rate` | number | 播放速率。有效值：在 [0.25, 2.0] 范围内。 | 

### 返回值
<a name="videojs-playbackrate-return"></a>


| 类型 | 描述 | 
| --- | --- | 
| number | 播放速率。 | 

## seekable
<a name="videojs-seekable"></a>

返回可以搜索到的媒体的 `TimeRanges`。

Amazon IVS：对于实时流，对返回值 (`TimeRange`) 调用 `end(0)` 将返回无穷大。

### 签名
<a name="videojs-seekable-signatures"></a>

```
seekable()
```

### 参数
<a name="videojs-seekable-parameter"></a>

无

### 返回值
<a name="videojs-seekable-return"></a>


| 类型 | 描述 | 
| --- | --- | 
| `TimeRange` | 可用于寻找的媒体的 TimeRange。 | 