すべてのプロダクト
Search
ドキュメントセンター

Intelligent Media Services:顔のハイライトの動画を作成する

最終更新日:Nov 10, 2025

このチュートリアルでは、インテリジェントメディアサービス (IMS) の顔検索とビデオ編集機能を効率的に使用して、顔のハイライトを作成および編集する方法について説明します。高品質な顔のハイライトの作成を開始できるように、このチュートリアルでは、インテリジェントなメディア資産検索の基本操作、顔検索の API 呼び出しプロシージャ、タイムライン構成、および高度なテンプレートの使用方法について説明します。

背景情報

ビデオコンテンツの急速な成長に伴い、主要なキャラクターのビデオクリップを迅速に特定し、制作することが重要な作業となっています。顔のハイライトは、ビデオプレゼンテーションの効果的な方法として、さまざまなシーンでの特定の活動を表示し、映画やテレビの制作、ニュースレポート、ソーシャルエンターテインメントなど、さまざまな分野で広く使用されています。以下のチュートリアルでは、IMS を効率的に使用して顔のハイライトビデオを制作する方法を示します。

サンプルシナリオ

シナリオ 1:マラソンなどのスポーツイベントでのアスリートのハイライト

マラソンなどのスポーツイベントでは、主催者や報道機関は、スプリントの瞬間や対戦相手を追い越す場面など、試合中のアスリートのハイライトビデオを制作する必要があります。これらのビデオハイライトは、アスリートのプロモーション、レビュー、および個人的な宣伝にとって重要です。

シナリオ 2:遊園地での訪問者のハイライト

来場者の体験を向上させるため、遊園地は、ジェットコースターで叫んだり、メリーゴーランドで笑ったりするなど、さまざまなアミューズメントプロジェクトでのハイライトを記録するために、来場者向けのパーソナライズされたビデオクリップを作成する傾向があります。これらのビデオハイライトは、来場者へのお土産や、遊園地のソーシャルメディアでのプロモーション資料として役立ちます。

シナリオ 3:結婚式などの儀式の舞台裏

ウェディングサービス業界では、ウェディングビデオは新婚夫婦にとって重要な思い出を記録します。結婚式当日の舞台裏と、カップルの旅行のビデオの両方を、新婚夫婦のラブストーリーと結婚式のロマンチックな瞬間を示すために、慎重に編集およびリミックスする必要があります。

シナリオ 4:コンサートでのファンの顔のコレクション

大規模なコンサートでは、主催者は観客の熱意とエンゲージメントを示すために、ファンの顔のコレクションを制作する傾向があります。これらの顔のハイライトは、コンサートを盛り上げるために大画面に表示したり、ソーシャルメディアでのプロモーション資料として使用したりできます。

さらに、顔のハイライトは、個人の回顧録、家族の記念ビデオ、観光プロモーションビデオ、企業の年次総会、イベントのレビューやインタラクションなど、さまざまな分野で広く使用できます。

手順

前提条件

IMSサーバー側 SDK がインストールされていること。詳細については、準備をご参照ください。SDK がインストールされている場合は、この手順をスキップします。

手順 1:顔検索を使用して動画クリップに関する情報をクエリする

インテリジェントメディアサービスの顔検索機能を使用して、ビデオ素材を取得し、顔を含むメディアセグメント情報を取得できます。このステップの詳細については、「多くのメディア資産から顔を検索する」をご参照ください。

手順 2:指定した顔が含まれている動画クリップを編集する

このステップでは、使用シナリオ、プロシージャ、SDK サンプルコード、サンプルビデオなど、顔のハイライトビデオを制作するための 3 つの方法について説明します。

方法 1: スクリプトベースの自動ビデオ制作を使用する

特徴
  • 便利で効率的: スクリプトベースの自動生成により、顔のハイライトビデオの制作プロセスがより便利になります。ユーザーは簡単な構成で、複数の類似したビデオを効率的に生成できます。

  • 習得が早く、参入障壁が低い: ビデオ編集の経験がなくても、強力なワンクリック制作機能により、印象的なビデオを簡単に制作できます。

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 {
        // Alibaba Cloud アカウントの AccessKey ペアは、すべての API 操作に対するアクセス権限を持っています。API の呼び出しや日常の O&M には、Resource Access Management (RAM) ユーザーの AccessKey ペアを使用することをお勧めします。
        // この例では、AccessKey ID と AccessKey Secret は環境変数から取得されます。環境変数を設定して 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 をハードコーディングしないことをお勧めします。
        // config.accessKeyId = <ステップ 2 で作成した AccessKey ID>;
        // config.accessKeySecret = <ステップ 2 で作成した 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();

            // フィルタリングロジックを調整できます
            // 2 秒未満のクリップを除外します
            if (endTime - startTime < 2) {
                continue;
            }
            // 6 秒より長いクリップを切り詰めます
            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);

        // カスタムバックグラウンドミュージック
        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;

    }

}
コンソールを介した実装

ビデオ制作にコンソールを使用する場合、「ステップ 1: 顔検索を使用してビデオクリップに関する情報をクエリする」をスキップし、代わりに次の手順に従います。

ステップ 1: コンソールの左側のサイドバーにある [インテリジェントバッチワンクリック制作] をクリックし、[スクリプトベースの自動制作] セクションの [スクリプトベースの自動制作を作成] をクリックし、[生成モード] を選択します (ボイスオーバーモードとグループモードの両方を使用できます。この例ではグループモードを使用します)。作成ページに入ります。

image

ステップ 2: [スクリプトノード設定] セクションの [素材を追加] をクリックします。右側の [素材を追加] ダイアログボックスで [顔検索] を選択し、顔画像をアップロードして素材を検索します。検索結果は以下のように表示されます。

ステップ 3: 検索結果リストで、検索結果素材の [表示] ボタンをクリックして、一致したセグメントを表示します。次に、[一致したセグメントをインポート] をクリックし、リストの下部にある [OK] をクリックして、一致した素材をスクリプトノードに追加します。

ステップ 4: 顔検索で一致したセグメントを表示または調整したい場合は、素材にカーソルを合わせ、設定ボタンをクリックして設定ダイアログボックスを開きます。ここで、[ビデオコンテンツのトリミング] で一致したセグメントを手動で調整できます。(インポイントとアウトポイントを調整する必要がない場合は、ステップ 4 をスキップできます。)

これらの手順を完了したら、通常のスクリプトベースの制作ワークフロー (タイトル、バックグラウンドミュージック、ステッカーロゴ、ビデオ設定を含む) に従って、タスクを設定して送信します。

方法 2: タイムラインを使用する

特徴
  • 高度にカスタマイズされた動画コンテンツ:タイムライン編集は高度にカスタマイズ可能です。各トリム、特殊効果、トランジション、オーディオ効果を制御できます。独自のインスピレーションと要件に基づいて素材を組み合わせて調整し、独自の動画を作成できます。

  • 高い柔軟性:タイムライン編集はテンプレートに制限されません。プロジェクトの要件に基づいて、いつでも編集スキームを調整できます。タイムライン編集は、クリップシーケンスの調整、特殊効果の追加、オーディオ効果の管理など、多様な動画制作要件を満たすのに役立ちます。

手順

ステップ 1 の顔検索結果に基づいて、SubmitMediaProducingJob 操作と タイムライン構成 を使用して、顔のハイライトビデオを編集できます。次のセクションの SDK サンプルコード を参照できます。特殊効果、トランジション、オーディオ処理などの高度な編集要件については、「ビデオ編集の基本パラメーター」および「タイムライン構成」を読んで参照し、ビデオ編集機能を使用して顔のハイライトビデオを制作する方法をより包括的に理解することをお勧めします。

SDK サンプルコード

コードの表示

タイムラインパラメーターの表示

{
  "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"
        }
      ]
    }
  ]
}

方法 3: 高度なテンプレートを使用する

特徴
  • 効率的で高品質: 高度なテンプレートは既製のテンプレートを提供します。ビデオ制作を完了するには、独自の素材をテンプレートに追加するだけでよく、制作時間を大幅に節約できます。また、独自のテンプレートを設計してビデオの品質を向上させることもできます。

  • 一貫した動画スタイル:テンプレートは、動画スタイルの一貫性とプロフェッショナリズムを保証します。動画制作の専門的なスキルがなくても、クリック率の高いプロフェッショナルな動画を作成できます。

手順

ステップ 1 の顔検索結果に基づいて、「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 {
        // Alibaba Cloud アカウントの AccessKey ペアは、すべての API 操作に対するアクセス権限を持っています。API の呼び出しや日常の O&M には、Resource Access Management (RAM) ユーザーの AccessKey ペアを使用することをお勧めします。
        // この例では、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 = <ステップ 2 で作成した AccessKey ID>;
        // config.accessKeySecret = <ステップ 2 で作成した 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();

            // フィルタリングロジックを調整できます
            // 2 秒未満のクリップを除外します
            if (endTime - startTime < 2) {
                continue;
            }
            // 6 秒より長いクリップを切り詰めます
            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
}

サンプルビデオ

タイムライン編集を使用して作成されたビデオ

これは、背番号 5 の白いジャージを着た選手の顔のハイライトビデオです。

高度なテンプレートを使用して作成されたビデオ

最終的なビデオのトランジションと速度効果はすべてテンプレートの効果です。

スクリプトベースの自動制作を使用して作成されたビデオ - SDK メソッド

これは、背番号 5 の白いジャージを着た選手の顔のハイライトビデオです。

スクリプトベースの自動制作を使用して作成されたビデオ - コンソールメソッド

これは、背番号 17 の白いジャージを着た選手の顔のハイライトビデオです。

関連情報