# 创建播放会话

了解如何通过身份验证调用接口，并按 DRM-X Universal Playback Session Contract 处理响应。后端使用可信的 Content IDs 请求具有明确有效期和适用范围的播放授权。

播放授权的流程

您的后端决定谁可以观看。DRM-X 提供播放授权，播放器使用该授权请求 DRM 许可证。

- 01**观看用户**

登录您的服务并请求播放视频。

- 02**您的后端**

检查用户的购买记录、订阅状态或其他观看权限。

- 03**DRM-X**

应用所选播放规则，返回播放配置和授权信息。

- 04**播放器**

使用返回的授权信息，请求播放所需的 DRM 许可证。

您的后端决定访问; DRM-X 执行已签名的政策。 加密的媒体和DRM 许可证会遵循不同的传送路径 。

API 

## 创建通用播放会话[#](#create-a-universal-playback-session)



```
POST https://api6.drm-x.com/api/v1/playback/environments/{siteId}/sessions
Accept: application/json
Content-Type: application/json
X-DRMX-Client-Id: {siteKey}
X-DRMX-Client-Secret: {accessKey}
```



```
{
  "contentId": "course-12-lesson-4",
  "contentType": "vod",
  "drmSystem": "widevine",
  "subject": "customer-user-1001",
  "sessionId": "new-unpredictable-id-per-playback",
  "playbackMode": "streaming",
  "licensePolicyTemplate": "multi-tier-standard",
  "useEnvironmentDefaults": true,
  "applicationId": "customer-web",
  "platformCapabilities": {
    "clientPlatform": "web",
    "drmSystems": ["widevine"],
    "manifestTypes": ["dash"],
    "maximumHeight": 2160,
    "persistentState": false,
    "sdkVersion": "1.2.0-preview.6"
  }
}
```



成功的 Contract v1 响应包含服务器选定的 Manifest、可用的其他 Manifest 版本、对应 DRM 的许可证 URL、短期有效的 DRM License Token 或客户代理授权、会话释放路径、允许的最高视频高度及轨道列表。返回响应时应设置 `Cache-Control: no-store`。



每次实际发起播放时使用独立且不可预测的会话 ID。跨设备复用同一个 ID 会使并发播放计数失效。





## 身份认证与可信请求字段[#](#authentication-and-trusted-request-fields)

由后端使用具备 `license-tokens:create` 权限的项目 API 客户端调用此 API，并将环境 UUID 作为 `siteId`。已登录用户调用您的接口，再由您的接口提供以下可信字段。

| 字段 | 含义 | 集成规则 | 
| --- | --- | --- |

| `contentId` | 已发布内容的标识 | 完成观看权限检查后，从可信内容目录中取得。 | 

| `subject` | 稳定的用户标识 | 从已认证的服务器会话中取得，不采用客户端提交的用户 ID。 | 

| `drmSystem` | `widevine`, `playready`, `fairplay`,或 `wiseplay` | 根据播放器能力选择匹配的 DRM 系统。 | 

| `sessionId` | 本次播放尝试的唯一标识 | 为每次尝试生成新的不可预测的值 。 | 

| `contentType` | `vod` 或 `live` | 使用已注册的内容类型 。 | 

| `playbackMode` | Contract v1 中的 `streaming` | 离线播放需要后续扩展接口契约后才能支持。 | 

| `licensePolicyTemplate` / `licensePolicy` | 命名策略模板或自定义策略 | 在服务器端选择其中一种，不要同时提供两种。参见[策略规则](https://docs.drm-x.com/zh-Hans/license-service/policies)。 | 

| `platformCapabilities` | 平台、DRM 系统、Manifest 类型及设备信息 | 新集成应明确发送客户端能力信息。这些信息用于描述客户端，不能覆盖许可证策略。 | 



## 读取并使用响应中的描述字段[#](#consume-the-response-descriptors)

使用 Contract v1 的嵌套描述字段。不要自行猜测许可证 URL，也不要用播放器输入替换已注册的 Manifest URL。

| 响应字段 | 使用方法 | 
| --- | --- |

| `contractVersion` | 确认您的集成支持响应中的接口契约版本。 | 

| `manifestUrl` / `manifestUrls` | 加载服务器选定的 Manifest，或响应中提供的兼容版本。 | 

| `expiresAt` | 本次授权的过期时间。 | 

| `drm` | 读取 `system`、`licenseServerUrl`、`drmLicenseToken`、`tokenType` 及可选的 `fairPlayCertificateUrl`。客户 Token 代理可使用自己管理的、具有明确限制的会话替代面向浏览器的原始授权。 | 

| `release` | 播放结束时，使用其中的 `url`、`method` 和 `authorizationScheme` 释放会话。 | 

| `policy` | 遵循 `maximumHeight` 和 `allowedTrackTypes` 的限制。DRM 提供方仍会执行已签名的策略。 | 

| `tracks` | 读取音轨和字幕语言选择能力，以及所使用的语言标签标准。 | 

向播放器返回响应时设置 `Cache-Control: no-store`。不得将项目 Access Key 发送到浏览器。仅向响应指定的许可证和证书路径附加授权请求头。



## 处理错误并释放并发播放名额[#](#handle-errors-and-release-reservations)

检查 HTTP 状态和机器可读的 `code`。保留 `requestId` 以便排查，并遵循 `retryable`。如果用户无权观看或策略无效，应先修正权限判断或策略，不要反复重试。详见[播放会话错误参考](https://docs.drm-x.com/zh-Hans/api-reference/errors)。

停止播放、更换视频、发生不可恢复错误或关闭应用时，释放占用的并发播放名额。重新发起播放时使用新的会话 ID。

<!-- Canonical: https://docs.drm-x.com/zh-Hans/api-reference/playback-sessions -->
<!-- Language: zh-Hans -->
