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

Intelligent Media Services:準備

最終更新日:Mar 01, 2026

Intelligent Media Services (IMS) SDK を使用して SubmitMediaProducingJob API を呼び出し、バッチビデオ制作を実行する方法について説明します。

バッチビデオ制作とは

バッチビデオ制作では、音声アセットとビデオアセットのグループをナレーションと組み合わせて、複数のユニークなビデオを作成できます。

利用シーン

ショートビデオプラットフォームをマーケティングに利用する企業が増えるにつれて、複数のキーオピニオンリーダー (KOL) やマーケティングアカウントに広告を配信する必要性が高まっています。これらのプラットフォームでは、同一コンテンツをブロックする重複排除メカニズムを回避するために、各ビデオをユニークにする必要があります。バッチビデオ制作は、一連のメディアアセットから多くのバリエーションを作成できるようにすることで、この問題を解決します。SubmitMediaProducingJob API の Timeline パラメーターをカスタマイズすることで、さまざまな制作結果を得ることができます。

課金

ビデオ編集および制作ジョブを送信すると、複数の課金項目で料金が発生する場合があります。詳細については、「インテリジェントプロダクション」をご参照ください。

仕組み

  • SubmitMediaProducingJob API を使用して、さまざまな タイムラインパラメーターの設定 で編集ジョブを送信することにより、1 つ以上のビデオ、音声、画像、字幕アセットを最終的なビデオに結合します。

  • タイムラインは、クリエイティブなビジョンに従ってメディアアセットとエフェクトを整理します。主に、トラック、クリップ、エフェクトの 3 種類のオブジェクトで構成されます。詳細については、「タイムラインの設定」をご参照ください。

  • インテリジェントプロダクションは、ライブストリーム、オンデマンドビデオ、および OSS のアセットファイルに対する編集、エフェクトレンダリング、テンプレートベースの制作をサポートします。詳細については、「インテリジェントプロダクションの概要」をご参照ください。

前提条件

ステップ 1:OSSバケットを作成する

OSS コンソールにログインし、[バケット] > [バケットの作成] を選択し、[リージョン][中国 (上海)] に設定します。バケット名は、最終的なビデオの出力先として使用され、後続のステップで必要になるため、メモしておいてください。

image

ステップ 2:コードの実行

  1. 環境要件:

    • オペレーティングシステム (OS):Windows 8.1 以降、macOS、または Linux。

    • IntelliJ IDEA 2020.1 以降。

    • JDK 1.8 以降。

  2. 新しい Maven プロジェクトを作成してコードを実行します。

  3. 必要なサードパーティの依存関係をインポートします。

    説明

    次のサンプルコードの SDK バージョンは参考用です。最新バージョンについては、「サーバーサイド SDK」をご参照ください。

    <dependencies>
      <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>
    </dependencies>

    image.png

  4. AccessKey IDAccessKey Secret を設定します。手順については、「アクセス認証情報の管理」をご参照ください。

    説明

    認証情報を管理するその他の方法については、「アクセス認証情報の管理」をご参照ください。

  5. 新しい Java クラスを作成し、次のサンプルコードを貼り付けます。

    サンプルコードを展開して表示

    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;
    
    import java.util.*;
    
    // ビデオ URL
    // http://oushu-test-shanghai.oss-cn-shanghai.aliyuncs.com/ice_output/46b29eb5775f4f758846171ab79bfca7.mp4
    
    /**
     *  必要な 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 BatchProduceAlignment {
    
        static final String regionId = "cn-shanghai";
        static final String bucket = "ステップ 1 で作成したバケット";
        private Client iceClient;
        
        public static void main(String[] args) {
            try {
                BatchProduceAlignment batchProduce = new BatchProduceAlignment();
                batchProduce.initClient();
                batchProduce.run();
            } catch (Exception e) {
                System.out.println("制作に失敗しました。例外: " + e.toString());
            }
        }
    
        public void initClient() throws Exception {
    
            // Alibaba Cloud アカウントの AccessKey ペアは、すべての API 操作を呼び出す権限を持っています。API 操作の呼び出しや日常の O&M (運用保守) には、RAM ユーザーを使用することを推奨します。 
            // この例では、AccessKey ID と AccessKey Secret を環境変数に保存する方法を示します。環境変数の設定方法の詳細については、https://www.alibabacloud.com/help/ja/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 をハードコーディングする場合は、次のコードを使用します。ただし、セキュリティリスクを回避するため、プロジェクトコードに保存しないことを強く推奨します。
            // config.accessKeyId = <your AccessKey ID>;
            // config.accessKeySecret = <your AccessKey Secret>;
            config.endpoint = "ice." + regionId + ".aliyuncs.com";
            config.regionId = regionId;
            iceClient = new Client(config);
        }
    
        public void run() throws Exception {
            // テキスト素材。
            String text = "人々は人生を様々な味で表現します。なぜなら、味は誰もが心に抱く感情であることを理解しているからです。この時代、誰もが多くの痛みと喜びを経験してきました。人々は心の苦しみを隠し、幸せを食事に変え、季節を通じて食卓に並べる傾向があります。";
            // ビデオ素材。
            String[] videoArray = new String[]{
                    "https://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/food/f1.mp4",
                    "https://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/food/f2.mp4",
                    "https://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/food/f3.mp4",
                    "https://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/food/f4.mp4",
                    "https://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/food/f5.mp4",
                    "https://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/food/f6.mp4",
                    "https://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/food/f7.mp4",
                    "https://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/food/f8.mp4",
                    "https://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/food/f9.mp4",
                    "https://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/food/f10.mp4",
                    "https://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/food/f11.mp4",
                    "https://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/food/f12.mp4",
                    "https://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/food/f13.mp4",
                    "https://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/food/f14.mp4",
                    "https://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/food/f15.mp4",
                    "https://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/food/f16.mp4",
                    "https://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/food/f17.mp4",
                    "https://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/food/f18.mp4"
            };
            // BGM 素材。
            String[] bgMusicArray = new String[]{
                    "https://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/music/m1.wav",
                    "https://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/music/m2.wav",
                    "https://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/music/m3.wav"
            };
            // ビデオタイトル。
            String title = "舌の上のごちそう";
            // 制作するビデオの数。
            int produceCount = 3;
    
            // ジョブを一括で送信します。
            List<String> jobIds = new ArrayList<String>();
            for (int i = 0; i < produceCount; i++) {
                String jobId = produceSingleVideo(title, text, videoArray, bgMusicArray);
                jobIds.add(jobId);
            }
            // すべてのジョブが完了するまでジョブのステータスをポーリングします。
            System.out.println("ジョブの完了を待機しています...");
            while (true) {
                Thread.sleep(3000);
                boolean allFinished = true;
                for (int i = 0; i < jobIds.size(); i++) {
                    String jobId = jobIds.get(i);
                    GetMediaProducingJobRequest req = new GetMediaProducingJobRequest();
                    req.setJobId(jobId);
                    GetMediaProducingJobResponse response = iceClient.getMediaProducingJob(req);
                    GetMediaProducingJobResponseBody.GetMediaProducingJobResponseBodyMediaProducingJob mediaProducingJob = response.getBody().getMediaProducingJob();
                    String status = mediaProducingJob.getStatus();
                    System.out.println("jobId: " + mediaProducingJob.getJobId() + ", status: " + status);
                    if ("Failed".equalsIgnoreCase(status)) {
                        System.out.println("ジョブが失敗しました。jobInfo: " + JSONObject.toJSONString(mediaProducingJob));
                        throw new Exception("制作に失敗しました。jobid: " + mediaProducingJob.getJobId());
                    }
                    if (!"Success".equalsIgnoreCase(status)) {
                        allFinished = false;
                        break;
                    }
                }
                if (allFinished) {
                    System.out.println("すべてのジョブが完了しました。");
                    break;
                }
            }
        }
    
        public String produceSingleVideo(String title, String text, String[] videoArray, String[] bgMusicArray) throws Exception {
            text = text.replace(",", "。");
            text = text.replace("\n", "。");
            String[] sentenceArray = text.split("。");
    
            JSONArray videoClipArray = new JSONArray();
            JSONArray audioClipArray = new JSONArray();
    
            List<String> videoList = Arrays.asList(videoArray);
            Collections.shuffle(videoList);
    
            for (int i = 0; i < sentenceArray.length; i++) {
                String sentence = sentenceArray[i];
                String clipId = "clip" + i;
                String videoUrl = videoList.get(i);
                String videoClip = "{\"MediaURL\":\""+videoUrl+"\",\"ReferenceClipId\":\""+clipId+"\",\"Effects\":[{\"Type\":\"Background\",\"SubType\":\"Blur\",\"Radius\":0.1}]}";
                videoClipArray.add(JSONObject.parseObject(videoClip));
                String audioClip = "{\"Type\":\"AI_TTS\",\"Content\":\"" + sentence + "\",\"Voice\":\"zhichu\",\"ClipId\":\""+clipId+"\",\"Effects\":[{\"Type\":\"AI_ASR\",\"Font\":\"Alibaba PuHuiTi\",\"Alignment\":\"TopCenter\",\"Y\":0.75,\"FontSize\":55,\"FontColor\":\"#ffffff\",\"AdaptMode\":\"AutoWrap\",\"TextWidth\":0.8,\"Outline\":2,\"OutlineColour\":\"#000000\"}]}";
                audioClipArray.add(JSONObject.parseObject(audioClip));
            }
    
            String subtitleTrack = "{\"SubtitleTrackClips\":[{\"Type\":\"Text\",\"Font\":\"HappyZcool-2016\",\"Content\":\""+title+"\",\"FontSize\":80,\"FontColor\":\"#ffffff\",\"Y\":0.15,\"Alignment\":\"TopCenter\",\"EffectColorStyle\":\"CS0004-000005\",\"FontFace\":{\"Bold\":true,\"Italic\":false,\"Underline\":false}}]}";
    
            int bgMusicIndex = (int)(Math.random() * bgMusicArray.length);
            String bgMusicUrl = bgMusicArray[bgMusicIndex];
            String timeline = "{\"VideoTracks\":[{\"VideoTrackClips\":"+videoClipArray.toJSONString()+"}],\"AudioTracks\":[{\"AudioTrackClips\":"+audioClipArray.toJSONString()+"},{\"AudioTrackClips\":[{\"MediaURL\":\""+bgMusicUrl+"\"}]}],\"SubtitleTracks\":[" + subtitleTrack + "]}";
    
            //
            String targetFileName = UUID.randomUUID().toString().replace("-", "");
            String outputMediaUrl = "http://" + bucket + ".oss-" + regionId + ".aliyuncs.com/ice_output/" + targetFileName + ".mp4";
            int width = 720;
            int height = 1280;
            String outputMediaConfig = "{\"MediaURL\":\"" + outputMediaUrl + "\",\"Width\":"+width+",\"Height\":"+height+"}";
    
            SubmitMediaProducingJobRequest request = new SubmitMediaProducingJobRequest();
            request.setTimeline(timeline);
            request.setOutputMediaConfig(outputMediaConfig);
            SubmitMediaProducingJobResponse response = iceClient.submitMediaProducingJob(request);
            System.out.println("ジョブを開始しました。jobid: " + response.getBody().getJobId() + ", outputMediaUrl: " + outputMediaUrl);
            return response.getBody().getJobId();
        }
    
    }

  6. コード内の bucket プレースホルダーを、ステップ 1 で作成したバケットの名前に置き換えます。

  7. [実行] をクリックしてビデオを生成します。コードの全体的なワークフローは次のとおりです:タイムラインの生成 -> ビデオ制作ジョブの送信 -> ジョブステータスのポーリング -> コンソールへのログ出力。

    image.pngimage.png

  8. outputMediaUrl は出力アドレスです。ジョブのステータスが Success の場合、最終的なビデオをプレビューできます。バケットは非公開であるため、URL には直接アクセスできません。ビデオをプレビューするには、OSS コンソールに移動し、出力ファイルを見つけて [オブジェクト URL のコピー] をクリックし、署名付き URL を取得します。

    image

  9. コード内の produceCount 変数は、制作するビデオの数を指定します。コード内のサンプルテキストとビデオアセットを独自のコンテンツに置き換えることができます。詳細については、「タイムラインの設定」をご参照ください。image.png

関連情報

次のステップ