全部產品
Search
文件中心

Intelligent Media Services:人臉集錦視頻製作教程

更新時間:Jun 17, 2025

本實踐教程旨在通過詳細介紹智能媒體服務(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;

    }

}
通過控制台實現

如果選擇採用控制台進行視頻製作,則可以直接跳過“步驟一:通過人臉檢索截取視頻片段資訊”,按照以下步驟進行操作即可。

步驟一:點擊控制台左側模組“智能批量一鍵成片”,然後在“指令碼化自動成片”中點擊“建立指令碼化自動成片”,並選擇“產生模式”(口播模式和分組模式均可使用,本樣本將以分組模式為例進行介紹。)進入創作頁面。

image

步驟二:在“指令碼節點配置”中點擊添加素材,在右側“添加素材”彈窗中選擇“人臉檢索”,然後上傳人臉圖片搜尋素材。

步驟三:在搜尋結果列表中,點擊某個搜尋結果素材的【查看】按鈕,即可查看檢索命中的片段。隨後,點擊【匯入命中片段】並在列表下方點擊【確定】,便可將檢索命中的素材將被添加至指令碼節點中。

步驟四:若您希望查看或對人臉檢索命中的片段進行調整,請將滑鼠移至上方在素材上,然後點擊設定按鈕以開啟設定彈窗。在此,您可以在【視頻內容截取】下手動調整檢索命中的片段。(如無需調整出入點,可忽略步驟四。)

完成以上步驟後,後續操作按照指令碼化成片的正常使用流程(包括標題、背景音樂、貼紙logo及視頻設定)進行配置,並提交任務即可。

方式二:通過Timeline剪輯創作視頻

特性
  • 視頻內容自訂:Timeline提供了高度的自訂能力,允許使用者精確控制每一個剪輯點、特效、轉場和音頻。您能夠根據自己的創意和需求,自由組合和調整素材,創作出獨一無二的視頻作品。

  • 對靈活性要求較高:Timeline剪輯不受模板限制,可以根據專案需求隨時調整剪輯方案。無論是剪輯順序、特效添加還是音頻處理,都可以靈活應對,滿足多樣化的創作需求。

使用步驟

基於步驟一中人臉檢索的結果,您可以使用SubmitMediaProducingJob - 提交剪輯合成作業中的Timeline配置說明來完成人臉集錦視頻的剪輯,可以參考下文中的SDK調用樣本。若有更高的剪輯需求,例如特效設定、轉場效果、音頻處理等進階剪輯配置,建議閱讀和參考視訊剪輯基礎參數Timeline配置說明,以便更全面地瞭解如何利用視訊剪輯功能實現人臉集錦視頻的製作。

SDK調用樣本

展開查看程式碼範例

展開查看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://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 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號選手的人臉集錦。

相關參考文檔