All Products
Search
Document Center

ApsaraVideo Media Processing:Create a media workflow

Last Updated:Apr 07, 2024

If you want to produce videos that involve multiple bitrates, audio tracks, subtitles, and formats, or want to run multiple jobs based on the specified sequence or conditions, you can create a workflow. In the workflow, you can configure nodes for running jobs such as transcoding, analysis, snapshot, packaging or encapsulation, review, media fingerprint extraction, and intelligent thumbnail configuration. This topic provides the sample code for using ApsaraVideo Media Processing (MPS) SDK for PHP to create a media workflow.

Sample code

<?php
require_once './aliyun-php-sdk-core/Config.php'; 
use Mts\Request\V20140618 as Mts;

$pipelineId = 'd7cedd984be7dd63395c****';   # The ID of the MPS queue. You can log on to the MPS console to view the ID.
$templateId = "S00000001-100020"; # The ID of the transcoding template. The output file is in the M3U8 format. Select a template based on your business requirements.
$ossLocation = 'oss-cn-shanghai';
$inputBucket = '<input bucket name>';
$inputPath  = "<input path>"; 
$outputBucket = "<output bucket name>";
$actStart = "Act-Start";
$actTransCode = "Act-TransCode";
$actReport = "Act-Report";

function initMtsClient($accessKeyId, $accessKeySecret) {
    $regionId = 'cn-shanghai';  // The ID of the region in which your MPS service is deployed.
    $profile = DefaultProfile::getProfile($regionId, $accessKeyId, $accessKeySecret);
    return new DefaultAcsClient($profile);
}

function createTransCodeWorkflow($client) {
    $request = new Mts\AddMediaWorkflowRequest();
    $request->setName("Transcoding workflow");
    $request->setTopology(buildWorkflowTopology());
    return $client->getAcsResponse($request);
}

try {
    $client = initMtsClient(getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'), getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'));
    $response = createTransCodeWorkflow($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 $actTransCode;
    global $actReport;
    $activities = [
        $actStart => buildStartActivity(),
        $actTransCode => 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 $actTransCode;
    $transcodeParameters = array(
        "Name" => $actTransCode,
        "Type" => "Transcode",
        "Parameters" => buildTranscodeParameters()
    );
    return $transcodeParameters;
}

function buildTranscodeParameters() {
    global $inputBucket;
    global $ossLocation;
    $transcodeParameters = array(
        "OutputBucket" => $outputBucket,
        "OutputLocation" => $ossLocation,
        "Outputs" => buildOutputsConfig()
    );
    return $transcodeParameters;
}

function buildOutputsConfig() {
    global $actTransCode;
    global $templateId;
    $output = array(
        "ObjectRegex" => $actTransCode."/{RunId}/{FileName}",
        "TemplateId" => $templateId
    );
    $outputs = array($output);
    return $outputs;
}

function buildReportActivity() {
    global $actReport;
    $reportActivity = array(
        "Name" => $actReport,
        "Parameters" => (object)[],
        "Type" => "Report"
    );
    return $reportActivity;
}

function buildDependencies() {
    global $actTransCode;
    global $actReport;
    global $actStart;
    $subActivityOfStart = array(
        $actTransCode
    );
    $subActivityOfTranscode = array(
        $actReport
    );
    $dependencies = array(
        $actStart => $subActivityOfStart,
        $actTransCode => $subActivityOfTranscode,
        $actReport => []
    );
    return $dependencies;
}

References