説明

DASH (Dynamic Adaptive Streaming Over HTTP) パッケージを使用すると、ビットレートの異なる 1 つまたは複数のビデオストリーム、複数言語の字幕、音声トラックを Master Playlist ファイルにパッケージ化することができます。 この処理は、まず DASH パッケージのワークフローを作成し、次に AddMedia 操作を呼び出して処理するメディアとワークフロー ID を指定するものです。
  1. AddMediaWorkflow 操作を呼び出して新しいワークフローを作成します。
    • Topology

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

    • Activity

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

      • PackageConfig

        Master Playlist ファイルの出力場所を設定します。

        トポロジーの順序

        • フロントノードは Start ノードです。

        • バックノードは、 SubtitleGroup、AudioGroup、または VideoGroup です。

      • SubtitleGroup

        各字幕グループの ID と言語を指定します。

        トポロジーの順序

        • フロントノードは PackageConfig です。

        • バックノードは Transcode ノード (字幕のみ) です。

      • AudioGroup

        各音声グループの ID と言語を指定します。

        トポロジーの順序

        • フロントノードは PackageConfig です。

        • バックノードは Transcode ノード (音声のみ) です。

      • VideoGroup

        各ビデオグループの ID を指定します。

        トポロジーの順序

        • フロントノードは PackageConfig ノードです。

        • バックノードは Transcode ノード (ビデオのみ) です。

      • Transcode

        ビデオ、音声、字幕ストリームの抽出に使用します。

        トポロジーの順序

        • フロントノードは SubtitleGroup、AudioGroup、または VideoGroup ノードです。

        • バックノードは GenerateMasterPlayList ノードです。

      • GenerateMasterPlayList

        Master Playlist ファイルの生成に使用します。

        トポロジの順序

        • フロントノードは Transcode ノードです。

        • バックノードは Report ノードです。

    • Dependencies

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

  2. AddMedia 操作を呼び出して MPS にメディアを追加します。

    • メディアワークフローの ID を指定する必要があります。

    • 字幕抽出がある場合、OverrideParams パラメーターを設定して Transcode アクティビティの 字幕ファイルのデフォルト URL をオーバーライドします。 例えば、{"subtitleTransNode":{"InputConfig":{"Format":"stl","InputFile":{"URL":"http://subtitleBucket.oss-cn-hangzhou.aliyuncs.com/package/subtitle/CENG.stl"}}}} 。 この例では、sutitleTransNode が字幕抽出のノードです。

    • TriggerMode を NotInAuto に設定します。

シナリオ

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

出力場所と Master Playlist ファイルの名前を設定します。
  • Bucket を設定します。

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

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

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

    
    
    
    {
    "Parameters" : {
    "Output" : "{\"Bucket\": \"processedmediafile\",\"Location\": \"oss-cn-hangzhou\",\"MasterPlayListName\": \"{MediaId}/{RunId}/dash/master.mpd\"}"
    },
    "Type" : "PackageConfig"
    }
音声ストリームをグループ化します。
  • アクティビティの定義は以下のとおりです。

    
    
    
    "audio-cn-group" : {
    "Name" : "audio-cn-group",
    "Parameters" : {
    "AdaptationSet" : "{\"Lang\":\"chinese\",\"Group\":\"AudioGroupChinese\"}"
    },
    "Type" : "AudioGroup"
    }
    • Group: 音声グループ名を "AudioGroupChinese" に設定します。
    • Type: タイプには "AudioGroup" アクティビティを指定します。
音声ストリームを抽出します。
  • mxf ソースファイルからビデオストリームを除去して、音声ストリームを抽出します。

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

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

    
    
    
    "audioCNTransNode" : {
    "Name" : "audioCNTransNode",
    "Parameters" : {
    "Outputs" : "[{\"TemplateId\":\"S00000001-100020\",\"AudioStreamMap\":\"0:a:0\",\"Video\":{\"Remove\":\"true\"}}]",
    "Representation" : "{\"Id\":\"chinese128k\",\"URI\":\"audiocn/cn-abc.mpd\"}"
    },
    "Type" : "Transcode"
    }
    • URI: 出力結果となる音声ストリームの場所を指定します。
    • AudioStreamMap: 音声ストリームの連番です。 詳細は、「Output」をご参照ください。

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

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

ビデオストリームをグループ化します。

"video-group" : {
"Name" : "video-group",
"Parameters" : {
"AdaptationSet" : "{\"Group\":\"VideoGroup\"}"
},
"Type" : "VideoGroup"
}
ビデオストリームを抽出します。
  • mxf 形式のソースファイルから音声ストリームを除去して、ビデオストリームを抽出します。

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

    
    
    
    "videoTransSD" : {
    "Name" : "videoTransSD",
    "Parameters" : {
    "Outputs" : "[{\"TemplateId\":\"d861b90f6c0aed8f81095e5c5b857cba\",\"Audio\":{\"Remove\":\"true\"}}]",
    "Representation" : "{\"Id\":\"476pSD\",\"URI\":\"videoSD/xx.mpd\"}"
    },
    "Type" : "Transcode"
    } 
    • この例では、ユーザー定義のトランスコードテンプレートの ID は "d861b90f6c0aed8f81095e5c5b857cba" です。 対応する API 操作を呼び出してトランスコードテンプレートを作成することができます。コンテナのフォーマットは mpd です。

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

    • URI: 出力結果となるビデオストリームの名前と場所を指定します。

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

字幕ストリームをグループ化します。
  • 字幕グループの ID を指定します。

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

    
    
    
    "subtitle-cn-group" : {
    "Name" : "subtitle-cn-group",
    "Parameters" : {
    "AdaptationSet" : "{\"Lang\":\"Chinese\", \"Group\":\"SubtitleENGroup\"}"
    },
    "Type" : "SubtitleGroup"
    }
    • Group: 字幕グループの名前を "SubtitleENGroup" に指定します。
    • Lang: この字幕グループの言語を指定します。
    • Type: タイプ を "SubtitleGroup" に指定します。
字幕ストリームを抽出します。
  • STL、TTML、WebVTT の字幕を OSS にアップロードします。

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

    
    
    
    "subtitleCNNode" : {
    "Name" : "subtitleCNNode",
    "Parameters" : {
    "InputConfig" : "{\"Format\":\"vtt\",\"InputFile\":{\"URL\":\"http://bucketname.oss-cn-hangzhou.aliyuncs.com/test/Audio-SiHD.chs.vtt\"}}",
    "Representation" : "{\"Id\":\"subtitle-chinese\", \"URI\":\"subtitle/cn-xx.vtt\"}"
    },
    "Type" : "Transcode"
    }
    • InputConfig には字幕の URL を指定します。 URL は AddMedia 操作を呼び出す際に OverrideParams パラメーターを設定することでオーバーライドできます。

    • URI: 出力結果の字幕ストリームの場所を指定します。

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

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

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

    
    
    
    {
    "Parameters" : {
    },
    "Type" : "GenerateMasterPlayList"
    }
    • Type は GenerateMasterPlayList (Master Playlist ファイルの生成) に指定します。
トポロジは以下のとおりです。

トポロジーに示されているシナリオの例です。

{
"Activities": {
"act-package": {
"Name": "act-package",
"Parameters": {
"Output": "{\"Bucket\": \"outputbucketname\",\"Location\": \"oss-cn-hangzhou\",\"MasterPlayListName\": \"dashpackage/{MediaId}/{RunId}/master.mpd\"}",
"Protocol": "dash"
},
"Type" : "PackageConfig"
},
"video-group": {
"Name": "video-group",
"Parameters": {
"AdaptationSet": "{\"Group\":\"VideoGroup\"}"
},
"Type": "VideoGroup"
},
"audio-en-group": {
"Name": "audio-en-group",
"Parameters": {
"AdaptationSet": "{\"Lang\":\"english\", \"Group\":\"AudioGroupEnglish\"}"
},
"Type" : "AudioGroup"
},
"audio-cn-group": {
"Name": "audio-cn-group",
"Parameters": {
"AdaptationSet": "{\"Lang\":\"chinese\", \"Group\":\"AudioGroupChinese\"}"
},
"Type" : "AudioGroup"
},
"subtitle-en-group": {
"Name": "subtitle-en-group",
"Parameters": {
"AdaptationSet": "{\"Lang\":\"english\", \"Group\":\"SubtitleENGroup\"}"
},
"Type" : "SubtitleGroup"
},
"subtitle-cn-group": {
"Name": "subtitle-cn-group",
"Parameters": {
"AdaptationSet": "{\"Lang\":\"chinese\", \"Group\":\"SubtitleCNGroup\"}"
},
"Type" : "SubtitleGroup"
},
"videoTransLD": {
"Name": "videoTransLD",
"Parameters": {
"Outputs": "[{\"TemplateId\":\"d053297fc44f9dd6becd4a98d1c42f50\",\"Audio\":{\"Remove\":\"true\"}}]",
"Representation": "{\"Id\":\"270pLD\", \"URI\":\"videoLD/xx.mpd\"}"
},
"Type": "Transcode"
},
"videoTransSD": {
"Name": "videoTransSD",
"Parameters": {
"Outputs": "[{\"TemplateId\":\"d861b90f6c0aed8f81095e5c5b857cba\",\"Audio\":{\"Remove\":\"true\"}}]",
"Representation": "{\"Id\":\"480pSD\", \"URI\":\"videoSD/xx.mpd\"}"
},
"Type": "Transcode"
},
"videoTransHD": {
"Name": "videoTransHD",
"Parameters": {
"Outputs": "[{\"TemplateId\":\"117b3ae88efbc97df372cfd9a0e1ff4c\",\"Audio\":{\"Remove\":\"true\"}}]",
"Representation": "{\"Id\":\"720pHD\", \"URI\":\"videoHD/xx.mpd\"}"
},
"Type": "Transcode"
},
"audioCNTransNode": {
"Name": "audioCNTransNode",
"Parameters": {
"Outputs": "[{\"TemplateId\":\"d053297fc44f9dd6becd4a98d1c42f50\",\"AudioStreamMap\":\"0:a:0\",\"Video\":{\"Remove\":\"true\"}}]",
"Representation": "{\"Id\":\"chinese128k\", \"URI\":\"audiocn/cn-abc.mpd\"}"
},
"Type": "Transcode"
},
"audioENTransNode": {
"Name": "audioENTransNode",
"Parameters": {
"Outputs": "[{\"TemplateId\":\"d053297fc44f9dd6becd4a98d1c42f50\",\"AudioStreamMap\":\"0:a:1\",\"Video\":{\"Remove\":\"true\"}}]",
"Representation": "{\"Id\":\"english128k\", \"URI\":\"audioen/en-abc.mpd\"}"
},
"Type": "Transcode"
},
"subtitleENNode": {
"Name": "subtitleENNode",
"Parameters": {
"InputConfig": "{\"Format\":\"vtt\",\"InputFile\":{\"URL\":\"http://bucketname.oss-cn-hangzhou.aliyuncs.com/dashpackage/subtitle/Subtitle.EN.vtt\"}}",
"Representation": "{\"Id\":\"subtitle-english\", \"URI\":\"subtitle/en-xx.vtt\"}"
},
"Type": "Transcode"
},
"subtitleCNNode": {
"Name": "subtitleCNNode",
"Parameters": {
"InputConfig": "{\"Format\":\"vtt\",\"InputFile\":{\"URL\":\"http://bucketname.oss-cn-hangzhou.aliyuncs.com/dashpackage/subtitle/Subtitle.CN.vtt\"}}",
"Representation": "{\"Id\":\"subtitle-chinese\", \"URI\":\"subtitle/cn-xx.vtt\"}"
},
"Type": "Transcode"
},
"act-report": {
"Name": "act-report",
"Parameters": {
"PublishType": "Auto"
},
"Type": "Report"
},
"act-start": {
"Name": "act-start",
"Parameters": {
"PipelineId": "cc7fcef2562e4abc9332d491f93399d2",
"InputFile": "{\"Bucket\":\"inputbucketname\",\"Location\":\"oss-cn-hangzhou\",\"ObjectPrefix\":\"package/dash/\"}"
},
"Type": "Start"
},
"generateMasterPlayListAct": {
"Name": "generateMasterPlayListAct",
"Parameters": {},
"Type": "GenerateMasterPlayList"
}
},
"Dependencies": {
"audio-en-group": ["audioENTransNode"],
"video-group": ["videoTransLD", "videoTransSD", "videoTransHD"],
"audio-cn-group": ["audioCNTransNode"],
"audioCNTransNode": ["generateMasterPlayListAct"],
"subtitleENNode": ["generateMasterPlayListAct"],
"act-package": ["audio-en-group", "audio-cn-group", "subtitle-cn-group", "subtitle-en-group", "video-group"],
"act-report": [],
"videoTransSD": ["generateMasterPlayListAct"],
"videoTransHD": ["generateMasterPlayListAct"],
"subtitle-en-group": ["subtitleENNode"],
"subtitle-cn-group": ["subtitleCNNode"],
"subtitleCNNode": ["generateMasterPlayListAct"],
"act-start": ["act-package"],
"videoTransLD": ["generateMasterPlayListAct"],
"generateMasterPlayListAct": ["act-report"],
"audioENTransNode": ["generateMasterPlayListAct"]
}
}

サンプルコード

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

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

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

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

  2. MPS ライブラリへのメディアの追加

    MPS ライブラリへのメディアの追加 (Java)

    MPS ライブラリへのメディアの追加 (Python)

    MPS ライブラリへのメディアの追加 (PHP)