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

ApsaraVideo Media Processing:HLS 暗号化のワークフローを作成する

最終更新日:Feb 26, 2025

このトピックでは、ApsaraVideo Media Processing(MPS)SDK for Java を使用して HTTP-Live-Streaming(HLS)暗号化のワークフローを作成するためのサンプルコードを提供します。

概要

AddMediaWorkflow オペレーションを呼び出して、HLS 暗号化のワークフローを作成することもできます。詳細については、「AddMediaWorkflow」をご参照ください。

依存関係

  • MPS SDK for Java をインストールします。詳細については、「Alibaba Cloud SDK for Java をインストールする」をご参照ください。

  • その他の依存関係を追加します。

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.68.noneautotype</version>
    </dependency>

サンプルコード

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.aliyun.tea.TeaException;
/**
 * *****   使用上の注意     ******
 * このサンプルコードは、HLS 暗号化のワークフローを作成します。HLS 暗号化を初めて実行する場合は、このサンプルコードを使用して HLS 暗号化のワークフローを作成し、ワークフローを 1 回実行して、システム構成が有効であることを確認する必要があります。
 * ワークフローのトポロジーは複雑です。トポロジーを変更する場合は、パラメーター設定の精度に注意する必要があります。詳細については、https://www.alibabacloud.com/help/zh/apsaravideo-for-media-processing/latest/api-mts-2014-06-18-addmediaworkflow の「AddMediaWorkflow」を参照してください。
 * KeyUri パラメーターは、復号鍵を取得するために使用されるエンドポイントを指定します。指定されたキーの Uniform Resource Identifier(URI)が有効であることを確認してください。無効な場合、復号は失敗します。
 * HLS 暗号化の詳細については、xxxxxxxxxxxx を参照してください。
 */
public class MediaHlsWorkflow {

    // MPS キューの ID。MPS キューの ID を表示するには、MPS コンソールにログインし、左側のナビゲーションウィンドウで [グローバル設定] > [MPS キューとコールバック] を選択します。
    final static String PIPELINE_ID = "bee7a5b9e*******e40a0cbf";
    // テンプレートの ID。プリセットテンプレートの詳細については、https://www.alibabacloud.com/help/en/mps/developer-reference/preset-template-details を参照してください。
    final static String TEMPLATE_ID = "S00000001-100020";
    final static String OSS_LOCATION = "oss-cn-shanghai";
    // MPS コンソールで指定された入力メディアバケットの名前。
    final static String INPUT_BUCKET = "<your bucket name>";
    // トリガーパス。パス名はスラッシュ (/) で終わる必要があります。
    final static String INPUT_PATH = "mps-test/demo/";
    // MPS コンソールで指定された出力メディアバケットの名前。
    final static String OUTPUT_BUCKET = "<your bucket name>";
    // 暗号化タイプ。このパラメーターを hls-aes-128 に設定します。
    final static String ENCRYPTION_TYPE = "hls-aes-128";
    // 復号鍵を取得するために使用されるエンドポイント。例: http://example.aliyundoc.com。
    final static String HLS_KEY_URI = "http://127.0.0.1:8888";
    final static String ACT_START = "Act-Start";
    final static String ACT_ENCRYPTION = "Act-HLS-Encryption";
    final static String ACT_REPORT = "Act-Report";

    /**
     * <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);
    }

    /**
     * HLS 暗号化のワークフローを作成します。
     * @return
     * @throws Exception
     */
    public static void addMediaHlsWorkflow() throws Exception {
        com.aliyun.mts20140618.Client client = MediaHlsWorkflow.createClient();
        com.aliyun.mts20140618.models.AddMediaWorkflowRequest addMediaWorkflowRequest = new com.aliyun.mts20140618.models.AddMediaWorkflowRequest()
                // ウォーターマークの名前。
                .setName("HLS 暗号化のワークフロー")
                // ジョブ出力構成。
                .setTopology(createWorkflow().toJSONString());

        com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
        try {
            // 必要に応じて、API 操作のレスポンスを表示するための独自のコードを記述します。
            client.addMediaWorkflowWithOptions(addMediaWorkflowRequest, 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
     */
    private static JSONObject createWorkflow() {
        JSONObject workflow = new JSONObject();
        JSONObject activities = new JSONObject();
        activities.put(ACT_START, createStartActivity());
        activities.put(ACT_ENCRYPTION, createTrancodeActivity());
        activities.put(ACT_REPORT, createReportActivity());
        workflow.put("Activities", activities);
        workflow.put("Dependencies", createDependencies());
        return workflow;
    }

    /**
     * ワークフローに開始ノードを追加します。
     * @return
     */
    private static JSONObject createStartActivity() {
        JSONObject startActivity = new JSONObject();
        startActivity.put("Name", ACT_START);
        startActivity.put("Type", "Start");
        startActivity.put("Parameters", buildStartParameters());
        return startActivity;
    }

    /**
     * 入力構成を追加します。
     * @return
     */
    private static JSONObject buildStartParameters() {
        JSONObject parameters = new JSONObject();
        parameters.put("PipelineId", PIPELINE_ID);
        // 入力メディアバケットの構造。
        JSONObject inputFile = new JSONObject();
        inputFile.put("Bucket", INPUT_BUCKET);
        inputFile.put("Location", OSS_LOCATION);
        inputFile.put("ObjectPrefix", INPUT_PATH);

        parameters.put("InputFile", inputFile);
        return parameters;
    }

    /**
     * ワークフローにトランスコードノードを追加します。
     * @return
     */
    private static JSONObject createTrancodeActivity() {
        JSONObject transcodeActivity = new JSONObject();
        transcodeActivity.put("Name", ACT_ENCRYPTION);
        transcodeActivity.put("Type", "Transcode");

        JSONObject transcodeParamters = new JSONObject();
        transcodeParamters.put("OutputBucket", OUTPUT_BUCKET);
        transcodeParamters.put("OutputLocation", OSS_LOCATION);
        transcodeParamters.put("Outputs", buildOutputsConfig());

        transcodeActivity.put("Parameters", transcodeParamters);
        return transcodeActivity;
    }

    /**
     * 出力構成を追加します。
     * @return
     */
    private  static JSONArray buildOutputsConfig() {
        JSONArray outputs = new JSONArray();
        JSONObject output = new JSONObject();
        output.put("ObjectRegex", ACT_ENCRYPTION + "/{RunId}/{FileName}");
        output.put("TemplateId", TEMPLATE_ID);
        output.put("Encryption", buildEncryption());
        outputs.add(output);
        return outputs;
    }

    /**
     * 暗号化構成を追加します。
     * @return
     */
    private static JSONObject buildEncryption() {
        JSONObject encryption = new JSONObject();
        encryption.put("Type", ENCRYPTION_TYPE);
        encryption.put("KeyUri", HLS_KEY_URI);
        return encryption;
    }

    /**
     * レポートノードの構成を追加します。
     * @return
     */
    private static JSONObject createReportActivity() {
        JSONObject reportActivity = new JSONObject();
        reportActivity.put("Name", ACT_REPORT);
        JSONObject parameters = new JSONObject();
        parameters.put("PublishType","Auto");
        reportActivity.put("Parameters", parameters);
        reportActivity.put("Type", "Report");
        return  reportActivity;
    }

    /**
     * 依存関係を追加します。
     * トポロジーのエッジ。エッジは、アクティビティ間の依存関係を示します。
     * @return
     */
    private static JSONObject createDependencies() {
        JSONObject dependencies = new JSONObject();
        JSONArray subActivityOfStart = new JSONArray();
        subActivityOfStart.add(ACT_ENCRYPTION);
        dependencies.put(ACT_START, subActivityOfStart);
        JSONArray subActivityOfTranscode = new JSONArray();
        subActivityOfTranscode.add(ACT_REPORT);
        dependencies.put(ACT_ENCRYPTION, subActivityOfTranscode);
        dependencies.put(ACT_REPORT, new JSONArray());
        return dependencies;
    }
}