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