全部產品
Search
文件中心

ApsaraVideo Media Processing:視頻拼接和簡單剪輯

更新時間:Jan 15, 2025

拼接是把多個不同格式 、不同編碼、解析度的視頻拼接在一起,輸出成一個格式、編碼、解析度相同的新視頻。常用於添加固定的標題和片尾、直播錄製視頻拼接。剪輯是指裁剪視頻的某一段,輸出成一個新視頻。常用於截取視頻中精彩或關鍵的內容。本文介紹ApsaraVideo for Media ProcessingJava SDK進行視頻拼接和簡單剪輯的範例程式碼。

使用情境

  • 標題和片尾:用於添加固定的標題和片尾,以及直播錄製視頻的拼接,以提升品牌的辨識度。

  • 剪輯拼接:對視頻的特定段落進行裁剪,並輸出為一個新的視頻檔案。此操作常用於提取視頻中精彩或關鍵的內容。

  • 開板尾板:視頻開板和尾板是一種特殊的拼接效果,嵌入於正片視頻中,以畫中畫的形式進行展示。

普通視頻拼接任務-URL方式

例如,針對一個正片視頻,從00:00:03.000秒開始截取,持續00:00:13.000秒,並將其與標題視頻中從00:00:01.000秒截取至00:00:05.030秒的部分進行拼接,使用預置模板S00000001-200010,最終產生的視頻總時間長度為17.30秒。

/**
     * 普通視頻拼接任務  URL方式
     * @return
     * @throws Exception
     */
    public static void mergrUrlListJob() throws Exception {

        //構建輸出參數
        JSONArray outputs = new JSONArray();

        //構建input, 需要保證Location地區和服務client地區一致
        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();
        //代表從01秒000毫秒開始,截取到第5秒30毫秒為止
        clip.put("TimeSpan", "{\"Seek\":\"00:00:01.000\",\"Duration\":\"5.30\"}");
        //代表從01秒000毫秒開始,截取到距離片尾剩餘5秒30毫秒為止
        //clip.put("TimeSpan", "{\"Seek\":\"00:00:01.000\",\"End\":\"5.30\"}");
        //true:先剪輯第一個片段,再拼接(轉碼)
        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 Bucket
                .setOutputBucket("exampleBucket")
                //輸出檔案所在的 OSS Bucket 的地區(OSS Region)
                .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) {
            // 此處僅做列印展示,請謹慎對待異常處理,在工程專案中切勿直接忽略異常。
            // 錯誤 message
            System.out.println(error.getMessage());
            // 診斷地址
            System.out.println(error.getData().get("Recommend"));
            com.aliyun.teautil.Common.assertAsString(error.message);
        } catch (Exception _error) {
            TeaException error = new TeaException(_error.getMessage(), _error);
            // 此處僅做列印展示,請謹慎對待異常處理,在工程專案中切勿直接忽略異常。
            // 錯誤 message
            System.out.println(error.getMessage());
            // 診斷地址
            System.out.println(error.getData().get("Recommend"));
            com.aliyun.teautil.Common.assertAsString(error.message);
        }
    }

普通視頻拼接任務-ConfigFile方式

例如,針對一個正片視頻,從00:00:03.000秒開始截取,期間為00:00:10.000秒,並將其與標題視頻拼接,後者從00:00:01.000秒開始截取至距離片尾剩餘5秒30毫秒為止。使用預置模板S00000001-200010。

所用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"}]}

/**
     * 普通視頻拼接任務  ConfigFile方式
     * @return
     * @throws Exception
     */
    public static void mergrConfigFileJob() throws Exception {

        //構建輸出參數
        JSONArray outputs = new JSONArray();

        //構建input, 需要保證Location地區和服務client地區一致
        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();
        //代表從01秒000毫秒開始,截取到第5秒30毫秒為止
        clip.put("TimeSpan", "{\"Seek\":\"00:00:01.000\",\"Duration\":\"5.30\"}");
        //代表從01秒000毫秒開始,截取到距離片尾剩餘5秒30毫秒為止
        //clip.put("TimeSpan", "{\"Seek\":\"00:00:01.000\",\"End\":\"5.30\"}");
        //true:先剪輯第一個片段,再拼接(轉碼)
        clip.put("ConfigToClipFirstPart", true);

        output.put("Clip", clip);
        //MergeConfigUrl的地址必須為HTTP地址
        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 Bucket
                .setOutputBucket("exampleBucket")
                //輸出檔案所在的 OSS Bucket 的地區(OSS Region)
                .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) {
            // 此處僅做列印展示,請謹慎對待異常處理,在工程專案中切勿直接忽略異常。
            // 錯誤 message
            System.out.println(error.getMessage());
            // 診斷地址
            System.out.println(error.getData().get("Recommend"));
            com.aliyun.teautil.Common.assertAsString(error.message);
        } catch (Exception _error) {
            TeaException error = new TeaException(_error.getMessage(), _error);
            // 此處僅做列印展示,請謹慎對待異常處理,在工程專案中切勿直接忽略異常。
            // 錯誤 message
            System.out.println(error.getMessage());
            // 診斷地址
            System.out.println(error.getData().get("Recommend"));
            com.aliyun.teautil.Common.assertAsString(error.message);
        }
    }

開板尾板拼接任務

例如,在一個正片視頻中,在第3秒增加一個開板視頻,該開板視頻地區的解析度為680*480。同時,在視頻結尾處增加一個尾板視頻,尾板視頻地區的解析度同樣為680*480,空白部分填充以白色背景色。

說明

開板和尾板視頻的URL中的Object部分必須經過URL Encoding說明(基於UTF-8編碼)處理後使用,並且該URL必須為HTTP地址。

 /**
     * 開板尾板拼接任務
     * @return
     * @throws Exception
     */
    public static void openAndTailJob() throws Exception {

        //構建輸出參數
        JSONArray outputs = new JSONArray();

        //構建input, 需要保證Location地區和服務client地區一致
        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();
        //Object必須經過URLEncoding(基於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 Bucket
                .setOutputBucket("exampleBucket")
                //輸出檔案所在的 OSS Bucket 的地區(OSS Region)
                .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) {
            // 此處僅做列印展示,請謹慎對待異常處理,在工程專案中切勿直接忽略異常。
            // 錯誤 message
            System.out.println(error.getMessage());
            // 診斷地址
            System.out.println(error.getData().get("Recommend"));
            com.aliyun.teautil.Common.assertAsString(error.message);
        } catch (Exception _error) {
            TeaException error = new TeaException(_error.getMessage(), _error);
            // 此處僅做列印展示,請謹慎對待異常處理,在工程專案中切勿直接忽略異常。
            // 錯誤 message
            System.out.println(error.getMessage());
            // 診斷地址
            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>description</b> :
     * <p>使用AK&amp;SK初始化帳號Client</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);
    }

    /**
     * 普通視頻拼接任務  URL方式
     * @return
     * @throws Exception
     */
    public static void mergrUrlListJob() throws Exception {

        //構建輸出參數
        JSONArray outputs = new JSONArray();

        //構建input, 需要保證Location地區和服務client地區一致
        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();
        //代表從01秒000毫秒開始,截取到第5秒30毫秒為止
        clip.put("TimeSpan", "{\"Seek\":\"00:00:01.000\",\"Duration\":\"5.30\"}");
        //代表從01秒000毫秒開始,截取到距離片尾剩餘5秒30毫秒為止
        //clip.put("TimeSpan", "{\"Seek\":\"00:00:01.000\",\"End\":\"5.30\"}");
        //true:先剪輯第一個片段,再拼接(轉碼)
        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 Bucket
                .setOutputBucket("exampleBucket")
                //輸出檔案所在的 OSS Bucket 的地區(OSS Region)
                .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) {
            // 此處僅做列印展示,請謹慎對待異常處理,在工程專案中切勿直接忽略異常。
            // 錯誤 message
            System.out.println(error.getMessage());
            // 診斷地址
            System.out.println(error.getData().get("Recommend"));
            com.aliyun.teautil.Common.assertAsString(error.message);
        } catch (Exception _error) {
            TeaException error = new TeaException(_error.getMessage(), _error);
            // 此處僅做列印展示,請謹慎對待異常處理,在工程專案中切勿直接忽略異常。
            // 錯誤 message
            System.out.println(error.getMessage());
            // 診斷地址
            System.out.println(error.getData().get("Recommend"));
            com.aliyun.teautil.Common.assertAsString(error.message);
        }
    }

    /**
     * 普通視頻拼接任務  ConfigFile方式
     * @return
     * @throws Exception
     */
    public static void mergrConfigFileJob() throws Exception {

        //構建輸出參數
        JSONArray outputs = new JSONArray();

        //構建input, 需要保證Location地區和服務client地區一致
        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();
        //代表從01秒000毫秒開始,截取到第5秒30毫秒為止
        clip.put("TimeSpan", "{\"Seek\":\"00:00:01.000\",\"Duration\":\"5.30\"}");
        //代表從01秒000毫秒開始,截取到距離片尾剩餘5秒30毫秒為止
        //clip.put("TimeSpan", "{\"Seek\":\"00:00:01.000\",\"End\":\"5.30\"}");
        //true:先剪輯第一個片段,再拼接(轉碼)
        clip.put("ConfigToClipFirstPart", true);

        output.put("Clip", clip);
        //MergeConfigUrl的地址必須為HTTP地址
        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 Bucket
                .setOutputBucket("exampleBucket")
                //輸出檔案所在的 OSS Bucket 的地區(OSS Region)
                .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) {
            // 此處僅做列印展示,請謹慎對待異常處理,在工程專案中切勿直接忽略異常。
            // 錯誤 message
            System.out.println(error.getMessage());
            // 診斷地址
            System.out.println(error.getData().get("Recommend"));
            com.aliyun.teautil.Common.assertAsString(error.message);
        } catch (Exception _error) {
            TeaException error = new TeaException(_error.getMessage(), _error);
            // 此處僅做列印展示,請謹慎對待異常處理,在工程專案中切勿直接忽略異常。
            // 錯誤 message
            System.out.println(error.getMessage());
            // 診斷地址
            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();

        //構建input, 需要保證Location地區和服務client地區一致
        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();
        //Object必須經過URLEncoding(基於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 Bucket
                .setOutputBucket("exampleBucket")
                //輸出檔案所在的 OSS Bucket 的地區(OSS Region)
                .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) {
            // 此處僅做列印展示,請謹慎對待異常處理,在工程專案中切勿直接忽略異常。
            // 錯誤 message
            System.out.println(error.getMessage());
            // 診斷地址
            System.out.println(error.getData().get("Recommend"));
            com.aliyun.teautil.Common.assertAsString(error.message);
        } catch (Exception _error) {
            TeaException error = new TeaException(_error.getMessage(), _error);
            // 此處僅做列印展示,請謹慎對待異常處理,在工程專案中切勿直接忽略異常。
            // 錯誤 message
            System.out.println(error.getMessage());
            // 診斷地址
            System.out.println(error.getData().get("Recommend"));
            com.aliyun.teautil.Common.assertAsString(error.message);
        }
    }
}

相關文檔