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;
}
}