本页介绍如何将多个输入视频合并为一个输出视频。您还可以剪辑输入视频的时间轴。
对于每个输入视频,向 inputs
数组添加 Input
对象。每个 Input
对象都为关联的输入视频定义键和 URI。您可以向 Input
添加可选的 PreprocessingConfig
对象,以对输入视频执行剪裁、填充,或其他预处理操作。inputs
数组未排序;您可以按任意顺序添加输入视频。
要向输出视频时间轴添加输入视频,请向 editList
数组添加 EditAtom
对象。editList
数组已排序。该数组中指定的第一个输入将首先用于输出视频,第二个输入将用于下一个,依此类推。您可以通过输入视频的键来识别输入视频。
您还可以指定 startTimeOffset
和 endTimeOffset
来剪辑输入视频。这些字段是可选字段。如果您未指定这些字段,系统将使用整个输入视频。
以下配置将两个输入视频串联为一个输出视频。
"inputs": [
{
"key": "input1",
"uri": "gs://STORAGE_BUCKET_NAME/STORAGE_INPUT_VIDEO1"
},
{
"key": "input2",
"uri": "gs://STORAGE_BUCKET_NAME/STORAGE_INPUT_VIDEO2"
}
],
"editList": [
{
"key": "atom1",
"inputs": [
"input1"
],
"startTimeOffset": "START_TIME_OFFSET1s",
"endTimeOffset": "END_TIME_OFFSET1s"
},
{
"key": "atom2",
"inputs": [
"input2"
],
"startTimeOffset": "START_TIME_OFFSET2s",
"endTimeOffset": "END_TIME_OFFSET2s"
}
],
您可以将此配置添加到作业模板中,也可以将其添加到临时作业配置中。
REST
在使用任何请求数据之前,请先进行以下替换:
PROJECT_ID
:IAM 设置中列出的 Google Cloud 项目 ID。LOCATION
:运行作业的位置。请使用其中一个受支持的区域。显示位置us-central1
us-west1
us-west2
us-east1
us-east4
southamerica-east1
northamerica-northeast1
asia-east1
asia-northeast1
asia-northeast3
asia-south1
asia-southeast1
australia-southeast1
europe-west1
europe-west2
europe-west4
STORAGE_BUCKET_NAME
:您创建的 Cloud Storage 存储桶的名称。STORAGE_INPUT_VIDEO1
:您要对其进行转码的 Cloud Storage 存储桶中的视频的名称,例如my-vid.mp4
。此字段应考虑您在存储桶中创建的任何文件夹(例如input/my-vid.mp4
)。此视频将首先用于输出视频时间轴。START_TIME_OFFSET1
:相对于第一个输入视频时间轴的开始时间,以小数秒(例如0.0
)为单位。使用此字段可从视频开头剪辑内容。END_TIME_OFFSET1
:相对于第一个输入视频时间轴的结束时间,以小数秒为单位(例如8.1
)。使用此字段可从视频末尾剪辑内容。STORAGE_INPUT_VIDEO2
:您要对其进行转码的 Cloud Storage 存储桶中的视频的名称,例如my-vid.mp4
。此字段应考虑您在存储桶中创建的任何文件夹(例如input/my-vid.mp4
)。此视频将在输出视频时间轴中第二个使用。START_TIME_OFFSET2
:相对于第二个输入视频时间轴的开始时间,以小数秒(例如3.5
)为单位。使用此字段可从第二个视频的开头剪辑内容。END_TIME_OFFSET2
:相对于第二个输入视频时间轴的结束时间,以小数秒为单位(例如15
)。使用此字段可从第二个视频的末尾剪辑内容。STORAGE_OUTPUT_FOLDER
:您要在其中保存已编码视频输出的 Cloud Storage 文件夹名称。
如需发送您的请求,请展开以下选项之一:
您应该收到类似以下内容的 JSON 响应:
{ "name": "projects/PROJECT_NUMBER/locations/LOCATION/jobs/JOB_ID", "config": { ... }, "state": "PENDING", "createTime": CREATE_TIME, "ttlAfterCompletionDays": 30 }
gcloud
- 创建一个定义作业字段的
request.json
文件。 对gcloud
命令进行以下替换:- LOCATION:运行作业的位置。请使用其中一个受支持的区域。显示位置
us-central1
us-west1
us-west2
us-east1
us-east4
southamerica-east1
northamerica-northeast1
asia-east1
asia-northeast1
asia-northeast3
asia-south1
asia-southeast1
australia-southeast1
europe-west1
europe-west2
europe-west4
- STORAGE_BUCKET_NAME:您创建的 Cloud Storage 存储桶的名称。
- STORAGE_INPUT_VIDEO1:您要对其进行转码的 Cloud Storage 存储桶中的视频的名称,例如
my-vid.mp4
。此字段应考虑您在存储桶中创建的任何文件夹(例如input/my-vid.mp4
)。此视频将首先用于输出视频时间轴。 - START_TIME_OFFSET1:相对于第一个输入视频时间轴的开始时间,以小数秒(例如
0.0
)为单位。使用此字段可从视频开头剪辑内容。 - END_TIME_OFFSET1:相对于第一个输入视频时间轴的结束时间,以小数秒为单位(例如
8.1
)。使用此字段可从视频末尾剪辑内容。 - STORAGE_INPUT_VIDEO2:您要对其进行转码的 Cloud Storage 存储桶中的视频的名称,例如
my-vid.mp4
。此字段应考虑您在存储桶中创建的任何文件夹(例如input/my-vid.mp4
)。此视频将在输出视频时间轴中第二个使用。 - START_TIME_OFFSET2:相对于第二个输入视频时间轴的开始时间,以小数秒(例如
3.5
)为单位。使用此字段可从第二个视频的开头剪辑内容。 - END_TIME_OFFSET2:相对于第二个输入视频时间轴的结束时间,以小数秒为单位(例如
15
)。使用此字段可从第二个视频的末尾剪辑内容。 - STORAGE_OUTPUT_FOLDER:您要在其中保存已编码视频输出的 Cloud Storage 文件夹名称。
{ "config": { "inputs": [ { "key": "input1", "uri": "gs://STORAGE_BUCKET_NAME/STORAGE_INPUT_VIDEO1" }, { "key": "input2", "uri": "gs://STORAGE_BUCKET_NAME/STORAGE_INPUT_VIDEO2" } ], "editList": [ { "key": "atom1", "inputs": [ "input1" ], "startTimeOffset": "START_TIME_OFFSET1s", "endTimeOffset": "END_TIME_OFFSET1s" }, { "key": "atom2", "inputs": [ "input2" ], "startTimeOffset": "START_TIME_OFFSET2s", "endTimeOffset": "END_TIME_OFFSET2s" } ], "elementaryStreams": [ { "key": "video-stream0", "videoStream": { "h264": { "heightPixels": 360, "widthPixels": 640, "bitrateBps": 550000, "frameRate": 60 } } }, { "key": "audio-stream0", "audioStream": { "codec": "aac", "bitrateBps": 64000 } } ], "muxStreams": [ { "key": "sd", "container": "mp4", "elementaryStreams": [ "video-stream0", "audio-stream0" ] } ], "output": { "uri": "gs://STORAGE_BUCKET_NAME/STORAGE_OUTPUT_FOLDER/" } } }
- LOCATION:运行作业的位置。请使用其中一个受支持的区域。
- 运行以下命令:
您应该会看到如下所示的响应:gcloud transcoder jobs create --location=LOCATION --file="request.json"
{ "name": "projects/PROJECT_NUMBER/locations/LOCATION/jobs/JOB_ID", "config": { ... }, "state": "PENDING", "createTime": CREATE_TIME, "ttlAfterCompletionDays": 30 }
C#
在试用此示例之前,请按照 Transcoder API 快速入门:使用客户端库中的 C# 设置说明进行操作。 如需了解详情,请参阅 Transcoder API C# API 参考文档。
如需向 Transcoder API 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
Go
在试用此示例之前,请按照 Transcoder API 快速入门:使用客户端库中的 Go 设置说明进行操作。 如需了解详情,请参阅 Transcoder API Go API 参考文档。
如需向 Transcoder API 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
Java
在试用此示例之前,请按照 Transcoder API 快速入门:使用客户端库中的 Java 设置说明进行操作。 如需了解详情,请参阅 Transcoder API Java API 参考文档。
如需向 Transcoder API 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
Node.js
在试用此示例之前,请按照 Transcoder API 快速入门:使用客户端库中的 Node.js 设置说明进行操作。 如需了解详情,请参阅 Transcoder API Node.js API 参考文档。
如需向 Transcoder API 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
PHP
在试用此示例之前,请按照 Transcoder API 快速入门:使用客户端库中的 PHP 设置说明进行操作。 如需了解详情,请参阅 Transcoder API PHP API 参考文档。
如需向 Transcoder API 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
Python
在试用此示例之前,请按照 Transcoder API 快速入门:使用客户端库中的 Python 设置说明进行操作。 如需了解详情,请参阅 Transcoder API Python API 参考文档。
如需向 Transcoder API 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
Ruby
在试用此示例之前,请按照 Transcoder API 快速入门:使用客户端库中的 Ruby 设置说明进行操作。 如需了解详情,请参阅 Transcoder API Ruby API 参考文档。
如需向 Transcoder API 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
示例
请考虑以下示例视频:
这两个视频的相似之处在于它们包含三个部分:
- 在移动设备上观看电影或游戏
- 在大屏幕上观看相同的内容
- 显示相应产品简洁的广告文案
例如,您可以将这两个视频串联在一起,以便输出视频显示第一个视频中的第 1 部分和第 2 部分,然后显示第二个视频中的第 2 部分和 3 部分。您可以使用以下时间偏移来实现此串联:
- ForBiggerEscapes.mp4
startTimeOffset
:0s
endTimeOffset
:8.1s
- ForBiggerJoyrides.mp4
startTimeOffset
:3.5s
endTimeOffset
:15s
将上述代码与这两个视频及其时间偏移值结合使用,可以查看操作丰富的结果视频。