本实践教程旨在通过详细介绍智能媒体服务(IMS)的人脸搜索与视频剪辑功能,指导用户如何高效地创建和编辑人脸集锦。教程内容涵盖了智能媒资检索的基本操作、人脸搜索的API调用流程、Timeline配置以及高级模板的应用,帮助您快速上手并创建出高质量的人脸集锦视频。
前言
随着视频内容的爆炸性增长,如何快速定位并整理出关键人物出现的视频片段成为了一项重要的工作。人脸集锦作为一种有效的视频呈现方式,能够直观展示特定在不同场景下的活动,广泛应用于影视制作、新闻报道、社交娱乐等多个领域。本教程将通过智能媒体服务的强大功能,为您展示如何轻松实现这一目标。
应用场景示例
场景一:体育赛事中的运动员个人集锦(以马拉松为例)
在马拉松等体育赛事中,主办方或媒体机构常常需要制作运动员的精彩集锦视频,以展现运动员在比赛中的高光时刻,如冲刺瞬间、超越对手等。这些集锦视频对于赛事的宣传、回顾以及运动员的个人推广都具有重要意义。
场景二:游乐场游客的个人游玩精彩集锦
游乐场为了提升游客体验,常常希望为游客制作个性化的游玩片段集锦,记录他们在各类游乐项目中的精彩瞬间,如过山车上的尖叫、旋转木马上的欢笑等。这些集锦可以作为游客的纪念品,也可以用于游乐场的社交媒体宣传。
场景三:宴会花絮视频制作(以婚宴为例)
在婚庆行业中,婚礼视频是记录新人幸福瞬间、传承美好回忆的重要载体。无论是婚礼当天的花絮,还是新人的旅拍视频,都需要经过精心剪辑和编排,以展现新人的爱情故事和婚礼的浪漫氛围。
场景四:演唱会或音乐会的人脸粉丝集锦
在大型演唱会或音乐会上,主办方经常需要制作一段关于现场观众的人脸集锦,以展示观众的热情和参与度。这些人脸集锦可以通过大屏幕展示,增强现场氛围,也可以作为社交媒体宣传的素材。
除此之外,人脸集锦还可以广泛应用于多个领域,包括个人回忆录或家庭纪念视频、旅游宣传、企业年会或活动回顾互动等场景。
使用流程
前提条件
需安装IMS服务端SDK,详情请参见准备工作,如已安装请忽略本步骤。
步骤一:通过人脸检索截取视频片段信息
通过智能媒体服务的人脸检索功能对视频素材进行检索,以获取包含人脸的媒资片段信息。该步骤详见专属教程:如何对海量媒资进行人脸搜索
步骤二:对人脸视频片段进行剪辑
接下来将为您介绍三种人脸集锦视频的制作方式,内容将涵盖适用场景、适用步骤、SDK调用示例以及案例展示等几个方面。
方式一:通过脚本化自动成片创作视频
特性
便捷高效:通过脚本化自动生成的人脸集锦视频制作过程变得更加便捷,用户可以通过简单的配置,高效批量生成多个相似的视频。
上手快、门槛低:即使没有视频剪辑经验,借助一键成片的强大功能支持,用户也能够轻松制作出效果不俗的视频。
通过调用SDK实现
展开查看代码示例
package com.example;
import java.util.*;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.aliyun.ice20201109.Client;
import com.aliyun.ice20201109.models.*;
import com.aliyun.teaopenapi.models.Config;
/**
* 需要maven引入二方包依赖:
* <dependency>
* <groupId>com.aliyun</groupId>
* <artifactId>ice20201109</artifactId>
* <version>2.3.0</version>
* </dependency>
* <dependency>
* <groupId>com.alibaba</groupId>
* <artifactId>fastjson</artifactId>
* <version>1.2.9</version>
* </dependency>
*/
public class SubmitFaceEditingJobService {
static final String regionId = "cn-shanghai";
static final String bucket = "<your-bucket>";
/*** 基于人脸搜结果,提交人脸集锦一键成片任务 ****/
public static void submitBatchEditingJob(String mediaId, SearchMediaClipByFaceResponse response) throws Exception {
Client iceClient = initClient();
JSONArray intervals = buildIntervals(response);
JSONObject editingTimeline = buildEditingTimeline(mediaId, intervals);
String openingMediaId = "icepublic-9a2df29956582a68a59e244a5915228c";
String endingMediaId = "icepublic-1790626066bee650ac93bd12622a921c";
String mainGroupName = "main";
String openingGroupName = "opening";
String endingGroupName = "ending";
JSONObject inputConfig = buildInputConfig(mediaId, mainGroupName, openingMediaId, openingGroupName, endingMediaId, endingGroupName);
JSONObject editingConfig = buildEditingConfig(mediaId, mainGroupName, intervals, openingMediaId, openingGroupName, endingMediaId, endingGroupName);
JSONObject outputConfig = new JSONObject();
outputConfig.put("MediaURL", "https://ice-auto-test.oss-cn-shanghai.aliyuncs.com/testBatch/" + System.currentTimeMillis() + "{index}.mp4");
outputConfig.put("Width", 1280);
outputConfig.put("Height", 720);
outputConfig.put("FixedDuration", 18);
outputConfig.put("Count", 2);
SubmitBatchMediaProducingJobRequest request = new SubmitBatchMediaProducingJobRequest();
request.setInputConfig(inputConfig.toJSONString());
request.setEditingConfig(editingConfig.toJSONString());
request.setOutputConfig(outputConfig.toJSONString());
SubmitBatchMediaProducingJobResponse response = iceClient.submitBatchMediaProducingJob(request);
System.out.println("JobId: " + response.getBody().getJobId());
}
public Client initClient() throws Exception {
// 阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维。
// 本示例以将AccessKey ID和 AccessKey Secret保存在环境变量为例说明。配置方法请参见:https://www.alibabacloud.com/help/zh/sdk/developer-reference/v2-manage-access-credentials
com.aliyun.credentials.Client credentialClient = new com.aliyun.credentials.Client();
Config config = new Config();
config.setCredential(credentialClient);
// 如需硬编码AccessKey ID和AccessKey Secret,代码如下,但强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。
// config.accessKeyId = <第二步创建的AccessKey ID>;
// config.accessKeySecret = <第二步创建的AccessKey Secret>;
config.endpoint = "ice." + regionId + ".aliyuncs.com";
config.regionId = regionId;
return new Client(config);
}
public JSONArray buildIntervals(SearchMediaClipByFaceResponse response) {
JSONArray intervals = new JSONArray();
List<SearchMediaClipByFaceResponseBodyMediaClipListOccurrencesInfos> occurrencesInfos =
response.getBody().getMediaClipList().get(0).getOccurrencesInfos();
for (SearchMediaClipByFaceResponseBodyMediaClipListOccurrencesInfos occurrence: occurrencesInfos) {
Float startTime = occurrence.getStartTime();
Float endTime = occurrence.getEndTime();
// 可自行调整筛选逻辑
// 过滤小于2s的片段
if (endTime - startTime < 2) {
continue;
}
// 片段大于6s截断
if (endTime - startTime > 6) {
endTime = startTime + 6;
}
JSONObject interval = new JSONObject();
interval.put("In", startTime);
interval.put("Out", endTime);
intervals.add(interval);
}
return intervals;
}
public static JSONObject buildSingleInterval(Float in, Float out) {
JSONObject interval = new JSONObject();
interval.put("In", in);
interval.put("Out", out);
return interval;
}
public static JSONObject buildMediaMetaData(String mediaId, String groupName, JSONArray intervals) {
JSONObject mediaMetaData = new JSONObject();
mediaMetaData.put("Media", mediaId);
mediaMetaData.put("GroupName", groupName);
mediaMetaData.put("TimeRangeList", intervals);
return mediaMetaData;
}
public static JSONObject buildInputConfig(String mediaId, String mainGroupName, String openingMediaId, String openingGroupName, String endingMediaId, String endingGroupName) {
JSONObject inputConfig = new JSONObject();
JSONArray mediaGroupArray = new JSONArray();
if (openingMediaId != null) {
// 根据需要配置片头
JSONObject openingGroup = new JSONObject();
openingGroup.put("GroupName", openingGroupName);
openingGroup.put("MediaArray", Arrays.asList(openingMediaId));
mediaGroupArray.add(openingGroup);
}
JSONObject mediaGroupMain = new JSONObject();
mediaGroupMain.put("GroupName", mainGroupName);
mediaGroupMain.put("MediaArray", Arrays.asList(mediaId));
mediaGroupArray.add(mediaGroupMain);
if (endingMediaId != null) {
// 根据需要配置片尾
JSONObject endingGroup = new JSONObject();
endingGroup.put("GroupName", endingGroupName);
endingGroup.put("MediaArray", Arrays.asList(endingMediaId));
mediaGroupArray.add(endingGroup);
}
inputConfig.put("MediaGroupArray", mediaGroupArray);
// 自定义bgm
inputConfig.put("BackgroundMusicArray", Arrays.asList("icepublic-0c4475c3936f3a8743850f2da942ceee"));
return inputConfig;
}
public static JSONObject buildEditingConfig(String mediaId, String mainGroupName, JSONArray intervals, String openingMediaId, String openingGroupName, String endingMediaId, String endingGroupName) {
JSONObject editingConfig = new JSONObject();
JSONObject mediaConfig = new JSONObject();
JSONArray mediaMetaDataArray = new JSONArray();
if (openingMediaId != null) {
// 根据需求,配置片头素材的入出点
JSONObject openingInterval = buildSingleInterval(1.5f, 5.5f);
JSONArray openingIntervals = new JSONArray();
openingIntervals.add(openingInterval);
JSONObject metaData = buildMediaMetaData(openingMediaId, openingGroupName, openingIntervals);
mediaMetaDataArray.add(metaData);
}
// 配置主素材的入出点(人脸出现的片段)
JSONObject mainMediaMetaData = buildMediaMetaData(mediaId, mainGroupName, intervals);
mediaMetaDataArray.add(mainMediaMetaData);
if (endingMediaId != null) {
// 根据需求,配置片头素材的入出点
JSONObject endingInterval = buildSingleInterval(1.5f, 5.5f);
JSONArray endingIntervals = new JSONArray();
endingIntervals.add(endingInterval);
JSONObject metaData = buildMediaMetaData(endingMediaId, endingGroupName, endingIntervals);
mediaMetaDataArray.add(metaData);
}
mediaConfig.put("MediaMetaDataArray", mediaMetaDataArray);
editingConfig.put("MediaConfig", mediaConfig);
return editingConfig;
}
}
通过控制台实现
如果选择采用控制台进行视频制作,则可以直接跳过“步骤一:通过人脸检索截取视频片段信息”,按照以下步骤进行操作即可。
步骤一:点击控制台左侧模块“智能批量一键成片”,然后在“脚本化自动成片”中点击“创建脚本化自动成片”,并选择“生成模式”(口播模式和分组模式均可使用,本示例将以分组模式为例进行介绍。)进入创作页面。
步骤二:在“脚本节点配置”中点击添加素材,在右侧“添加素材”弹窗中选择“人脸检索”,然后上传人脸图片搜索素材,搜索结果如下图。
步骤三:在搜索结果列表中,点击某个搜索结果素材的【查看】按钮,即可查看检索命中的片段。随后,点击【导入命中片段】并在列表下方点击【确定】,便可将检索命中的素材将被添加至脚本节点中。
步骤四:若您希望查看或对人脸检索命中的片段进行调整,请将鼠标悬停在素材上,然后点击设置按钮以打开设置弹窗。在此,您可以在【视频内容截取】下手动调整检索命中的片段。(如无需调整出入点,可忽略步骤四。)
完成以上步骤后,后续操作按照脚本化成片的正常使用流程(包括标题、背景音乐、贴纸logo及视频设置)进行配置,并提交任务即可。
方式二:通过Timeline剪辑创作视频
特性
视频内容自定义:Timeline提供了高度的自定义能力,允许用户精确控制每一个剪辑点、特效、转场和音频。您能够根据自己的创意和需求,自由组合和调整素材,创作出独一无二的视频作品。
对灵活性要求较高:Timeline剪辑不受模板限制,可以根据项目需求随时调整剪辑方案。无论是剪辑顺序、特效添加还是音频处理,都可以灵活应对,满足多样化的创作需求。
使用步骤
基于步骤一中人脸检索的结果,您可以使用SubmitMediaProducingJob - 提交剪辑合成作业中的Timeline配置说明来完成人脸集锦视频的剪辑,可以参考下文中的SDK调用示例。若有更高的剪辑需求,例如特效设置、转场效果、音频处理等高级剪辑配置,建议阅读和参考视频剪辑基础参数和Timeline配置说明,以便更全面地了解如何利用视频剪辑功能实现人脸集锦视频的制作。
SDK调用示例
展开查看代码示例
package com.example;
import java.util.*;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.aliyun.ice20201109.Client;
import com.aliyun.ice20201109.models.*;
import com.aliyun.teaopenapi.models.Config;
/**
* 需要maven引入二方包依赖:
* <dependency>
* <groupId>com.aliyun</groupId>
* <artifactId>ice20201109</artifactId>
* <version>2.3.0</version>
* </dependency>
* <dependency>
* <groupId>com.alibaba</groupId>
* <artifactId>fastjson</artifactId>
* <version>1.2.9</version>
* </dependency>
*/
public class SubmitFaceEditingJobService {
static final String regionId = "cn-shanghai";
static final String bucket = "<your-bucket>";
/*** 基于人脸搜结果,提交人脸集锦剪辑任务 ****/
public static void submitEditingJob(String mediaId, SearchMediaClipByFaceResponse response) throws Exception {
Client iceClient = initClient();
JSONArray intervals = buildIntervals(response);
JSONObject editingTimeline = buildEditingTimeline(mediaId, intervals);
// 提交普通剪辑任务
SubmitMediaProducingJobRequest request1 = new SubmitMediaProducingJobRequest();
request1.setTimeline(editingTimeline.toJSONString());
request1.setOutputMediaTarget("oss-object");
JSONObject outputConfig = new JSONObject();
outputConfig.put("MediaURL",
"https://" + bucket + ".oss-" + regionId + "/testEditing/" + System.currentTimeMillis() + ".mp4");
request1.setOutputMediaConfig(outputConfig.toJSONString());
SubmitMediaProducingJobResponse response1 = iceClient.submitMediaProducingJob(request1);
System.out.println("JobId: " + response1.getBody().getJobId());
}
public Client initClient() throws Exception {
// 阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维。
// 本示例以将AccessKey ID和 AccessKey Secret保存在环境变量为例说明。配置方法请参见:https://help.aliyun.com/zh/sdk/developer-reference/v2-manage-access-credentials?spm=a2c4g.11186623.0.0.423350fbOTFdOB#2a38e5c14b4em
com.aliyun.credentials.Client credentialClient = new com.aliyun.credentials.Client();
Config config = new Config();
config.setCredential(credentialClient);
// 如需硬编码AccessKey ID和AccessKey Secret,代码如下,但强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。
// config.accessKeyId = <第二步创建的AccessKey ID>;
// config.accessKeySecret = <第二步创建的AccessKey Secret>;
config.endpoint = "ice." + regionId + ".aliyuncs.com";
config.regionId = regionId;
return new Client(config);
}
public JSONArray buildIntervals(SearchMediaClipByFaceResponse response) {
JSONArray intervals = new JSONArray();
List<SearchMediaClipByFaceResponseBodyMediaClipListOccurrencesInfos> occurrencesInfos =
response.getBody().getMediaClipList().get(0).getOccurrencesInfos();
for (SearchMediaClipByFaceResponseBodyMediaClipListOccurrencesInfos occurrence: occurrencesInfos) {
Float startTime = occurrence.getStartTime();
Float endTime = occurrence.getEndTime();
// 可自行调整筛选逻辑
// 过滤小于2s的片段
if (endTime - startTime < 2) {
continue;
}
// 片段大于6s截断
if (endTime - startTime > 6) {
endTime = startTime + 6;
}
JSONObject interval = new JSONObject();
interval.put("In", startTime);
interval.put("Out", endTime);
intervals.add(interval);
}
return intervals;
}
public JSONObject buildEditingTimeline(String mediaId, JSONArray intervals) {
JSONObject timeline = new JSONObject();
JSONArray videoTracks = new JSONArray();
JSONObject videoTrack = new JSONObject();
JSONArray videoTrackClips = new JSONArray();
for (int i = 0; i < intervals.size(); i++) {
JSONObject interval = intervals.getJSONObject(i);
Float in = interval.getFloat("In");
Float out = interval.getFloat("Out");
JSONObject videoTrackClip = new JSONObject();
videoTrackClip.put("MediaId", mediaId);
videoTrackClip.put("In", in);
videoTrackClip.put("Out", out);
// 配置视频静音,按需调整
JSONArray effects = new JSONArray();
JSONObject effect = new JSONObject();
effect.put("Type", "Volume");
effect.put("Gain", 0);
effects.add(effect);
videoTrackClip.put("Effects", effects);
videoTrackClips.add(videoTrackClip);
}
videoTrack.put("VideoTrackClips", videoTrackClips);
videoTracks.add(videoTrack);
// 配置音频轨,按需调整
JSONArray audioTracks = new JSONArray();
JSONObject audioTrack = new JSONObject();
JSONArray audioTrackClips = new JSONArray();
JSONObject audioTrackClip = new JSONObject();
// 需使用您名下的音频媒资
audioTrackClip.put("MediaId", "92796460cd4571ed91c6e7e7c45b****");
audioTrackClip.put("LoopMode", true);
audioTrackClips.add(audioTrackClip);
audioTrack.put("AudioTrackClips", audioTrackClips);
audioTracks.add(audioTrack);
timeline.put("VideoTracks", videoTracks);
timeline.put("AudioTracks", audioTracks);
return timeline;
}
}
展开查看TimeLine参数示例
{
"VideoTracks": [
{
"VideoTrackClips": [
{
"MediaId": "b5a003f0cd3f71ed919fe7e7c45b****",
"In": 54.106018,
"Effects": [
{
"Type": "Volume",
"Gain": 0
}
],
"Out": 56.126015
},
{
"MediaId": "b5a003f0cd3f71ed919fe7e7c45b****",
"In": 271.47302,
"Effects": [
{
"Type": "Volume",
"Gain": 0
}
],
"Out": 277.393
},
{
"MediaId": "b5a003f0cd3f71ed919fe7e7c45b****",
"In": 326.03903,
"Effects": [
{
"Type": "Volume",
"Gain": 0
}
],
"Out": 331.959
},
{
"MediaId": "b5a003f0cd3f71ed919fe7e7c45b****",
"In": 372.20602,
"Effects": [
{
"Type": "Volume",
"Gain": 0
}
],
"Out": 375.126
},
{
"MediaId": "b5a003f0cd3f71ed919fe7e7c45b****",
"In": 383.03903,
"Effects": [
{
"Type": "Volume",
"Gain": 0
}
],
"Out": 388.959
},
{
"MediaId": "b5a003f0cd3f71ed919fe7e7c45b****",
"In": 581.339,
"Effects": [
{
"Type": "Volume",
"Gain": 0
}
],
"Out": 587.25903
},
{
"MediaId": "b5a003f0cd3f71ed919fe7e7c45b****",
"In": 602.339,
"Effects": [
{
"Type": "Volume",
"Gain": 0
}
],
"Out": 607.293
}
]
}
],
"AudioTracks": [
{
"AudioTrackClips": [
{
"LoopMode": true,
"MediaId": "icepublic-0c4475c3936f3a8743850f2da942ceee"
}
]
}
]
}
方式三:通过高级模板创作视频
特性
高效、高质量:提供了现成的模板,用户只需将自己的素材填充到模板中即可完成视频制作,大大节省了制作时间。用户还可以自行设计模板,从而提升视频质量。
视频风格统一:模板保证了视频作品风格的统一性和专业性,使得非专业用户也能制作出看起来专业且吸引人的视频。
使用步骤
基于步骤一中人脸检索的结果,您可以使用SubmitMediaProducingJob - 提交剪辑合成作业中的“高级模板+ClipsParam”来完成人脸集锦视频的剪辑,可以参考下文中的SDK调用示例,该示例以公共模板IceSys_VETemplate_s100241为例,根据人脸检索的结果配置视频切片。如果您需要自创的高级模板来进行人脸集锦的视频创作,建议阅读和参考操作指南-如何使用高级模板。
SDK调用示例
展开查看代码示例
package com.example;
import java.util.*;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.aliyun.ice20201109.Client;
import com.aliyun.ice20201109.models.*;
import com.aliyun.teaopenapi.models.Config;
/**
* 需要maven引入二方包依赖:
* <dependency>
* <groupId>com.aliyun</groupId>
* <artifactId>ice20201109</artifactId>
* <version>2.3.0</version>
* </dependency>
* <dependency>
* <groupId>com.alibaba</groupId>
* <artifactId>fastjson</artifactId>
* <version>1.2.9</version>
* </dependency>
*/
public class SubmitFaceEditingJobService {
static final String regionId = "cn-shanghai";
static final String bucket = "<your-bucket>";
/*** 基于人脸搜结果,提交人脸集锦剪辑任务 ****/
public static void submitEditingJob(String mediaId, SearchMediaClipByFaceResponse response) throws Exception {
Client iceClient = initClient();
JSONArray intervals = buildIntervals(response);
// 提交高级模板任务,以公共模板IceSys_VETemplate_s100241为例,根据人脸结果配置视频切片
JSONObject clipParams = buildClipParams(mediaId, intervals);
SubmitMediaProducingJobRequest request2 = new SubmitMediaProducingJobRequest();
request2.setTemplateId("IceSys_VETemplate_s100241");
request2.setClipsParam(clipParams.toJSONString());
request2.setOutputMediaTarget("oss-object");
outputConfig = new JSONObject();
outputConfig.put("MediaURL",
"https://" + bucket + ".oss-" + regionId + "/testTemplate/" + System.currentTimeMillis() + ".mp4");
request2.setOutputMediaConfig(outputConfig.toJSONString());
SubmitMediaProducingJobResponse response2 = iceClient.submitMediaProducingJob(request2);
System.out.println("JobId: " + response2.getBody().getJobId());
}
public Client initClient() throws Exception {
// 阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维。
// 本示例以将AccessKey ID和 AccessKey Secret保存在环境变量为例说明。配置方法请参见:https://help.aliyun.com/zh/sdk/developer-reference/v2-manage-access-credentials?spm=a2c4g.11186623.0.0.423350fbOTFdOB#2a38e5c14b4em
com.aliyun.credentials.Client credentialClient = new com.aliyun.credentials.Client();
Config config = new Config();
config.setCredential(credentialClient);
// 如需硬编码AccessKey ID和AccessKey Secret,代码如下,但强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。
// config.accessKeyId = <第二步创建的AccessKey ID>;
// config.accessKeySecret = <第二步创建的AccessKey Secret>;
config.endpoint = "ice." + regionId + ".aliyuncs.com";
config.regionId = regionId;
return new Client(config);
}
public JSONArray buildIntervals(SearchMediaClipByFaceResponse response) {
JSONArray intervals = new JSONArray();
List<SearchMediaClipByFaceResponseBodyMediaClipListOccurrencesInfos> occurrencesInfos =
response.getBody().getMediaClipList().get(0).getOccurrencesInfos();
for (SearchMediaClipByFaceResponseBodyMediaClipListOccurrencesInfos occurrence: occurrencesInfos) {
Float startTime = occurrence.getStartTime();
Float endTime = occurrence.getEndTime();
// 可自行调整筛选逻辑
// 过滤小于2s的片段
if (endTime - startTime < 2) {
continue;
}
// 片段大于6s截断
if (endTime - startTime > 6) {
endTime = startTime + 6;
}
JSONObject interval = new JSONObject();
interval.put("In", startTime);
interval.put("Out", endTime);
intervals.add(interval);
}
return intervals;
}
public JSONObject buildClipParams(String mediaId, JSONArray intervals) {
JSONObject clipParams = new JSONObject();
for (int i = 0; i< intervals.size(); i++) {
JSONObject interval = intervals.getJSONObject(i);
Float in = interval.getFloat("In");
Float out = interval.getFloat("Out");
clipParams.put("Media" + i, mediaId);
clipParams.put("Media" + i + ".clip_start", in);
}
return clipParams;
}
}
展开查看clipParams参数示例
{
"Media0": "b5a003f0cd3f71ed919fe7e7c45b****",
"Media0.clip_start": 54.066017,
"Media1": "b5a003f0cd3f71ed919fe7e7c45b****",
"Media1.clip_start": 67.33301,
"Media2": "b5a003f0cd3f71ed919fe7e7c45b****",
"Media2.clip_start": 271.47302,
"Media3": "b5a003f0cd3f71ed919fe7e7c45b****",
"Media3.clip_start": 326.03903,
"Media4": "b5a003f0cd3f71ed919fe7e7c45b****",
"Media4.clip_start": 372.20602,
"Media5": "b5a003f0cd3f71ed919fe7e7c45b****",
"Media5.clip_start": 383.03903,
"Media6": "b5a003f0cd3f71ed919fe7e7c45b****",
"Media6.clip_start": 581.339,
"Media7": "b5a003f0cd3f71ed919fe7e7c45b****",
"Media7.clip_start": 587.25903,
"Media8": "b5a003f0cd3f71ed919fe7e7c45b****",
"Media8.clip_start": 602.339
}
案例展示
通过Timeline剪辑创作视频 剪辑的是白衣5号选手的人脸集锦。 | 通过高级模板创作视频 成片中的转场和倍速效果均为模板效果。 |
脚本化自动成片创作视频-通过SDK生成 剪辑的是白衣5号选手的人脸集锦。 | 通过脚本化自动成片创作视频-通过控制台生成 剪辑的是白衣17号选手的人脸集锦。 |