本页介绍了如何使用 Live Stream API 从直播中创建视频点播 (VOD) 剪辑。VOD 剪辑由从直播中保存的 HLS 清单文件和片段文件组成。仅支持 HLS 清单。
设置您的 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-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 项目编号;这可以在 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
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 项目编号;这可以在 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
:用户定义的要创建的频道标识符;此值必须为 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-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 清单。如果剪辑作业创建请求成功,系统会在clipManifests.outputUri
字段中返回生成的剪辑清单的 URI。此 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
:VOD 剪辑的用户定义标识符MARK_IN_TIME
:原始直播清单中的标记 Unix 纪元时间;使用采用 RFC3339 世界协调时间 (UTC)(即“祖鲁时”)格式的时间戳(例如2014-10-02T15:01:23Z
)MARK_OUT_TIME
:原始直播清单中的标记 Unix 纪元时间;使用采用 RFC3339 世界协调时间 (UTC)(即“祖鲁时”)格式的时间戳(例如2014-10-02T15:01:23Z
)BUCKET_NAME
:您为了保存 VOD 剪辑清单和片段文件而创建的 Cloud Storage 存储桶的名称;您可以使用为直播清单创建的同一存储桶或其他存储桶;您还可以将目录名称附加到存储桶名称中(例如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 项目编号;这可以在 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
:VOD 剪辑的用户定义标识符
如需发送您的请求,请展开以下选项之一:
您应该收到类似以下内容的 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"
...
}
使用 projects.locations.channels.clips.get
方法只能显示每个频道最近的 1000 条剪辑作业记录。超过此限制的所有剪辑作业记录都将被移除。您必须管理由 outputUri
指定的生成的剪辑文件;Live Stream API 不会从 Cloud Storage 中删除这些文件。
验证存储桶内容
打开该剪辑的 outputUri
字段中指定的 Cloud Storage 存储桶。验证它是否包含以下文件和目录:
- 该剪辑的顶级清单,其名称与频道配置中指定的
manifests.fileName
(例如main.m3u8
)相同;您可以使用在线媒体播放器播放此清单 - 渠道中指定的每个
muxStreams.key
的目录(例如mux_video_ts
)- 相应剪辑的播放列表(例如,
index-1.m3u8
) - 使用
YYYYMMDDTHHMMSSZ
格式命名的目录(例如20220708T203309Z/
);此目录包含 VOD 片段片段- 构成 VOD 剪辑的多个片段
segment-number.ts
文件
- 构成 VOD 剪辑的多个片段
- 相应剪辑的播放列表(例如,
播放 VOD 片段
如需在 Shaka Player 中播放生成的媒体文件,请完成以下步骤:
- 请将 Cloud Storage 存储桶设为可公开读取。
- 如需在 Cloud Storage 存储桶上启用跨域资源共享 (CORS),请执行以下操作:
- 创建一个包含以下内容的 JSON 文件:
[ { "origin": ["https://shaka-player-demo.appspot.com/"], "responseHeader": ["Content-Type", "Range"], "method": ["GET", "HEAD"], "maxAgeSeconds": 3600 } ]
-
将 JSON_FILE_NAME 替换为您在上一步中创建的 JSON 文件的名称,然后运行以下命令:
gsutil cors set JSON_FILE_NAME.json gs://BUCKET_NAME
- 创建一个包含以下内容的 JSON 文件:
- 在 Cloud Storage 存储桶中找到生成的文件。在该文件的公开访问权限列中,点击复制网址。
- 导航到在线直播播放器 Shaka Player。
- 点击顶部导航栏中的自定义内容。
- 点击 + 按钮。
将文件的公开网址粘贴到清单网址框中。
在名称框中输入一个名称。
点击保存。
点击播放。
您应该会看到作为直播呈现的测试流。
广告插播时间点和可选广告事件
如果您为直播创建了广告插播时间点事件,则 VOD 剪辑不会包含广告。该 API 会生成播放列表,其中广告断点会替换为以下标记:
#EXT-X-CUE-OUT: AD_BREAK_DURATION
#EXT-X-CUE-IN
系统会自动移除在 VOD 剪辑开头或末尾显示的可选广告。视频流中出现的可选广告会被直播内容所环绕,并会保留在生成的 VOD 片段中。