智能生产制作支持批量化智能一键成片,包含【脚本化自动成片】和【智能图文匹配成片】两种解决方案。通过阅读本文,您将了解如何调用OpenAPI以及配置参数,实现批量化的智能一键成片。
前提条件
您已知晓【脚本化自动成片】和【智能图文匹配成片】两种解决方案的区别。具体请参考操作指南:批量智能一键成片。
您已安装IMS服务端SDK。具体操作,请参考安装SDK。
API详情,请参考:SubmitBatchMediaProducingJob、GetBatchMediaProducingJob、GetMediaProducingJob。
批量智能一键成片参数详情,请参考:批量智能一键成片参数说明。
注意事项
本文中代码示例依赖ICE OpenAPI SDK最新版本,详情请参见安装方式。
操作步骤
1、准备素材
在提交批量智能一键成片任务之前,您需要先准备一些用于剪辑的素材:视频图片(必需)、背景音乐、标题、口播文案等。
批量智能一键成片支持用户传入OSS URL或者媒资ID作为剪辑素材,如果您的素材是本地的音视频图片文件,那么您需要先将文件上传至OSS。如果您希望使用IMS服务进一步管理您的媒资,可以调用RegisterMediaInfo将OSS文件注册成媒资并获取媒资ID。
2、提交一键成片任务
2.1、输入参数示例
以下示例中的属性详情,请参见批量智能一键成片参数说明。
2.1.1、InputConfig 视频、图片素材配置
脚本化自动成片
当InputConfig参数中包含MediaGroupArray字段时,批量剪辑模式默认「脚本化自动成片」。素材支持视频和图片,支持媒资ID和OSS URL作为输入。
{
"MediaGroupArray": [
{
"GroupName": "分组1",
"MediaArray": [
"****9d46c886b45481030f6e****",
"****c886810b4549d4630f6e****"
]
},
{
"GroupName": "分组2",
"MediaArray": [
"http://test-bucket.oss-cn-shanghai.aliyuncs.com/test1.mp4"
"http://test-bucket.oss-cn-shanghai.aliyuncs.com/test2.png"
]
}
]
}
智能图文匹配成片
当InputConfig参数中包含MediaArray字段时,批量剪辑模式为「智能图文匹配成片」。
{
"MediaArray": [
"****9d46c886b45481030f6e****",
"****c886810b4549d4630f6e****",
"http://test-bucket.oss-cn-shanghai.aliyuncs.com/test1.mp4",
"http://test-bucket.oss-cn-shanghai.aliyuncs.com/test2.png"
]
}
2.1.2、InputConfig 背景音乐配置
如果您有自己的背景音乐,也可以在InputConfig中传入,同样支持媒资ID和OSS URL。若未传入,默认剪辑时会随机选取公共素材库中的BGM进行合成。
示例1:传入单首背景音乐(MediaId)
{
"MediaGroupArray": [
{
"GroupName": "Group1",
"MediaArray": [
"****9d46c886b45481030f6e****",
"****c886810b4549d4630f6e****"
]
}
],
"BackgroundMusic": "****b4549d46c88681030f6e****"
}
示例二:传入多首BGM(MediaId和OSS URL混用),合成时随机选取一首作为背景音乐。
{
"MediaGroupArray": [
{
"GroupName": "Group1",
"MediaArray": [
"****9d46c886b45481030f6e****",
"****c886810b4549d4630f6e****"
]
}
],
"BackgroundMusicArray": [
"****b4549d46c88681030f6e****",
"****549d46c88b4681030f6e****",
"http://test-bucket.oss-cn-shanghai.aliyuncs.com/test4.mp3"
]
}
2.1.3、InputConfig 标题、口播文案配置
如果传入了标题和口播文案,那么这两类文本素材都会合成到最终的成片中,效果见下图:
示例1:一个标题,多条口播文案
生成的所有成片共用一个标题,口播文案随机选取一条合成。
{
"MediaGroupArray": [
{
"GroupName": "Group1",
"MediaArray": [
"****9d46c886b45481030f6e****",
"****c886810b4549d4630f6e****"
]
}
],
"Title": "回龙观盒马鲜生开业啦",
"SpeechTextArray": [
"附近的商场新开了一家盒马鲜生,今天是第一天开业,赶紧来凑热闹,这家盒马面积不大,但商场里的人不少,零食、酒水都比较便宜,排队的人都排成了长龙,大家也快来看看呀",
"附近的商场新开了一家盒马鲜生,今天是第一天开业,赶紧来凑热闹"
]
}
示例2:多个标题,一条口播文案
生成的所有成片共用一条口播文案,标题随机选取一个合成。
{
"MediaGroupArray": [
{
"GroupName": "Group1",
"MediaArray": [
"****9d46c886b45481030f6e****",
"****c886810b4549d4630f6e****"
]
}
],
"TitleArray": [
"回龙观盒马鲜生开业啦",
"盒马鲜生开业啦"
],
"SpeechText": "附近的商场新开了一家盒马鲜生,今天是第一天开业,赶紧来凑热闹,这家盒马面积不大,但商场里的人不少,零食、酒水都比较便宜,排队的人都排成了长龙,大家也快来看看呀",
}
示例3:多个标题,多个口播文案
如果标题和口播文案个数相同,则合成时会随机选取一对标题和口播文案,即第一个标题一定对应第一个口播文案;如果数量不一致,则会随机选取标题和口播文案。
{
"MediaGroupArray": [
{
"GroupName": "Group1",
"MediaArray": [
"****9d46c886b45481030f6e****",
"****c886810b4549d4630f6e****"
]
}
],
"TitleArray": [
"回龙观盒马鲜生开业啦",
"盒马鲜生开业啦"
],
"SpeechTextArray": [
"附近的商场新开了一家盒马鲜生,今天是第一天开业,赶紧来凑热闹,这家盒马面积不大,但商场里的人不少,零食、酒水都比较便宜,排队的人都排成了长龙,大家也快来看看呀",
"附近的商场新开了一家盒马鲜生,今天是第一天开业,赶紧来凑热闹"
],
}
2.1.4、InputConfig 贴纸水印配置
InputConfig中支持传入图片的mediaId 或者 OSS URL,作为全局贴纸或者水印来合成。
示例1:传入单张贴纸,所有成片中都全局显示这张贴纸。
{
"MediaGroupArray": [
{
"GroupName": "Group1",
"MediaArray": [
"****9d46c886b45481030f6e****",
"****c886810b4549d4630f6e****"
]
},
"Sticker": {
"MediaId": "****b681034549d46c880f6e****",
"X": 10,
"Y": 100,
"Width": 300,
"Height": 300
}
}
示例2:传入多张贴纸,每个成片随机选取一张贴纸全局展示。
{
"MediaGroupArray": [
{
"GroupName": "Group1",
"MediaArray": [
"****9d46c886b45481030f6e****",
"****c886810b4549d4630f6e****"
]
},
"StickerArray": [
{
"MediaId": "****9d46c8b4548681030f6e****",
"X": 10,
"Y": 100,
"Width": 300,
"Height": 300
},
{
"MediaURL": "http://test-bucket.oss-cn-shanghai.aliyuncs.com/test3.png",
"X": 10,
"Y": 100,
"Width": 300,
"Height": 300
}
]
}
2.1.5、批量一键成片接口输入参数--最佳实践
示例1:使用脚本化自动成片,传入标题、口播文案素材,批量生成5个竖屏1080p的视频,并配置任务完成回调。
InputConfig: 其余参数详情见InputConfig 参数说明。
{
"MediaGroupArray": [
{
"GroupName": "Group1",
"MediaArray": [
"****9d46c886b45481030f6e****",
"****c886810b4549d4630f6e****"
]
},
{
"GroupName": "Group2",
"MediaArray": [
"http://test-bucket.oss-cn-shanghai.aliyuncs.com/test1.mp4"
"http://test-bucket.oss-cn-shanghai.aliyuncs.com/test2.png"
]
}
],
"TitleArray": [
"回龙观盒马鲜生开业啦",
"盒马鲜生开业啦"
],
"SpeechTextArray": [
"附近的商场新开了一家盒马鲜生,今天是第一天开业,赶紧来凑热闹,这家盒马面积不大,但商场里的人不少,零食、酒水都比较便宜,排队的人都排成了长龙,大家也快来看看呀",
"附近的商场新开了一家盒马鲜生,今天是第一天开业,赶紧来凑热闹"
]
}
EditingConfig: 无需配置。剪辑合成默认配置详情见EditingConfig 参数示例。
OutputConfig: 其余参数详情见OutputConfig 参数说明。
{
"MediaURL": "http://xxx.oss-cn-shanghai.aliyuncs.com/xxx_{index}.mp4",
"Count": 5,
"Width": 1080,
"Height": 1920
}
UserData: 用户业务数据和回调地址配置,支持http地址或mns队列
{"NotifyAddress":"http(s)://**.**.***"}
{"NotifyAddress":"ice-callback-****"}
示例2:使用智能图文匹配成片,传入标题、口播文案素材,批量生成5个竖屏1080p的视频,并配置任务完成回调。
InputConfig: 其余参数详情见InputConfig 参数说明。
{
"MediaArray": [
"****9d46c886b45481030f6e****",
"****c886810b4549d4630f6e****",
"http://test-bucket.oss-cn-shanghai.aliyuncs.com/test2.png",
"http://test-bucket.oss-cn-shanghai.aliyuncs.com/test2.png"
],
"TitleArray": [
"回龙观盒马鲜生开业啦",
"盒马鲜生开业啦"
],
"SpeechTextArray": [
"附近的商场新开了一家盒马鲜生,今天是第一天开业,赶紧来凑热闹,这家盒马面积不大,但商场里的人不少,零食、酒水都比较便宜,排队的人都排成了长龙,大家也快来看看呀",
"附近的商场新开了一家盒马鲜生,今天是第一天开业,赶紧来凑热闹"
]
}
EditingConfig、OutputConfig、UserData的配置和「示例1:脚本化自动成片」保持一致。
2.2、使用服务端SDK 提交一键成片任务
调用接口SubmitBatchMediaProducingJob,提交批量智能一键成片任务,批量生成5个有标题、口播的竖屏1080p成片。
该接口返回一键成片任务的提交结果,不保证接口返回时视频已合成完毕。合成任务将进入后台排队,异步执行。
以java 为例,其他语言的sdk示例请前往:OpenAPI门户
package com.aliyun.sample;
import com.aliyun.tea.*;
public class Sample {
/**
* 使用AK&SK初始化账号Client
* @param accessKeyId
* @param accessKeySecret
* @return Client
* @throws Exception
*/
public static com.aliyun.ice20201109.Client createClient(String accessKeyId, String accessKeySecret) throws Exception {
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
// 必填,您的 AccessKey ID
.setAccessKeyId(accessKeyId)
// 必填,您的 AccessKey Secret
.setAccessKeySecret(accessKeySecret);
// Endpoint 请参考 https://api.aliyun.com/product/ICE
config.endpoint = "ice.cn-shanghai.aliyuncs.com";
return new com.aliyun.ice20201109.Client(config);
}
public static void main(String[] args_) throws Exception {
java.util.List<String> args = java.util.Arrays.asList(args_);
// 请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID 和 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
// 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例使用环境变量获取 AccessKey 的方式进行调用,仅供参考,建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378657.html
com.aliyun.ice20201109.Client client = Sample.createClient(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
com.aliyun.ice20201109.models.SubmitBatchMediaProducingJobRequest submitBatchMediaProducingJobRequest = new com.aliyun.ice20201109.models.SubmitBatchMediaProducingJobRequest()
.setInputConfig("{
\"MediaGroupArray\": [
{
\"GroupName\": \"Group1\",
\"MediaArray\": [
\"****9d46c886b45481030f6e****\",
\"****c886810b4549d4630f6e****\"
]
},
{
\"GroupName\": \"Group2\",
\"MediaArray\": [
\"http://test-bucket.oss-cn-shanghai.aliyuncs.com/test1.mp4\"
\"http://test-bucket.oss-cn-shanghai.aliyuncs.com/test2.png\"
]
}
],
\"TitleArray\": [
\"回龙观盒马鲜生开业啦\",
\"盒马鲜生开业啦\"
],
\"SpeechTextArray\": [
\"附近的商场新开了一家盒马鲜生,今天是第一天开业,赶紧来凑热闹,这家盒马面积不大,但商场里的人不少,零食、酒水都比较便宜,排队的人都排成了长龙,大家也快来看看呀\",
\"附近的商场新开了一家盒马鲜生,今天是第一天开业,赶紧来凑热闹\"
]
}")
.setOutputConfig("{
\"MediaURL\": \"http://xxx.oss-cn-shanghai.aliyuncs.com/xxx_{index}.mp4\",
\"Count\": 5,
\"Width\": 1080,
\"Height\": 1920
}")
.setUserData("{\"NotifyAddress\":\"http(s)://**.**.***\"}");
com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
try {
// 复制代码运行请自行打印 API 的返回值
client.submitBatchMediaProducingJobWithOptions(submitBatchMediaProducingJobRequest, runtime);
} catch (TeaException error) {
// 错误 message
System.out.println(error.getMessage());
// 诊断地址
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
} catch (Exception _error) {
TeaException error = new TeaException(_error.getMessage(), _error);
// 错误 message
System.out.println(error.getMessage());
// 诊断地址
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
}
}
}
3、查询一键成片主任务
提交批量智能一键成片任务后,会同步返回主任务jobId。同时任务会进入后台排队、异步执行,并根据提交任务时的参数OutputConfig.Count的数量,批量发起多个剪辑子任务,合成多个成片。您可以调用GetBatchMediaProducingJob接口,主任务JobId 作为输入参数,查询批量智能一键成片主任务的详细信息,包含:主任务提交时的入参配置,所有子任务的任务状态、子任务JobId、成片媒资ID等。
使用服务端SDK查询一键成片主任务信息
以java 为例,其他语言的sdk示例请前往:OpenAPI门户
package com.aliyun.sample;
import com.aliyun.tea.*;
public class Sample {
/**
* 使用AK&SK初始化账号Client
* @param accessKeyId
* @param accessKeySecret
* @return Client
* @throws Exception
*/
public static com.aliyun.ice20201109.Client createClient(String accessKeyId, String accessKeySecret) throws Exception {
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
// 必填,您的 AccessKey ID
.setAccessKeyId(accessKeyId)
// 必填,您的 AccessKey Secret
.setAccessKeySecret(accessKeySecret);
// Endpoint 请参考 https://api.aliyun.com/product/ICE
config.endpoint = "ice.cn-shanghai.aliyuncs.com";
return new com.aliyun.ice20201109.Client(config);
}
public static void main(String[] args_) throws Exception {
java.util.List<String> args = java.util.Arrays.asList(args_);
// 请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID 和 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
// 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例使用环境变量获取 AccessKey 的方式进行调用,仅供参考,建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378657.html
com.aliyun.ice20201109.Client client = Sample.createClient(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
com.aliyun.ice20201109.models.GetBatchMediaProducingJobRequest getBatchMediaProducingJobRequest = new com.aliyun.ice20201109.models.GetBatchMediaProducingJobRequest()
.setJobId("****b6b2750d4308892ac3330238****");
com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
try {
// 复制代码运行请自行打印 API 的返回值
client.getBatchMediaProducingJobWithOptions(getBatchMediaProducingJobRequest, runtime);
} catch (TeaException error) {
// 错误 message
System.out.println(error.getMessage());
// 诊断地址
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
} catch (Exception _error) {
TeaException error = new TeaException(_error.getMessage(), _error);
// 错误 message
System.out.println(error.getMessage());
// 诊断地址
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
}
}
}
4、查询一键成片子任务
GetBatchMediaProducingJob接口仅会返回子任务的关键信息,例如:任务状态、成片媒资ID等。要获取更多详细的剪辑任务信息,您可以调用GetMediaProducingJob接口,将第三步中返回的子任务JobId作为输入进行查询。
使用服务端SDK查询一键成片子任务信息
以java 为例,其他语言的sdk示例请前往:OpenAPI门户
package com.aliyun.sample;
import com.aliyun.tea.*;
public class Sample {
/**
* 使用AK&SK初始化账号Client
* @param accessKeyId
* @param accessKeySecret
* @return Client
* @throws Exception
*/
public static com.aliyun.ice20201109.Client createClient(String accessKeyId, String accessKeySecret) throws Exception {
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
// 必填,您的 AccessKey ID
.setAccessKeyId(accessKeyId)
// 必填,您的 AccessKey Secret
.setAccessKeySecret(accessKeySecret);
// Endpoint 请参考 https://api.aliyun.com/product/ICE
config.endpoint = "ice.cn-shanghai.aliyuncs.com";
return new com.aliyun.ice20201109.Client(config);
}
public static void main(String[] args_) throws Exception {
java.util.List<String> args = java.util.Arrays.asList(args_);
// 请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID 和 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
// 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例使用环境变量获取 AccessKey 的方式进行调用,仅供参考,建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378657.html
com.aliyun.ice20201109.Client client = Sample.createClient(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
com.aliyun.ice20201109.models.GetMediaProducingJobRequest getMediaProducingJobRequest = new com.aliyun.ice20201109.models.GetMediaProducingJobRequest()
.setJobId("****b6b2750d4308892ac3330238****");
com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
try {
// 复制代码运行请自行打印 API 的返回值
client.getMediaProducingJobWithOptions(getMediaProducingJobRequest, runtime);
} catch (TeaException error) {
// 错误 message
System.out.println(error.getMessage());
// 诊断地址
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
} catch (Exception _error) {
TeaException error = new TeaException(_error.getMessage(), _error);
// 错误 message
System.out.println(error.getMessage());
// 诊断地址
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
}
}
}
5、配置一键成片剪辑完成回调
发起「批量智能一键成片」任务后,会批量发起多个剪辑任务,合成多个视频。当左右子任务都完成后会发送完成回调。具体回调字段请参考:回调事件BatchProduceMediaComplete。
配置全局回调
您可在控制台或调用接口设置「批量智能一键成片」完成的全局回调。操作详情请参考:设置回调事件。
配置接口维度回调
在提交「批量智能一键成片」任务时,支持在userData字段中配置接口维度的任务完成回调,示例参考:UserData配置回调。
6、一键成片混剪逻辑及进阶配置
6.1、「脚本化自动成片」处理逻辑
当InputConfig中包含MediaGroupArray参数时,混剪模式为「脚本化自动成片」,处理逻辑如下:
如果输入视频为长视频片段,会先进行拆条,混剪时选取拆条后的视频片段进行拼接合成。拆条后单镜头的时长默认为3s,您也可以通过EditingConfig.ProcessConfig.SingleShotDuration指定镜头时长。
如果有口播文案,在数量足够的前提下,尽量不重复选取。比如:输入3条文案,需要生成5条视频,则5条成片中会出现相同文案,但3条文案都会被使用至少一次。
按照分组顺序,先每组随机挑选一个拆条后的视频片段,前后拼接。如果输入了口播文案且视频总时长少于口播时长,则优先从非首尾分组中随机选取视频片段,直到视频总时长与口播时长相当。
6.2、「智能图文匹配成片」处理逻辑
当InputConfig中包含MediaGroup参数,不包含MediaGroupArray参数时,混剪模式为「智能图文匹配成片」,处理逻辑如下:
和「脚本化自动成片」相同,先对长视频进行拆条。
如果没有口播文案,则随机选取视频片段进行前后拼接,合成大约15s的成片。
如果有口播文案,则进行图文智能匹配并对齐口播文案,批量合成多条成片。
6.3、一键成片进阶配置
在提供方便快捷、低门槛混剪功能的基础上,一键成片也开放多个参数配置,供您调整成片效果。下文将选择几个常用配置,做示例说明。
指定背景音乐、口播声音的风格和音量
EditingConfig 配置如下:
{
"SpeechConfig": {
"Style": "Gentle",
"Gain": 1.1
},
"BackgroundMusicConfig": {
"Style": "bgm-relaxing",
"Gain": 0.2
}
}
指定口播的音色和速度
如果所有成片都共用一个口播Voice,EditingConfig 配置如下:
{
"SpeechConfig": {
"Voice": "zhiru"
}
}
如果希望成片的口播Voice从一个列表中随机选取,多值需用英文逗号隔开,EditingConfig 配置如下:
{
"SpeechConfig": {
"Voice": "zhiru,zhilun,zhibei_emo"
}
}
如果想要调整口播的速度,EditingConfig配置如下:
{
"SpeechConfig": {
"SpeechRate": 100
}
}
SpeechRate 取值范围,参考:配置SpeechRate。
配置字幕特效
和口播Voice类似,EditingConfig支持传入一个或多个字幕特效。
例1:字幕入场效果在wave_in和fade_in中随机选取,字幕出场效果固定为wave_out,配置如下:
{
"SpeechConfig": {
"AsrConfig": {
"AaiMotionInEffect": "wave_in,fade_in"
"AaiMotionInEffect": "wave_out"
}
}
}
例2:字幕循环特效在normal_display和naughty_display中随机选取
{
"SpeechConfig": {
"AsrConfig": {
"AaiMotionLoopEffect": "normal_display,naughty_display"
}
}
}
- 本页导读 (1)