ApsaraVideo Media Processing (MPS) の Java SDK を使用して、HLS 標準の暗号化ワークフローを作成します。
概要
このサンプルでは、「メディアワークフローの追加」で説明されている API を呼び出して、HLS 暗号化ワークフローを作成します。
依存関係
-
MPS SDK をインストールする必要があります。
-
その他の依存関係:
<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 暗号化を初めて使用する場合は、このデモを実行し、ワークフローを 1 回実行してシステム構成を完了してください。
* ワークフローのデータ構造は複雑です。変更を加える場合は、パラメーターの正確性を確保してください。ワークフローのデータ構造の詳細については、「https://www.alibabacloud.com/help/apsaravideo-for-media-processing/latest/api-mts-2014-06-18-addmediaworkflow」をご参照ください。
* KeyUri は復号サービスのエンドポイントです。可用性を確保してください。可用性が確保されていない場合、復号と再生が失敗します。
* HLS 暗号化の使用方法については、xxxxxxxxxxxx を参照してください。
*/
public class MediaHlsWorkflow {
// MPS キュー ID。コンソールで [グローバル設定] > [MPS キュー] を選択すると確認できます。
final static String PIPELINE_ID = "bee7a5b9e*******e40a0cbf";
// テンプレート ID。プリセットテンプレートの詳細については、「https://www.alibabacloud.com/help/mps/developer-reference/preset-template-details」をご参照ください。
final static String TEMPLATE_ID = "S00000001-100020";
final static String OSS_LOCATION = "oss-cn-shanghai";
// コンソールでアタッチされている入力バケットの名前。
final static String INPUT_BUCKET = "<your bucket name>";
// トリガーパス。末尾はスラッシュ (/) にする必要があります。
final static String INPUT_PATH = "mps-test/demo/";
// コンソールでアタッチされている出力バケットの名前。
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";
/**
* 説明:
* <p>アクセスキーペアを使用してクライアントを初期化します。</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 Encryption Workflow")
// ジョブの出力設定。
.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());
// 診断アドレス。
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());
// 診断アドレス。
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;
}
}