创建 DVR 会话

本页介绍了如何使用 Live Stream API 从直播中创建数字视频录像机 (DVR) 会话。您可以在直播期间和直播结束后查看 DVR 会话。

DVR 会话和频道剪辑之间的区别

DVR 会话与频道剪辑(也称为 VOD 剪辑)类似,但存在以下主要区别:

  • DVR 会话:
    • 该 API 会将 DVR 清单保存在与直播片段相同的位置,因此无需额外复制到 Cloud Storage。DVR 清单与直播清单类似,但更长。保留期限到期后,清单会随分段文件一同删除。
    • 您可以为过去、现在和未来的内容创建 DVR 会话。例如,DVR 会话可以跟随直播,您也可以安排 DVR 会话在未来某个时间开始和停止。
    • DVR 会话的典型用例是为直播活动支持 DVR 功能。例如,观看者可以在直播开始一小时后加入直播,并以一小时的延迟时间观看内容(或跳过部分内容)。
  • 频道剪辑:
    • Live Stream API 会将剪辑清单和关联的片段文件复制到用户指定的目录,以便在保留期限结束时不被删除。您可以完全控制剪辑。
    • 只能剪辑过往内容。不支持直播剪辑和安排未来的剪辑。
    • 剪辑的典型用例是归档直播,使直播以 VOD 文件的形式无限期提供。

如需详细了解频道剪辑,请参阅通过直播创建视频点播剪辑

设置您的 Google Cloud 项目和身份验证

如果您尚未创建 Google Cloud 项目和凭据,请参阅开始前须知

创建输入端点

如需创建输入端点,请使用 projects.locations.inputs.create 方法。

在使用任何请求数据之前,请先进行以下替换:

  • PROJECT_NUMBER:您的 Google Cloud 项目编号;此值位于 IAM 设置页面上的项目编号字段中
  • LOCATION:用于创建输入端点的位置;请使用某个受支持的地区
    显示位置
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-south1
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-north1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-west4
  • INPUT_ID:要创建的新输入端点(您将输入数据流发送到该端点)的用户定义标识符。此值必须为 1-63 个字符,以 [a-z0-9] 开头和结尾,并且字符之间可以包含短划线 (-)。例如 my-input

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

{
  "name": "projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_ID",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata",
    "createTime": CREATE_TIME,
    "target": "projects/PROJECT_NUMBER/locations/LOCATION/inputs/INPUT_ID",
    "verb": "create",
    "requestedCancellation": false,
    "apiVersion": "v1"
  },
  "done": false
}

此命令会创建一个长时间运行的操作 (LRO),您可以使用该操作来跟踪请求的进度。如需了解详情,请参阅管理长时间运行的操作

获取输入端点详情

如需获取输入端点的详细信息,请使用 projects.locations.inputs.get 方法。

在使用任何请求数据之前,请先进行以下替换:

  • PROJECT_NUMBER:您的 Google Cloud 项目编号;此值位于 IAM 设置页面上的项目编号字段中
  • LOCATION:输入端点所在的位置;请使用某个受支持的地区
    显示位置
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-south1
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-north1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-west4
  • INPUT_ID:输入端点的用户定义标识符

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

{
  "name": "projects/PROJECT_NUMBER/locations/LOCATION/inputs/INPUT_ID",
  "createTime": CREATE_TIME,
  "updateTime": UPDATE_TIME,
  "type": "RTMP_PUSH",
  "uri":  "INPUT_STREAM_URI", # For example, "rtmp://1.2.3.4/live/b8ebdd94-c8d9-4d88-a16e-b963c43a953b",
  "tier": "HD"
}

找到 uri 字段,然后复制返回的 INPUT_STREAM_URI,以便稍后在发送输入测试流部分中使用。

创建频道

如需创建渠道,请使用 projects.locations.channels.create 方法。以下示例会创建一个用于生成 HLS 直播的频道。直播包含单个高清 (1280x720) 呈现方式。

如需启用 DVR 会话的创建,请将 retentionConfig 对象添加到渠道配置中。

"retentionConfig": {
  "retentionWindowDuration": {
      "seconds": 86400
    }
},

为直播频道启用保留功能后,系统会保留直播片段和清单,以便创建 DVR 会话。retentionWindowDuration 对象用于指定直播输出在上传到 Cloud Storage 后保存的时长。保留期限从在 Cloud Storage 中创建数据段时开始。

保留期不得超过 30 天。保留期限过后,片段文件、直播清单和 DVR 清单会自动从 Cloud Storage 中删除。您无法使用已删除的片段创建 DVR 会话。删除过程是异步的,最长可能需要 24 小时才能完成。

为清单指定一个,以启用 DVR 会话创建。您在实际创建会话时会引用此键。仅支持 HLS 清单。

"manifests": [
{
  ...
  "key": "manifest_hls"
}

在使用任何请求数据之前,请先进行以下替换:

  • PROJECT_NUMBER:您的 Google Cloud 项目编号;此值位于 IAM 设置页面上的项目编号字段中
  • LOCATION:要创建渠道的营业地点;请使用某个受支持的地区
    显示位置
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-south1
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-north1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-west4
  • CHANNEL_ID:要创建的渠道的用户定义标识符;此值必须为 1-63 个字符,以 [a-z0-9] 开头和结尾,并且字符之间可以包含短划线 (-)
  • INPUT_ID:输入端点的用户定义标识符
  • BUCKET_NAME:您创建的用于存储直播清单和片段文件的 Cloud Storage 存储桶的名称

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

{
  "name": "projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_ID",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata",
    "createTime": CREATE_TIME,
    "target": "projects/PROJECT_NUMBER/locations/LOCATION/channels/CHANNEL_ID",
    "verb": "create",
    "requestedCancellation": false,
    "apiVersion": "v1"
  },
  "done": false
}

此命令会创建一个长时间运行的操作 (LRO),您可以使用该操作来跟踪请求的进度。如需了解详情,请参阅管理长时间运行的操作

启动频道

如需启动通道,请使用 projects.locations.channels.start 方法。

在使用任何请求数据之前,请先进行以下替换:

  • PROJECT_NUMBER:您的 Google Cloud 项目编号;此值位于 IAM 设置页面上的项目编号字段中
  • LOCATION:频道所在的位置;请使用某个受支持的地区
    显示位置
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-south1
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-north1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-west4
  • CHANNEL_ID:用户定义的渠道标识符

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

{
  "name": "projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_ID",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata",
    "createTime": CREATE_TIME,
    "target": "projects/PROJECT_NUMBER/locations/LOCATION/channels/CHANNEL_ID",
    "verb": "start",
    "requestedCancellation": false,
    "apiVersion": "v1"
  },
  "done": false
}

此命令会创建一个长时间运行的操作 (LRO),您可以使用该操作来跟踪请求的进度。如需了解详情,请参阅管理长时间运行的操作

发送输入测试流

打开一个新终端窗口。使用获取输入端点详情部分中的 INPUT_STREAM_URI 运行以下命令:

ffmpeg -re -f lavfi -i "testsrc=size=1280x720 [out0]; sine=frequency=500 [out1]" \
  -acodec aac -vcodec h264 -f flv INPUT_STREAM_URI

创建 DVR 会话

如需创建 DVR 会话,请使用 projects.locations.channels.dvrSessions.create 方法。

使用 dvrManifests 数组中的 manifestKey 字段指定要从中保存内容的清单。在本页上的示例渠道配置中,此键设置为 manifest_hls

您可以通过向 dvrWindows 数组添加 timeInterval 对象,将直播中的多个时间段合并到单个 DVR 会话中。

"dvrManifests": [
  {
    "manifestKey": "manifest_hls"
  }
],
"dvrWindows": [
  {
    "timeInterval": {
      "startTime": "2022-07-08T23:03:20.000Z",
      "endTime": "2022-07-08T23:04:20.000Z"
    }
  },
  {
    "timeInterval": {
      "startTime": "2022-07-08T23:05:20.000Z",
      "endTime": "2022-07-08T23:06:20.000Z"
    }
  }
]

请注意以下几点:

  • 每个 DVR 会话都必须在 dvrWindows 中包含至少一个 timeInterval
  • dvrManifests.manifestKey 字段必须引用 DVR 会话父级频道中定义的 HLS 清单。如果 DVR 会话创建请求成功,则 dvrManifests.outputUri 字段中会返回生成的 DVR 清单的 URI。此 URI 位于渠道的 outputUri 字段指定的路径中。
  • dvrManifests 数组每个请求仅支持一个清单。如果您想为同一 DVR 窗口生成多个清单,则需要将清单拆分为多个 DVR 会话。
  • 一组 timeInterval 对象不得重叠,且必须按时间顺序排列。每个 timeInterval 中的 startTime 都必须早于 endTime
  • startTimeendTime 是指直播时间轴。如果为清单启用了嵌入式时间码,此时间轴将基于输入串流中提供的嵌入式时间码,并且可能与挂钟时间不同。
  • DVR 时间范围的总时长上限为 24 小时。
  • dvrWindows 中最后一个 timeIntervalendTime 可以留空。在这种情况下,系统会自动计算 endTime,以最大限度地延长 DVR 会话时长(即总时长为 24 小时)。
  • DVR 时间范围可以涵盖任何时间范围,包括未来的时间范围。不过,dvrWindows 延伸到未来时间的 DVR 会话数量上限为 1 个。
  • 如果所有 DVR 时间范围都完全在过去,则 DVR 会话数量不受限制。

在使用任何请求数据之前,请先进行以下替换:

  • PROJECT_NUMBER:您的 Google Cloud 项目编号;此值位于 IAM 设置页面上的项目编号字段中
  • LOCATION:频道所在的位置;请使用某个受支持的地区
    显示位置
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-south1
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-north1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-west4
  • CHANNEL_ID:用户定义的渠道标识符
  • DVR_SESSION_ID:DVR 会话的用户定义标识符
  • INTERVAL_START_TIME:原始直播流清单中的标记时间(与 Unix 计时原点之间相隔的时间);使用 RFC3339 UTC“Zulu”格式的时间戳(例如 2014-10-02T15:01:23Z
  • INTERVAL_END_TIME:原始直播流清单中的标记时间戳(Unix 纪年时间戳);使用 RFC3339 UTC“Zulu”格式的时间戳(例如 2014-10-02T15:01:23Z

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

{
  "name": "projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_ID",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata",
    "createTime": CREATE_TIME,
    "target": "projects/PROJECT_NUMBER/locations/LOCATION/channels/CHANNEL_ID/dvrSessions/DVR_SESSION_ID",
    "verb": "create",
    "requestedCancellation": false,
    "apiVersion": "v1"
  },
  "done": false
}

此命令会创建一个长时间运行的操作 (LRO),您可以使用该操作来跟踪请求的进度。如需了解详情,请参阅管理长时间运行的操作

获取 DVR 会话

如需获取 DVR 会话,请使用 projects.locations.channels.dvrSessions.get 方法。

在使用任何请求数据之前,请先进行以下替换:

  • PROJECT_NUMBER:您的 Google Cloud 项目编号;此值位于 IAM 设置页面上的项目编号字段中
  • LOCATION:频道所在的位置;请使用某个受支持的地区
    显示位置
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-south1
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-north1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-west4
  • CHANNEL_ID:用户定义的渠道标识符
  • DVR_SESSION_ID:DVR 会话的用户定义标识符

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

{
  "name": "projects/PROJECT_NUMBER/locations/LOCATION/channels/CHANNEL_ID/dvrSessions/DVR_SESSION_ID",
  "createTime": CREATE_TIME,
  "startTime": START_TIME,
  "updateTime": UPDATE_TIME,
  "state": "SUCCEEDED",
  "dvrManifests": [
    {
      "manifestKey": "manifest_hls",
      "outputUri": "gs://BUCKET_NAME/dvr/DVR_SESSION_ID/main.m3u8"
    }
  ],
  "dvrWindows": [
    {
      "timeInterval": {
        "startTime": "INTERVAL_START_TIME",
        "endTime": "INTERVAL_END_TIME"
      }
    }
  ]
}

响应应包含一个 state 字段,用于指示会话状态:

{
  ...
  "state": "PENDING" // DVR session is waiting to be processed (for example, it is waiting for the channel to start)
  ...
}

如需查看状态及其说明的列表,请参阅 state 参考文档。

验证存储桶内容

打开 DVR 会话的 dvrManifests.outputUri 字段中指定的 Cloud Storage 存储桶。确认该文件包含以下文件和目录:

  • DVR 会话的顶级清单,其名称与频道配置中指定的 manifests.fileName 相同(例如 main.m3u8)。您可以使用在线媒体播放器播放此清单。
  • 频道中指定的每个 muxStreams.key 对应的子目录(例如 mux_video_ts)。每个子目录都包含 DVR 会话的播放列表(例如 index-1.m3u8)。

播放 DVR 会话

如需在 Shaka Player 中播放生成的媒体文件,请完成以下步骤:

  1. 请将 Cloud Storage 存储分区设为可公开读取
  2. 如需在 Cloud Storage 存储分区上启用跨域资源共享 (CORS),请执行以下操作:
    1. 创建一个包含以下代码的 JSON 文件:
      [
        {
          "origin": ["https://shaka-player-demo.appspot.com/"],
          "responseHeader": ["Content-Type", "Range"],
          "method": ["GET", "HEAD"],
          "maxAgeSeconds": 3600
        }
      ]
    2. JSON_FILE_NAME 替换为您在上一步中创建的 JSON 文件的名称,然后运行以下命令:
      gcloud storage buckets update gs://BUCKET_NAME --cors-file=JSON_FILE_NAME.json
  3. 在 Cloud Storage 存储桶中,找到生成的文件。在该文件的公开访问权限列中,点击复制网址
  4. 导航到在线直播播放器 Shaka Player
  5. 点击顶部导航栏中的自定义内容
  6. 点击 + 按钮。
  7. 将文件的公开网址粘贴到清单网址框中。

  8. 名称框中输入一个名称。

  9. 点击保存

  10. 点击播放

您应该会看到作为直播呈现的测试流。

测试图案视频

广告插播时间点事件

如果您为直播创建了广告插播时间点活动,DVR 会话将包含直播中显示的广告片段。