从直播中制作视频点播剪辑

本页介绍了如何使用 Live Stream API 从直播中创建点播视频 (VOD) 剪辑。VOD 剪辑由 HLS 清单文件组成 以及从直播活动中保存的片段文件仅支持 HLS 清单。

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

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

创建输入端点

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

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

  • PROJECT_NUMBER:您的 Google Cloud 项目 编号;此编号位于 API 单元上的项目编号字段中 IAM 设置页面
  • LOCATION:创建输入的位置 endpoint;请使用某个受支持的区域
    显示位置
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • 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 项目 编号;此编号位于 API 单元上的项目编号字段中 IAM 设置页面
  • LOCATION:输入端点所在的位置 located;请使用某个受支持的区域
    显示营业地点
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • 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) 版本。

要启用创建 VOD 剪辑的功能,请将 retentionConfig 对象添加到渠道配置。

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

为直播频道启用保留功能后,系统会保留片段和清单文件,以便制作 VOD 剪辑。通过 retentionWindowDuration 对象指定 直播输出上传到 Cloud Storage保留期从细分受众群的 在 Cloud Storage 中创建的保留期不得超过 30 天。 保留期限过后,系统会自动从 Cloud Storage 中删除相应片段。无法使用已删除的片段创建 VOD 剪辑。删除过程是异步的,最长可能需要 24 小时才能完成。

为清单指定一个键,以启用 VOD 剪辑创建功能。您可以在实际创建剪辑时引用此键。仅支持 HLS 清单。

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

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

  • PROJECT_NUMBER:您的 Google Cloud 项目 编号;此编号位于 API 单元上的项目编号字段中 IAM 设置页面
  • LOCATION:要在其中创建 channel;请使用某个受支持的区域
    显示营业地点
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-west4
  • CHANNEL_ID:用户定义的渠道标识符 create;此值必须为 1-63 个字符,以 [a-z0-9] 开头和结尾,并且 字符之间可以包含短划线 (-)
  • INPUT_ID:用户定义的 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 项目 编号;此编号位于 API 单元上的项目编号字段中 IAM 设置页面
  • LOCATION:频道所在的位置;请使用某个受支持的地区
    显示位置
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • 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

创建 VOD 片段

如需创建 VOD 剪辑,请使用 projects.locations.channels.clips.create 方法。

使用 outputUri 字段指定要将剪辑和剪辑清单文件保存在 Cloud Storage 中的具体位置。您可以使用 为直播清单创建的存储桶或其他存储桶。您可以 还会在存储桶名称后附加目录名称(例如, my-bucket/vod-clip)。

使用 clipManifests 数组中的 manifestKey 字段指定要保存剪辑的清单。在此页面上的示例频道配置中,以下代码 键已设置为 manifest_hls

你可以将直播的多个时段合并为一个片段 将 timeSlice 对象添加到 slices 数组。

"outputUri": "gs://my-bucket",
"clipManifests":[
  {
    "manifestKey": "manifest_hls"
  }
],
"slices":[
  {
    "timeSlice": {
      "markinTime": "2022-07-08T23:03:20.000Z",
      "markoutTime": "2022-07-08T23:04:20.000Z"
    }
  },
  {
    "timeSlice": {
      "markinTime": "2022-07-08T23:05:20.000Z",
      "markoutTime": "2022-07-08T23:06:20.000Z"
    }
  }
]

请注意以下几点:

  • 每个剪辑都必须在 slices 中包含至少一个 timeSlice
  • clipManifests.manifestKey 字段必须引用剪辑父频道中定义的 HLS 清单。如果创建剪辑作业 请求成功后,系统就会在以下位置返回生成的剪辑清单的 URI: clipManifests.outputUri 字段。此 URI 位于剪辑的 outputUri 字段指定的路径中。
  • clipManifests 数组每个请求仅支持一个清单。如果您想为同一剪辑作业生成多个清单,则需要将清单拆分为多个剪辑作业请求。
  • 剪辑片段必须是同质的;每个元素都必须是 timeSlice 类型。
  • 一组 timeSlice 对象不得重叠,且必须按时间顺序排列。每个 timeSlice 中的 markinTime 都必须早于 markoutTime
  • 如果剪辑的最新 markinTime 早于频道开始时间或留存期开始时间,则标记时间设置为这两个时间中的较晚者。
  • 如果剪辑的最新 markoutTime 晚于 频道停止时间,则设置为频道停止时间。如果剪辑的最新 markoutTime 晚于当前系统壁挂时钟时间,则将其设置为 API 实际启动剪辑任务的时间。
  • 剪辑的时长上限为 24 小时。

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

  • 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-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-west4
  • CHANNEL_ID:用户定义的频道标识符
  • CLIP_ID:视频点播剪辑的用户定义标识符
  • MARK_IN_TIME:标记中的 Unix 纪元时间 原始直播清单;使用 RFC3339 世界协调时间 (UTC)(即“祖鲁时”)中的时间戳格式(例如, 2014-10-02T15:01:23Z)
  • MARK_OUT_TIME:原始直播流清单中的标记时间戳(Unix 纪年时间戳);使用 RFC3339 UTC“Zulu”格式的时间戳(例如 2014-10-02T15:01:23Z
  • BUCKET_NAME:Cloud Storage 的名称 您创建的存储桶,用于保存 VOD 剪辑清单和片段文件;您可以使用同一个存储桶 您为直播清单或其他存储桶创建的;还可以将一个目录 name 更改为存储桶名称(例如 my-bucket/vod-clip

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

您应该收到类似以下内容的 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/clips/CLIP_ID",
    "verb": "create",
    "requestedCancellation": false,
    "apiVersion": "v1"
  },
  "done": false
}

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

获取 VOD 片段

如需获取 VOD 剪辑,请使用 projects.locations.channels.clips.get 方法。

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

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

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

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

{
  "name": "projects/PROJECT_NUMBER/locations/LOCATION/channels/CHANNEL_ID/clips/CLIP_ID",
  "createTime": CREATE_TIME,
  "startTime": START_TIME,
  "updateTime": UPDATE_TIME,
  "state": "SUCCEEDED",
  "outputUri": "gs://BUCKET_NAME",
  "slices": [
    {
      "timeSlice": {
        "markinTime": "MARK_IN_TIME",
        "markoutTime": "MARK_OUT_TIME"
      }
    }
  ],
  "features": {},
  "clipManifests": [
    {
      "manifestKey": "manifest_hls",
      "outputUri": "gs://BUCKET_NAME/main.m3u8"
    }
  ]
}

生成的清单位于 clipManifests.outputUri 字段中指定的 URI 中。清单 文件名与父渠道的文件名相同, manifests.fileName 字段值。

响应应包含以下内容:

{
  ...
  "state": "SUCCEEDED"
  ...
}

只能提供每个频道最近的 1000 条剪辑作业记录 使用 projects.locations.channels.clips.get 方法。超过此限制的所有剪辑作业记录都将被移除。您必须管理 outputUri 指定的生成的剪辑文件;Live Stream API 不会从 Cloud Storage 中删除这些文件。

验证存储桶内容

打开该剪辑的 outputUri 字段。验证该文件夹是否包含以下文件和目录:

  • 剪辑的顶级清单,其名称与频道配置中指定的 manifests.fileName 相同(例如 main.m3u8);您可以使用在线媒体播放器播放此清单
  • 每个 muxStreams.key(在 渠道(例如 mux_video_ts
    • 剪辑的播放列表(例如 index-1.m3u8
    • 使用 YYYYMMDDTHHMMSSZ 格式(例如 20220708T203309Z/)命名的目录;此目录用于存储 VOD 剪辑片段
      • 构成 VOD 剪辑的多个片段 segment-number.ts 文件

播放 VOD 片段

如需在 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. 点击播放

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

测试图案视频

广告插播时间点和广告信息板事件

如果您 为直播创建了广告插播时间点事件,VOD 剪辑 将不会包含广告。该 API 会生成一个播放列表,其中广告插播点会替换为以下代码:

#EXT-X-CUE-OUT: AD_BREAK_DURATION
#EXT-X-CUE-IN

在 VOD 剪辑开头或末尾显示的可选广告 已移除。在直播中显示且被直播内容环绕的片头片尾信息会保留在生成的视频点播剪辑中。