背景情報
動画暗号化機能を使用すると、動画コンテンツの詳細なセキュリティ処理を実行し、動画データが不正に取得および送信されるのを防ぐことができます。この機能は、オンライン教育や金融など、セキュリティの高いシナリオで動画の漏洩やホットリンクを防ぐために広く使用されています。このトピックでは、PHP 用 ApsaraVideo Media Processing(MPS)SDK を使用して HTTP ライブストリーミング(HLS)暗号化のワークフローを作成するためのサンプルコードを提供します。
サンプルコード
<?php
require_once './aliyun-php-sdk-core/Config.php';
use Mts\Request\V20140618 as Mts;
$pipelineId = 'd7cedd984be7dd63395c****'; # MPS キューの ID。MPS コンソールにログインして ID を表示できます。
$templateId = "S00000001-100020"; # トランスコーディングテンプレートの ID。出力ファイルは M3U8 形式です。ビジネス要件に基づいてテンプレートを選択します。
$ossLocation = 'oss-cn-shanghai';
$inputBucket = '<input bucket name>';
$inputPath = "<input path>";
$outputBucket = "<output bucket name>";
$encryptionType = "hls-aes-128";
$hlsKeyUri = "http://example.aliyundoc.com/decryption"; # 復号化キーを取得するために使用されるエンドポイント。
$actStart = "Act-Start";
$actEncryption = "Act-HLS-Encryption";
$actReport = "Act-Report";
function initMtsClient($accessKeyId, $accessKeySecret) {
$regionId = 'cn-shanghai'; // MPS サービスがデプロイされているリージョンの ID。
$profile = DefaultProfile::getProfile($regionId, $accessKeyId, $accessKeySecret);
return new DefaultAcsClient($profile);
}
function createHLSEncryptionWorkflow($client) {
$request = new Mts\AddMediaWorkflowRequest();
$request->setName("Workflow for HLS encryption"); // HLS 暗号化のワークフロー
$request->setTopology(buildWorkflowTopology());
return $client->getAcsResponse($request);
}
try {
$client = initMtsClient(getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'), getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'));
$response = createHLSEncryptionWorkflow($client);
print_r($response);
} catch (Exception $e) {
print $e->getMessage()."\n";
}
function buildWorkflowTopology() {
$activities = buildActivities();
$dependencies = buildDependencies();
$workflow = array(
"Activities" => $activities,
"Dependencies" => $dependencies
);
echo json_encode($workflow)."\n";
return json_encode($workflow);
}
function buildActivities() {
global $actStart;
global $actEncryption;
global $actReport;
$activities = [
$actStart => buildStartActivity(),
$actEncryption => buildTranscodeActivity(),
$actReport => buildReportActivity()
];
return $activities;
}
function buildStartActivity() {
global $actStart;
$startActivity = array(
"Name" => $actStart,
"Type" => "Start",
"Parameters" => buildStartParameters()
);
return $startActivity;
}
function buildStartParameters() {
global $pipelineId;
$startParameters = array(
"PipelineId" => $pipelineId,
"InputFile" => buildInputFile()
);
return $startParameters;
}
function buildInputFile() {
global $inputBucket;
global $ossLocation;
global $inputPath;
$inputFile = array(
"Bucket" => $inputBucket,
"Location" => $ossLocation,
"ObjectPrefix" => $inputPath
);
return $inputFile;
}
function buildTranscodeActivity() {
global $actEncryption;
$transcodeParameters = array(
"Name" => $actEncryption,
"Type" => "Transcode", // トランスコード
"Parameters" => buildTranscodeParameters()
);
return $transcodeParameters;
}
function buildTranscodeParameters() {
global $outputBucket;
global $ossLocation;
$transcodeParameters = array(
"OutputBucket" => $outputBucket,
"OutputLocation" => $ossLocation,
"Outputs" => buildOutputsConfig()
);
return $transcodeParameters;
}
function buildOutputsConfig() {
global $actEncryption;
global $templateId;
$output = array(
"ObjectRegex" => $actEncryption."/{RunId}/{FileName}",
"TemplateId" => $templateId,
"Encryption" => buildEncryption() // 暗号化
);
$outputs = array($output);
return $outputs;
}
function buildEncryption() {
global $encryptionType;
global $hlsKeyUri;
$encryption = array(
"Type" => $encryptionType,
"KeyUri" => $hlsKeyUri
);
return $encryption;
}
function buildReportActivity() {
global $actReport;
$reportActivity = array(
"Name" => $actReport,
"Parameters" => (object)[],
"Type" => "Report" // レポート
);
return $reportActivity;
}
function buildDependencies() {
global $actEncryption;
global $actReport;
global $actStart;
$subActivityOfStart = array(
$actEncryption
);
$subActivityOfTranscode = array(
$actReport
);
$dependencies = array(
$actStart => $subActivityOfStart,
$actEncryption => $subActivityOfTranscode,
$actReport => []
);
return $dependencies;
}