説明

HLS パッケージとは、複数の字幕、複数のトラック、および複数のビットストリームを Master Playlist ファイルに統合する処理を指します。 この処理は、まず HLS パッケージのワークフローを作成し、次に AddMedia インターフェイスを呼び出して処理する動画と HLS パッケージワークフローの ID を指定するものです。

  1. AddMediaWorkflow インターフェイスを使用してワークフローを追加します。このとき、次のオブジェクトに注意が必要です。
    • Topology

      有向非巡回グラフ (DAG) によって定義される業務プロセスです。

    • Activity

      トポロジーを構成する処理ノードを指します。 HLS パッケージワークフローを作成する際は、以下のアクティビティにご注意ください。

      • PackageConfig

        HLS パッケージ設定を指定し、Master Playlist ファイルの出力場所を設定します。

        .

        • フロントノードで、 Start が可能です。

        • バックノードで、SubtitleGroup、AudioGroup、および Transcode (ビデオのみ) が可能です。

      • SubtitleGroup

        字幕グループ ID を指定します。

        .

        • フロントノードで、PackageConfig が可能です。

        • バックノードで、Transcode (字幕のみ) が可能です。

      • AudioGroup

        音声グルー​​プ ID を指定します。

        .

        • フロントノードで、PackageConfig が可能です。

        • バックノードで、Transcode (音声のみ) が可能です。

      • Transcode

        ビデオ、音声、字幕ストリームを抽出します。

        .

        • フロントノードで、PackageConfig、SubtitleGroup、および AudioGroup が可能です。

        • バックノードで、GenerateMasterPlayList が可能です。

      • GenerateMasterPlayList

        HLS パッケージ生成アクティビティであり、マルチレートストリーム設定、音声グルー​​プ、および字幕グループを指定します。

        .

        • フロントノードで、Transcode が可能です。

        • バックードで、Report が可能です。

    • Dependencies

      アクティビティ間の依存関係を示す、トポロジー内のエッジを指します。

  2. AddMedia 操作を呼び出し、MPS にメディアを追加します。
    • メディアワークフロー ID を指定します。

    • 字幕抽出がある場合、Transcode アクティビティの WebVTTSubtitleURL パラメーターを字幕ファイルのアドレスで上書きし、WebVTT の字幕ファイルのみがサポートされるように設定できます。

    • ワークフロートリガーモードを NotInAuto に設定します。

シナリオ

mxf 形式のソースファイル (mp4、flv、m3u8 (ts) などの形式もサポートしています) から 3 つの音声トラック、2 つのビデオストリーム、2 つの WebVTT 字幕グループを抽出し、それらを結合して Master Playlist にパッケージ化します。

Master Playlist の名前と HLS パッケージの出力場所を設定します。
  • Bucket を設定します。

  • Master Playlist ファイルの Location を指定します。

  • Master Playlist ファイルの名前を指定します。

  • アクティビティの定義は以下のとおりです。
    
    {
    "Parameters" : {
    "Output" : "{\"Bucket\": \"processedmediafile\",\"Location\": \"oss-cn-hangzhou\",\"MasterPlayListName\": \"{MediaId}/{RunId}/hls/master.m3u8\"}"
    },
    "Type" : "PackageConfig"
    }
音声グループ
  • 音声グルー​​プ ID を設定します。ここでは、2 つの音声ストリームが同じ音声グルー​​プに属しています。

  • アクティビティの定義は以下のとおりです。
    
    {
    "Parameters" : {
    "GroupId" : "audios"
    },
    "Type" : "AudioGroup"
    }
    • GroupId: 音声グルー​​プ ID に "audios" を指定します。

    • Type: タイプには "AudioGroup" アクティビティを指定します。

音声ストリームの抽出
  • mxf ソースファイルからビデオストリームを除去して、音声ストリームを抽出します。

  • 出力音声のパラメーターは以下のとおりです。

    • Codec: AAC

    • SampleRate:48000 Hz

    • Format:Stereo

  • アクティビティの定義は以下のとおりです。
    
    {
    "Name" : "audio-extract-1",
    "Parameters" : {
    "Outputs" : "[{\"TemplateId\":\"S00000001-100020\",\"AudioStreamMap\":\"0:a:0\",\"Video\":{\"Remove\":\"true\"}}]",
    "ExtXMedia" : "{\"URI\": \"sd/audio-en.m3u8\",\"Name\": \"audio-en\",\"Language\": \"en-US\"}"
    }
    • Preset static templates ID: "S00000001-100020" は、音声出力が m3u8(ts) 形式であり、プリセットテンプレートで設定されている音声ビットレートが 80 kbps であることを示しています。

    • AudioStreamMap: 音声ストリームの連番です。 詳細は、「Output」をご参照ください。

    • 出力結果から、ビデオストリームを除去します。 詳細は、「ビデオ」をご参照ください。

    • ExtXMedia は Media Playlist を定義します。URI には Media Playlist の名前を指定します。

    • Type は Transcode (トランスコードアクティビティ) に設定します。

ビデオの抽出
  • mxf 形式のソースファイルから音声ストリームを除去して、ビデオストリームを抽出します。

  • アクティビティの定義は以下のとおりです。
    
    {
    "Name" : "video-extract",
    "Parameters" : {
    "Outputs" : "[{\"TemplateId\":\"1fe5393bdb7b2b883f0a0fc91e81344a\",\"Audio\":{\"Remove\":\"true\"}}]",
    "MultiBitrateVideoStream" : "{\"URI\": \"sd/video1.m3u8\"}"
    },
    "Type" : "Transcode"
    }
    • カスタムトランスコードテンプレート ID: "1fe5393bdb7b2b883f0a0fc91e81344a" です。 MPS コンソールにログインし、設定 > トランスコードテンプレートからビデオトランスコードパラメータを設定できます。

      • Codec: H. 264

      • Resolution: 384 x 216

      • Profile: Main

      • Bitrate: 240 Kbps

      • Fps: 25

      • PixelFormat: YUV420P Max GOP size: 1 segment length (4 seconds)

      • Output format: m-3u8

    • 出力結果から音声ストリームを除去します。 詳細は、「音声」をご参照ください。

    • MultiBitrateVideoStream には Master Playlist のマルチビットレートビデオストリームを定義します。URI には Media Playlist の名前を指定します。

    • Type を Transcode (トランスコードアクティビティ) に設定します。

字幕グループ
  • 字幕グループ ID を設定します。ここでは、2 つの字幕ストリームは同じ字幕グループに所属しています。

  • アクティビティの定義は以下のとおりです。

    
    
    
    
    {
    "Parameters" : {
    "GroupId" : "subtitles"
    },
    "Type" : "SubtitleGroup"
    }
    • GroupId: 字幕グルー​​プ ID を "audios" に指定します。

    • Type: タイプ を "SubtitleGroup" アクティビティに指定します。

字幕の抽出
  • OSS に WebVTT 形式の字幕をアップロードします。

  • アクティビティの定義は以下のとおりです。

    
    
    
    
    {
    "Name" : "subtitle-extract-1",
    "Parameters" : {
    "WebVTTSubtitleURL" : "http://mts-video.oss-cn-hangzhou.aliyun-inc.com/ShawshankRedemption.vtt",
    "ExtXMedia" : "{\"URI\": \"zh/subtitle1-cn.m3u8\",\"Name\": \"subtitle-cn\",\"Language\": \"cn\"}"
    },
    "Type" : "Transcode"
    }
    • WebVTTSubtitleURL には、字幕のアドレスを指定します。 字幕のアドレスは、AddMedia の呼び出し中に動的に上書きされます。 このパラメータについて詳しくは、「OverrideParams」をご参照ください。

    • ExtXMedia には Media Playlist を定義します。URI には Media Playlist の名前を指定します。

    • Type は Transcode (トランスコードアクティビティ) に設定します。

Master Playlist ファイルの出力
  • 音声、ビデオ、字幕ストリームの出力結果をすべて Master Playlist ファイルにパッケージ化します。

  • アクティビティの定義は以下のとおりです。
    
    {
    "Parameters" : {
    "MasterPlayList" : "{\"MultiBitrateVideoStreams\": [{\"RefActivityName\": \"video-extract\",\"ExtXStreamInfo\": {\"BandWidth\": \"1110000\",\"Audio\": \"audios\",\"Subtitles\": \"subtitles\"}}]}"
    },
    "Type" : "GenerateMasterPlayList"
    }
    • MasterPlayList には Master Playlist を定義します。

    • MultiBitrateVideoStreams は、マルチビットレートのビデオストリームグループを表します。

    • RefActivityName にはビデオストリームのアクティビティ名を指定します。

    • ExtXStreamInfo にはマルチビットレートビデオストリームの属性を定義します。Audio にはオーディオグループを、Subtitles には字幕グループを指定します。

    • Type は GenerateMasterPlayList (Master Playlist の生成アクティビティ) に指定します。

Topology:
トポロジーに示されているシナリオの完全な例

{
"Activities" : {
"package-node" : {
"Name" : "package-node",
"Parameters" : {
"Output" : "{\"Bucket\": \"processedmediafile\",\"Location\": \"oss-cn-hangzhou\",\"MasterPlayListName\": \"{MediaId}/{RunId}/hls/master.m3u8\"}"
},
"Type" : "PackageConfig"
},
"audioGroupNode" : {
"Name" : "audioGroupNode",
"Parameters" : {
"GroupId" : "audios"
},
"Type" : "AudioGroup"
},
"subtitleGroupNode" : {
"Name" : "subtitleGroupNode",
"Parameters" : {
"GroupId" : "subtitles"
},
"Type" : "SubtitleGroup"
},
"video-extract-1" : {
"Name" : "video-extract-1",
"Parameters" : {
"Outputs" : "[{\"TemplateId\":\"1fe5393bdb7b2b883f0a0fc91e81344a\",\"Audio\":{\"Remove\":\"true\"}}]",
"MultiBitrateVideoStream" : "{\"URI\": \"sd/video1.m3u8\"}"
},
"Type" : "Transcode"
},
"video-extract-2" : {
"Name" : "video-extract-1",
"Parameters" : {
"Outputs" : "[{\"TemplateId\":\"1fe5393bdb7b2b883f0a0fc91e81344b\",\"Audio\":{\"Remove\":\"true\"}}]",
"MultiBitrateVideoStream" : "{\"URI\": \"sd/video2.m3u8\"}"
},
"Type" : "Transcode"
},
"audio-extract-1" : {
"Name" : "audio-extract-1",
"Parameters" : {
"Outputs" : "[{\"TemplateId\":\"S00000001-100020\",\"AudioStreamMap\":\"0:a:0\"}]",
"ExtXMedia" : "{\"URI\": \"sd/audio-en-1.m3u8\",\"Name\": \"audio-en\",\"Language\": \"en-US\"}"
},
"Type" : "Transcode"
},
"audio-extract-2" : {
"Name" : "audio-extract-2",
"Parameters" : {
"Outputs" : "[{\"TemplateId\":\"S00000001-100020\",\"AudioStreamMap\":\"0:a:1\"}]",
"ExtXMedia" : "{\"URI\": \"sd/audio-cn.m3u8\",\"Name\": \"audio-cn\",\"Language\": \"cn\"}"
},
"Type" : "Transcode"
},
"audio-extract-3" : {
"Name" : "audio-extract-3",
"Parameters" : {
"Outputs" : "[{\"TemplateId\":\"S00000001-100020\",\"AudioStreamMap\":\"0:a:2\"}]",
"ExtXMedia" : "{\"URI\": \"sd/audio-de.m3u8\",\"Name\": \"audio-de\",\"Language\": \"de\"}"
},
"Type" : "Transcode"
},
"subtitle-extract-1" : {
"Name" : "subtitle-extract-1",
"Parameters" : {
"WebVTTSubtitleURL" : "http://mts-video-daily-bucket.oss-test.aliyun-inc.com/1.vtt",
"ExtXMedia" : "{\"URI\": \"zh/subtitle1-cn.m3u8\",\"Name\": \"subtitle-cn\",\"Language\": \"cn\"}"
},
"Type" : "Transcode"
},
"subtitle-extract-2" : {
"Name" : "subtitle-extract-2",
"Parameters" : {
"WebVTTSubtitleURL" : "http://mts-video.oss-cn-hangzhou.aliyun-inc.com/ShawshankRedemption.vtt",
"ExtXMedia" : "{\"URI\": \"zh/subtitle1-en.m3u8\",\"Name\": \"subtitle-en\",\"Language\": \"en-US\"}"
},
"Type" : "Transcode"
},
"masterPlayListGenerate" : {
"Name" : "masterPlayListGenerate",
"Parameters" : {
"MasterPlayList" : "{\"MultiBitrateVideoStreams\": [{\"RefActivityName\": \"video-extract-1\",\"ExtXStreamInfo\": {\"BandWidth\": \"1110000\",\"Audio\": \"audios\",\"Subtitles\": \"subtitles\"}}, {\"RefActivityName\": \"video-extract-2\",\"ExtXStreamInfo\": {\"BandWidth\": \"5000000\",\"Audio\": \"audios\",\"Subtitles\":\"subtitles\"}}]}"
},
"Type" : "GenerateMasterPlayList"
},
"activityEnd" : {
"Name" : "activityEnd",
"Parameters" : {
"PublishType" : "Manual"
},
"Type" : "Report"
},
"activityStart" : {
"Name" : "activityStart",
"Parameters" : {
"PipelineId" : "900ededca77641ecbecd4f44cc3a2965",
"Role" : "AliyunMTSDefaultRole",
"InputFile" : "{\"Bucket\":\"videouploaded\",\"Location\":\"oss-cn-hangzhou\",\"ObjectPrefix\":\"uploaded/\"}"
},
"Type" : "Start"
}
},
"Dependencies" : {
"video-extract-1" : [ "masterPlayListGenerate" ],
"video-extract-2" : [ "masterPlayListGenerate" ],
"audio-extract-1" : [ "masterPlayListGenerate" ],
"audio-extract-2" : [ "masterPlayListGenerate" ],
"audio-extract-3" : [ "masterPlayListGenerate" ],
"subtitle-extract-1" : [ "masterPlayListGenerate" ],
"subtitle-extract-2" : [ "masterPlayListGenerate" ],
"package-node" : [ "video-extract-1", "video-extract-2","subtitleGroupNode", "audioGroupNode" ],
"audioGroupNode" : [ "audio-extract-1", "audio-extract-2","audio-extract-3"],
"subtitleGroupNode" : [ "subtitle-extract-1", "subtitle-extract-2" ],
"masterPlayListGenerate" : [ "activityEnd" ],
"activityEnd" : [ ],
"activityStart" : [ "package-node" ]
}
}

コード例

  1. HLS パッケージワークフローの作成

    ワークフローの作成 (Java)

    ワークフローの作成 (Python)

    ワークフローの作成 (PHP)

  2. メディアの追加

    メディアの追加 (Java)

    MPS ライブラリにメディアを追加する (Python)

    MPS ライブラリにメディアを追加する (PHP)