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

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

最終更新日:Jan 12, 2025

このトピックでは、Intelligent Media Services(IMS)の顔検索と動画編集機能を使用して、顔のハイライトを効率的に作成および編集する方法について説明します。高品質な顔のハイライトを作成するために、このチュートリアルには、インテリジェントメディアアセット検索の基本操作、顔検索のAPI呼び出し手順、タイムラインの設定、高度なテンプレートの使用方法が含まれています。

背景情報

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

サンプルシナリオ

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

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

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

訪問者のエクスペリエンスを向上させるために、遊園地は、ジェットコースターでの叫び声やメリーゴーランドでの笑い声など、さまざまなアミューズメントプロジェクトでのハイライトを記録するためのパーソナライズされた動画クリップを作成する傾向があります。これらの動画のハイライトは、訪問者へのお土産や、遊園地のソーシャルメディアでのプロモーション資料として使用できます。

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

結婚サービス業界では、結婚式の動画は新婚夫婦にとって重要な思い出を記録します。結婚式の日の舞台裏とカップルの旅行の動画の両方を注意深く編集およびリミックスして、新婚夫婦のラブストーリーと結婚式のロマンチックな瞬間を示す必要があります。

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

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

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

手順

前提条件

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

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

IMS の顔検索機能を使用して、指定した顔が含まれている動画クリップに関する情報をクエリできます。詳細については、多数のメディアアセットで顔を検索するをご参照ください。

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

この手順では、使用シナリオ、手順、SDKサンプルコード、サンプル動画など、顔のハイライト動画を作成する2つの方法について説明します。

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

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

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

手順

手順 1 で顔検索を使用して動画クリップに関する情報を取得したら、SubmitMediaProducingJob オペレーションを呼び出して、メディア編集および制作ジョブを送信できます。タイムラインの設定方法の詳細については、タイムラインの設定をご参照ください。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 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 {
        // Alibaba Cloud アカウントの AccessKey ペアは、すべての API 操作に対するアクセス許可を持っています。API 操作を呼び出したり、日常的な O&M を実行したりするには、Resource Access Management (RAM) ユーザーの AccessKey ペアを使用することをお勧めします。
        // この例では、AccessKey ID と AccessKey シークレットは環境変数から取得されます。環境変数を設定して AccessKey ID と AccessKey シークレットを保存する方法については、https://www.alibabacloud.com/help/en/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 シークレットをハードコードするには、次の行を使用します。ただし、セキュリティ上の懸念から、AccessKey ID と 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();

            // フィルタリングロジックを調整できます。
            // 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 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;
    }

}

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

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

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

使用シナリオ
  • 効率的な動画制作:高度なテンプレートは、編集スキーム、特殊効果、トランジションがあらかじめ設定されています。テンプレートに独自の素材を追加するだけで済みます。制作プロセスが簡素化されているため、動画制作の経験がなくても始めることができます。

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

手順

手順 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");
        JSONObject 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 を実行したりするには、RAM ユーザーの AccessKey ペアを使用することをお勧めします。
        // この例では、AccessKey ID と AccessKey シークレットは環境変数から取得されます。環境変数を設定して AccessKey ID と AccessKey シークレットを保存する方法については、https://www.alibabacloud.com/help/en/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 シークレットをハードコードするには、次の行を使用します。ただし、セキュリティ上の懸念から、AccessKey ID と 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();

            // フィルタリングロジックを調整できます。
            // 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
}

関連情報