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

ApsaraVideo Media Processing:ビデオのマージと編集

最終更新日:Mar 01, 2025

ビデオマージを使用すると、異なるフォーマット、ビットレート、解像度のビデオを、特定のフォーマット、ビットレート、解像度の長いビデオにマージできます。 通常、ビデオにオープニングまたはエンディングパートを追加したり、録画されたライブストリームのクリップをマージしたりするために使用されます。 ビデオクリッピングを使用すると、元のビデオからクリップをキャプチャし、クリップを新しいビデオとして保存できます。 通常、ビデオからハイライト部分をキャプチャするために使用されます。 このトピックでは、ApsaraVideo Media Processing(MPS) Java SDK を使用してビデオをマージおよび編集する方法について説明します。

シナリオ

  • イントロビデオと固定のアウトロビデオ:ビデオの開始部分または終了部分を追加したり、録画されたライブストリームのクリップをマージしたりするために使用されます。

  • クリップスプライシング:ビデオの特定のクリップを切り取り、クリップを新しいビデオファイルとして出力します。 この方法は通常、ビデオからハイライトをキャプチャするために使用されます。

  • オープニングとエンディング:入力ビデオの最初と最後にオープニングとエンディングのパートを埋め込むことができる特別なマージ効果。 オープニングパートはピクチャインピクチャ(PiP)モードで表示されます。

複数のビデオクリップを順番にマージする

たとえば、入力ビデオは 00:00:03.000 からキャプチャされ、 00:00:00:13.000 秒間続きます。 キャプチャされたビデオは、オープニングの 00:00:01.000 から 00:00:05.030 までの部分とマージされます。 結果のビデオの合計再生時間は 17.30 秒です。

/**
     * 複数のビデオクリップを順番にマージします。
     * @return
     * @throws Exception
     */
    public static void mergrUrlListJob() throws Exception {

        // 出力パラメータを構築します。
        JSONArray outputs = new JSONArray();

        // ジョブ入力を構成します。 ジョブ入力として使用されるメディアファイルが、クライアントと同じリージョンにあることを確認してください。
        JSONObject input = new JSONObject();
        input.put("Bucket", "<your bucket name>");
        input.put("Location", "oss-cn-shanghai");

        // ジョブ出力を構成します。
        JSONObject output = new JSONObject();
        try {
            input.put("Object", URLEncoder.encode("mps-test/demo/test.mp4", "utf-8"));
            String outPutObject = URLEncoder.encode("mps-test/demo/merge-out.mp4", "utf-8");
            output.put("OutputObject", outPutObject);
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException("input URL encode failed");
        }
        output.put("TemplateId", "<transcode templateId>");

        // ビデオクリッピングのデータを構築します。
        JSONObject clip = new JSONObject();
        // ビデオを 1.000 秒から 5.030 秒まで切り取ります。
        clip.put("TimeSpan", "{\"Seek\":\"00:00:01.000\",\"Duration\":\"5.30\"}");
        // ビデオの末尾から残っているビデオを 1.000 秒から 5.030 秒まで切り取ります。
        //clip.put("TimeSpan", "{\"Seek\":\"00:00:01.000\",\"End\":\"5.30\"}");
        // ビデオの最初のクリップを編集するかどうかを指定します。 有効な値:true および false。 true の値は、編集後にビデオクリップがトランスコーディングジョブのためにマージされることを指定します。 false の値は、編集前にビデオクリップがトランスコーディングジョブのためにマージされることを指定します。
        clip.put("ConfigToClipFirstPart", true);

        // ビデオマージのデータを構築します。
        JSONArray mergeList = new JSONArray();
        JSONObject merge = new JSONObject();
        merge.put("MergeURL", "http://bucket-name.oss-cn-shanghai.aliyuncs.com/" + URLEncoder.encode("mps-test/demo/test2mp4", "utf-8"));
        merge.put("Start", "00:00:03.000");
        merge.put("Duration", "00:00:13.000");

        mergeList.add(merge);
        output.put("Clip", clip);
        output.put("MergeList", mergeList);

        outputs.add(output);

        com.aliyun.mts20140618.Client client = MergeClipJobs.createClient();
        com.aliyun.mts20140618.models.SubmitJobsRequest submitJobsRequest = new com.aliyun.mts20140618.models.SubmitJobsRequest()
                // ジョブ入力。
                .setInput(input.toJSONString())
                // ジョブ出力構成。
                .setOutputs(outputs.toJSONString())
                // 出力ファイルが格納される OSS バケット。
                .setOutputBucket("exampleBucket")
                // OSS バケットが存在するリージョン。
                .setOutputLocation("oss-cn-shanghai")
                // パイプラインの ID。
                .setPipelineId("dd3dae411e704030b921e52698e5****");
        com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
        try {
            // 必要に応じて、API 操作の応答を表示するための独自のコードを記述します。
            client.submitJobsWithOptions(submitJobsRequest, runtime);
        } catch (TeaException error) {
            // 実際のビジネスシナリオでは、例外を慎重に処理し、プロジェクトの例外を無視しないでください。 この例では、例外は参照用にのみ提供されています。
            // エラーメッセージ。
            System.out.println(error.getMessage());
            // トラブルシューティング用の URL。
            System.out.println(error.getData().get("Recommend"));
            com.aliyun.teautil.Common.assertAsString(error.message);
        } catch (Exception _error) {
            TeaException error = new TeaException(_error.getMessage(), _error);
            // 実際のビジネスシナリオでは、例外を慎重に処理し、プロジェクトの例外を無視しないでください。 この例では、例外は参照用にのみ提供されています。
            // エラーメッセージ。
            System.out.println(error.getMessage());
            // トラブルシューティング用の URL。
            System.out.println(error.getData().get("Recommend"));
            com.aliyun.teautil.Common.assertAsString(error.message);
        }
    }

構成ファイルの OSS パスを使用してビデオクリップをマージする

たとえば、入力ビデオは 00:00:03.000 からキャプチャされ、 00:00:00:10.000 秒間続きます。 キャプチャされたビデオは、オープニングの 00:00:01.000 から 00:00:05.030 までの部分とマージされます。

mergeConfigfile のサンプルコンテンツ:

{"MergeList":[{"MergeURL":"https://bucket-name.oss-cn-beijing.aliyuncs.com/mps-test/demo/test2.mp4","Start":"00:00:03.000","Duration":"00:00:10.000"}]}

/**
     * 構成ファイルの OSS パスを使用してビデオクリップをマージします。
     * @return
     * @throws Exception
     */
    public static void mergrConfigFileJob() throws Exception {

        // 出力パラメータを構築します。
        JSONArray outputs = new JSONArray();

        // ジョブ入力を構成します。 ジョブ入力として使用されるメディアファイルが、クライアントと同じリージョンにあることを確認してください。
        JSONObject input = new JSONObject();
        input.put("Bucket", "<your bucket name>");
        input.put("Location", "oss-cn-shanghai");

        // ジョブ出力を構成します。
        JSONObject output = new JSONObject();
        try {
            input.put("Object", URLEncoder.encode("mps-test/demo/test.mp4", "utf-8"));
            String outPutObject = URLEncoder.encode("mps-test/demo/merge-out.mp4", "utf-8");
            output.put("OutputObject", outPutObject);
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException("input URL encode failed");
        }
        output.put("TemplateId", "<transcode templateId>");

        // ビデオクリッピングのデータを構築します。
        JSONObject clip = new JSONObject();
        // ビデオを 1.000 秒から 5.030 秒まで切り取ります。
        clip.put("TimeSpan", "{\"Seek\":\"00:00:01.000\",\"Duration\":\"5.30\"}");
        // ビデオの末尾から残っているビデオを 1.000 秒から 5.030 秒まで切り取ります。
        //clip.put("TimeSpan", "{\"Seek\":\"00:00:01.000\",\"End\":\"5.30\"}");
        // ビデオの最初のクリップを編集するかどうかを指定します。 有効な値:true および false。 true の値は、編集後にビデオクリップがトランスコーディングジョブのためにマージされることを指定します。 false の値は、編集前にビデオクリップがトランスコーディングジョブのためにマージされることを指定します。
        clip.put("ConfigToClipFirstPart", true);

        output.put("Clip", clip);
        // 構成ファイルの OSS パスは HTTP URL である必要があります。
        output.put("MergeConfigUrl", "http://bucket-name.oss-cn-shanghai.aliyuncs.com/mps-test/demo/mergeConfigfile");

        outputs.add(output);

        com.aliyun.mts20140618.Client client = MergeClipJobs.createClient();
        com.aliyun.mts20140618.models.SubmitJobsRequest submitJobsRequest = new com.aliyun.mts20140618.models.SubmitJobsRequest()
                // ジョブ入力。
                .setInput(input.toJSONString())
                // ジョブ出力構成。
                .setOutputs(outputs.toJSONString())
                // 出力ファイルが格納される OSS バケット。
                .setOutputBucket("exampleBucket")
                // OSS バケットが存在するリージョン。
                .setOutputLocation("oss-cn-shanghai")
                // パイプラインの ID。
                .setPipelineId("dd3dae411e704030b921e52698e5****");
        com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
        try {
            // 必要に応じて、API 操作の応答を表示するための独自のコードを記述します。
            client.submitJobsWithOptions(submitJobsRequest, runtime);
        } catch (TeaException error) {
            // 実際のビジネスシナリオでは、例外を慎重に処理し、プロジェクトの例外を無視しないでください。 この例では、例外は参照用にのみ提供されています。
            // エラーメッセージ。
            System.out.println(error.getMessage());
            // トラブルシューティング用の URL。
            System.out.println(error.getData().get("Recommend"));
            com.aliyun.teautil.Common.assertAsString(error.message);
        } catch (Exception _error) {
            TeaException error = new TeaException(_error.getMessage(), _error);
            // 実際のビジネスシナリオでは、例外を慎重に処理し、プロジェクトの例外を無視しないでください。 この例では、例外は参照用にのみ提供されています。
            // エラーメッセージ。
            System.out.println(error.getMessage());
            // トラブルシューティング用の URL。
            System.out.println(error.getData().get("Recommend"));
            com.aliyun.teautil.Common.assertAsString(error.message);
        }
    }

入力ビデオの先頭にオープニングパートを埋め込むか、入力ビデオの末尾にエンディングパートを追加する

たとえば、入力ビデオの 3 秒目に解像度 680 × 480 のオープニングパートが追加されます。 また、入力ビデオの末尾に解像度 680 × 480 のエンディングパートが追加されます。 エンディングパートの後に追加された空白部分は、白色の背景で塗りつぶされます。

説明

オープニングパートとエンディングパートの URL で指定されたオブジェクトは UTF-8 エンコードされている必要があり、URL は HTTP アドレスである必要があります。 詳細については、「URL エンコーディング」をご参照ください。

 /**
     * 入力ビデオの先頭にオープニングパートを埋め込むか、入力ビデオの末尾にエンディングパートを追加します。
     * @return
     * @throws Exception
     */
    public static void openAndTailJob() throws Exception {

        // 出力パラメータを構築します。
        JSONArray outputs = new JSONArray();

        // ジョブ入力を構成します。 ジョブ入力として使用されるメディアファイルが、クライアントと同じリージョンにあることを確認してください。
        JSONObject input = new JSONObject();
        input.put("Bucket", "<your bucket name>");
        input.put("Location", "oss-cn-shanghai");

        // ジョブ出力を構成します。
        JSONObject output = new JSONObject();
        try {
            input.put("Object", URLEncoder.encode("mps-test/demo/test.mp4", "utf-8"));
            String outPutObject = URLEncoder.encode("mps-test/demo/merge-out.mp4", "utf-8");
            output.put("OutputObject", outPutObject);
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException("input URL encode failed");
        }
        output.put("TemplateId", "<transcode templateId>");

        JSONArray openingList = new JSONArray();
        JSONObject opening = new JSONObject();
        opening.put("OpenUrl", "http://bucket-name.oss-cn-shanghai.aliyuncs.com/" + URLEncoder.encode("mps-test/demo/open.mp4", "utf-8"));
        opening.put("Start", "3");
        opening.put("Width", "680");
        opening.put("Height", "480");
        openingList.add(opening);

        JSONArray tailSlateList = new JSONArray();
        JSONObject tailSlate = new JSONObject();
        // オープニングパートとエンディングパートの URL で指定されたオブジェクトは UTF-8 エンコードされている必要があります。
        tailSlate.put("TailUrl", "http://bucket-name.oss-cn-shanghai.aliyuncs.com/" + URLEncoder.encode("mps-test/demo/tail.mp4", "utf-8"));
        tailSlate.put("BlendDuration", "2");
        tailSlate.put("Width", "680");
        tailSlate.put("Height", "480");
        tailSlate.put("IsMergeAudio", true);
        tailSlate.put("BgColor", "White");
        tailSlateList.add(tailSlate);

        output.put("OpeningList", openingList);
        output.put("TailSlateList", tailSlateList);
        outputs.add(output);

        com.aliyun.mts20140618.Client client = MergeClipJobs.createClient();
        com.aliyun.mts20140618.models.SubmitJobsRequest submitJobsRequest = new com.aliyun.mts20140618.models.SubmitJobsRequest()
                // ジョブ入力。
                .setInput(input.toJSONString())
                // ジョブ出力構成。
                .setOutputs(outputs.toJSONString())
                // 出力ファイルが格納される OSS バケット。
                .setOutputBucket("exampleBucket")
                // OSS バケットが存在するリージョン。
                .setOutputLocation("oss-cn-shanghai")
                // パイプラインの ID。
                .setPipelineId("dd3dae411e704030b921e52698e5****");
        com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
        try {
            // 必要に応じて、API 操作の応答を表示するための独自のコードを記述します。
            client.submitJobsWithOptions(submitJobsRequest, runtime);
        } catch (TeaException error) {
            // 実際のビジネスシナリオでは、例外を慎重に処理し、プロジェクトの例外を無視しないでください。 この例では、例外は参照用にのみ提供されています。
            // エラーメッセージ。
            System.out.println(error.getMessage());
            // トラブルシューティング用の URL。
            System.out.println(error.getData().get("Recommend"));
            com.aliyun.teautil.Common.assertAsString(error.message);
        } catch (Exception _error) {
            TeaException error = new TeaException(_error.getMessage(), _error);
            // 実際のビジネスシナリオでは、例外を慎重に処理し、プロジェクトの例外を無視しないでください。 この例では、例外は参照用にのみ提供されています。
            // エラーメッセージ。
            System.out.println(error.getMessage());
            // トラブルシューティング用の URL。
            System.out.println(error.getData().get("Recommend"));
            com.aliyun.teautil.Common.assertAsString(error.message);
        }
    }

完全なサンプルコード

package com.alibaba.bltest.api_v2;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.aliyun.tea.TeaException;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

public class MergeClipJobs {

    /**
     * <b>説明</b> :
     * <p>AccessKey ペアを使用してクライアントを初期化します。</p>
     * @return Client
     *
     * @throws Exception
     */
    public static com.aliyun.mts20140618.Client createClient() throws Exception {

        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
                // 必須。 ALIBABA_CLOUD_ACCESS_KEY_ID 環境変数が構成されていることを確認してください。
                .setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
                // 必須。 ALIBABA_CLOUD_ACCESS_KEY_SECRET 環境変数が構成されていることを確認してください。
                .setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        config.endpoint = "mts.cn-shanghai.aliyuncs.com";
        return new com.aliyun.mts20140618.Client(config);
    }

    /**
     * 複数のビデオクリップを順番にマージします。
     * @return
     * @throws Exception
     */
    public static void mergrUrlListJob() throws Exception {

        // 出力パラメータを構築します。
        JSONArray outputs = new JSONArray();

        // ジョブ入力を構成します。 ジョブ入力として使用されるメディアファイルが、クライアントと同じリージョンにあることを確認してください。
        JSONObject input = new JSONObject();
        input.put("Bucket", "<your bucket name>");
        input.put("Location", "oss-cn-shanghai");

        // ジョブ出力を構成します。
        JSONObject output = new JSONObject();
        try {
            input.put("Object", URLEncoder.encode("mps-test/demo/test.mp4", "utf-8"));
            String outPutObject = URLEncoder.encode("mps-test/demo/merge-out.mp4", "utf-8");
            output.put("OutputObject", outPutObject);
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException("input URL encode failed");
        }
        output.put("TemplateId", "<transcode templateId>");

        // ビデオクリッピングのデータを構築します。
        JSONObject clip = new JSONObject();
        // ビデオを 1.000 秒から 5.030 秒まで切り取ります。
        clip.put("TimeSpan", "{\"Seek\":\"00:00:01.000\",\"Duration\":\"5.30\"}");
        // ビデオの末尾から残っているビデオを 1.000 秒から 5.030 秒まで切り取ります。
        //clip.put("TimeSpan", "{\"Seek\":\"00:00:01.000\",\"End\":\"5.30\"}");
        // ビデオの最初のクリップを編集するかどうかを指定します。 有効な値:true および false。 true の値は、編集後にビデオクリップがトランスコーディングジョブのためにマージされることを指定します。 false の値は、編集前にビデオクリップがトランスコーディングジョブのためにマージされることを指定します。
        clip.put("ConfigToClipFirstPart", true);

        // ビデオマージのデータを構築します。
        JSONArray mergeList = new JSONArray();
        JSONObject merge = new JSONObject();
        merge.put("MergeURL", "http://bucket-name.oss-cn-shanghai.aliyuncs.com/" + URLEncoder.encode("mps-test/demo/test2mp4", "utf-8"));
        merge.put("Start", "00:00:03.000");
        merge.put("Duration", "00:00:13.000");

        mergeList.add(merge);
        output.put("Clip", clip);
        output.put("MergeList", mergeList);

        outputs.add(output);

        com.aliyun.mts20140618.Client client = MergeClipJobs.createClient();
        com.aliyun.mts20140618.models.SubmitJobsRequest submitJobsRequest = new com.aliyun.mts20140618.models.SubmitJobsRequest()
                // ジョブ入力。
                .setInput(input.toJSONString())
                // ジョブ出力構成。
                .setOutputs(outputs.toJSONString())
                // 出力ファイルが格納される OSS バケット。
                .setOutputBucket("exampleBucket")
                // OSS バケットが存在するリージョン。
                .setOutputLocation("oss-cn-shanghai")
                // パイプラインの ID。
                .setPipelineId("dd3dae411e704030b921e52698e5****");
        com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
        try {
            // 必要に応じて、API 操作の応答を表示するための独自のコードを記述します。
            client.submitJobsWithOptions(submitJobsRequest, runtime);
        } catch (TeaException error) {
            // 実際のビジネスシナリオでは、例外を慎重に処理し、プロジェクトの例外を無視しないでください。 この例では、例外は参照用にのみ提供されています。
            // エラーメッセージ。
            System.out.println(error.getMessage());
            // トラブルシューティング用の URL。
            System.out.println(error.getData().get("Recommend"));
            com.aliyun.teautil.Common.assertAsString(error.message);
        } catch (Exception _error) {
            TeaException error = new TeaException(_error.getMessage(), _error);
            // 実際のビジネスシナリオでは、例外を慎重に処理し、プロジェクトの例外を無視しないでください。 この例では、例外は参照用にのみ提供されています。
            // エラーメッセージ。
            System.out.println(error.getMessage());
            // トラブルシューティング用の URL。
            System.out.println(error.getData().get("Recommend"));
            com.aliyun.teautil.Common.assertAsString(error.message);
        }
    }

    /**
     * 構成ファイルの OSS パスを使用してビデオクリップをマージします。
     * @return
     * @throws Exception
     */
    public static void mergrConfigFileJob() throws Exception {

        // 出力パラメータを構築します。
        JSONArray outputs = new JSONArray();

        // ジョブ入力を構成します。 ジョブ入力として使用されるメディアファイルが、クライアントと同じリージョンにあることを確認してください。
        JSONObject input = new JSONObject();
        input.put("Bucket", "<your bucket name>");
        input.put("Location", "oss-cn-shanghai");

        // ジョブ出力を構成します。
        JSONObject output = new JSONObject();
        try {
            input.put("Object", URLEncoder.encode("mps-test/demo/test.mp4", "utf-8"));
            String outPutObject = URLEncoder.encode("mps-test/demo/merge-out.mp4", "utf-8");
            output.put("OutputObject", outPutObject);
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException("input URL encode failed");
        }
        output.put("TemplateId", "<transcode templateId>");

        // ビデオクリッピングのデータを構築します。
        JSONObject clip = new JSONObject();
        // ビデオを 1.000 秒から 5.030 秒まで切り取ります。
        clip.put("TimeSpan", "{\"Seek\":\"00:00:01.000\",\"Duration\":\"5.30\"}");
        // ビデオの末尾から残っているビデオを 1.000 秒から 5.030 秒まで切り取ります。
        //clip.put("TimeSpan", "{\"Seek\":\"00:00:01.000\",\"End\":\"5.30\"}");
        // ビデオの最初のクリップを編集するかどうかを指定します。 有効な値:true および false。 true の値は、編集後にビデオクリップがトランスコーディングジョブのためにマージされることを指定します。 false の値は、編集前にビデオクリップがトランスコーディングジョブのためにマージされることを指定します。
        clip.put("ConfigToClipFirstPart", true);

        output.put("Clip", clip);
        // 構成ファイルの OSS パスは HTTP URL である必要があります。
        output.put("MergeConfigUrl", "http://bucket-name.oss-cn-shanghai.aliyuncs.com/mps-test/demo/mergeConfigfile");

        outputs.add(output);

        com.aliyun.mts20140618.Client client = MergeClipJobs.createClient();
        com.aliyun.mts20140618.models.SubmitJobsRequest submitJobsRequest = new com.aliyun.mts20140618.models.SubmitJobsRequest()
                // ジョブ入力。
                .setInput(input.toJSONString())
                // ジョブ出力構成。
                .setOutputs(outputs.toJSONString())
                // 出力ファイルが格納される OSS バケット。
                .setOutputBucket("exampleBucket")
                // OSS バケットが存在するリージョン。
                .setOutputLocation("oss-cn-shanghai")
                // パイプラインの ID。
                .setPipelineId("dd3dae411e704030b921e52698e5****");
        com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
        try {
            // 必要に応じて、API 操作の応答を表示するための独自のコードを記述します。
            client.submitJobsWithOptions(submitJobsRequest, runtime);
        } catch (TeaException error) {
            // 実際のビジネスシナリオでは、例外を慎重に処理し、プロジェクトの例外を無視しないでください。 この例では、例外は参照用にのみ提供されています。
            // エラーメッセージ。
            System.out.println(error.getMessage());
            // トラブルシューティング用の URL。
            System.out.println(error.getData().get("Recommend"));
            com.aliyun.teautil.Common.assertAsString(error.message);
        } catch (Exception _error) {
            TeaException error = new TeaException(_error.getMessage(), _error);
            // 実際のビジネスシナリオでは、例外を慎重に処理し、プロジェクトの例外を無視しないでください。 この例では、例外は参照用にのみ提供されています。
            // エラーメッセージ。
            System.out.println(error.getMessage());
            // トラブルシューティング用の URL。
            System.out.println(error.getData().get("Recommend"));
            com.aliyun.teautil.Common.assertAsString(error.message);
        }
    }

    /**
     * 入力ビデオの先頭にオープニングパートを埋め込むか、入力ビデオの末尾にエンディングパートを追加します。
     * @return
     * @throws Exception
     */
    public static void openAndTailJob() throws Exception {

        // 出力パラメータを構築します。
        JSONArray outputs = new JSONArray();

        // ジョブ入力を構成します。 ジョブ入力として使用されるメディアファイルが、クライアントと同じリージョンにあることを確認してください。
        JSONObject input = new JSONObject();
        input.put("Bucket", "<your bucket name>");
        input.put("Location", "oss-cn-shanghai");

        // ジョブ出力を構成します。
        JSONObject output = new JSONObject();
        try {
            input.put("Object", URLEncoder.encode("mps-test/demo/test.mp4", "utf-8"));
            String outPutObject = URLEncoder.encode("mps-test/demo/merge-out.mp4", "utf-8");
            output.put("OutputObject", outPutObject);
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException("input URL encode failed");
        }
        output.put("TemplateId", "<transcode templateId>");

        JSONArray openingList = new JSONArray();
        JSONObject opening = new JSONObject();
        opening.put("OpenUrl", "http://bucket-name.oss-cn-shanghai.aliyuncs.com/" + URLEncoder.encode("mps-test/demo/open.mp4", "utf-8"));
        opening.put("Start", "3");
        opening.put("Width", "680");
        opening.put("Height", "480");
        openingList.add(opening);

        JSONArray tailSlateList = new JSONArray();
        JSONObject tailSlate = new JSONObject();
        // オープニングパートとエンディングパートの URL で指定されたオブジェクトは UTF-8 エンコードされている必要があります。
        tailSlate.put("TailUrl", "http://bucket-name.oss-cn-shanghai.aliyuncs.com/" + URLEncoder.encode("mps-test/demo/tail.mp4", "utf-8"));
        tailSlate.put("BlendDuration", "2");
        tailSlate.put("Width", "680");
        tailSlate.put("Height", "480");
        tailSlate.put("IsMergeAudio", true);
        tailSlate.put("BgColor", "White");
        tailSlateList.add(tailSlate);

        output.put("OpeningList", openingList);
        output.put("TailSlateList", tailSlateList);
        outputs.add(output);

        com.aliyun.mts20140618.Client client = MergeClipJobs.createClient();
        com.aliyun.mts20140618.models.SubmitJobsRequest submitJobsRequest = new com.aliyun.mts20140618.models.SubmitJobsRequest()
                // ジョブ入力。
                .setInput(input.toJSONString())
                // ジョブ出力構成。
                .setOutputs(outputs.toJSONString())
                // 出力ファイルが格納される OSS バケット。
                .setOutputBucket("exampleBucket")
                // OSS バケットが存在するリージョン。
                .setOutputLocation("oss-cn-shanghai")
                // パイプラインの ID。
                .setPipelineId("dd3dae411e704030b921e52698e5****");
        com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
        try {
            // 必要に応じて、API 操作の応答を表示するための独自のコードを記述します。
            client.submitJobsWithOptions(submitJobsRequest, runtime);
        } catch (TeaException error) {
            // 実際のビジネスシナリオでは、例外を慎重に処理し、プロジェクトの例外を無視しないでください。 この例では、例外は参照用にのみ提供されています。
            // エラーメッセージ。
            System.out.println(error.getMessage());
            // トラブルシューティング用の URL。
            System.out.println(error.getData().get("Recommend"));
            com.aliyun.teautil.Common.assertAsString(error.message);
        } catch (Exception _error) {
            TeaException error = new TeaException(_error.getMessage(), _error);
            // 実際のビジネスシナリオでは、例外を慎重に処理し、プロジェクトの例外を無視しないでください。 この例では、例外は参照用にのみ提供されています。
            // エラーメッセージ。
            System.out.println(error.getMessage());
            // トラブルシューティング用の URL。
            System.out.println(error.getData().get("Recommend"));
            com.aliyun.teautil.Common.assertAsString(error.message);
        }
    }
}

関連情報