簡介
HLS打包是指將多字幕、多音軌、多碼率視頻流產生一個Master Playlist檔案的過程。包括兩個步驟:建立HLS打包工作流程、調用AddMedia介面指定視頻及HLS打包工作流程ID進行視頻的處理。
- 建立工作流程 時,有幾個需要關注的對象:
-
Topology
拓撲結構是指可自訂的業務處理流程,DAG。
-
Activity
活動是指組成拓撲結構的處理節點,在建立HLS打包工作流程時要注意以下幾個活動:
-
指定HLS打包配置,設定Master Playlist檔案輸出位置。
前後依賴:
-
前置節點允許:Start。
-
後置節點允許:SubtitleGroup、AudioGroup、Transcode(僅視頻)。
-
-
指定字幕分組ID。
前後依賴:
-
前置節點允許:PackageConfig。
-
後置節點允許:Transcode(僅字幕)。
-
-
指定音頻分組ID。
前後依賴:
-
前置節點允許:PackageConfig。
-
後置節點允許:Transcode (僅音頻)。
-
-
用於提取視頻流、音頻流、字幕流。
前後依賴:
-
前置節點允許:PackageConfig、SubtitleGroup、AudioGroup。
-
後置節點允許:GenerateMasterPlayList。
-
-
HLS打包組建活動,指定視頻多碼率配置,指定音頻,字幕分組。
前後依賴:
-
前置節點允許:Transcode。
-
後置節點允許:Report。
-
-
-
Dependencies
依賴關係是拓撲結構中的邊,指明活動之間的依賴。
-
- 調用 新增媒體,需要注意以下幾點:
-
指定媒體工作流程ID。
-
若存在字幕提取,可以設定字幕檔案地址覆蓋Transcode活動中的參數WebVTTSubtitleURL,只支援WebVTT的字幕檔案。
-
工作流程觸發模式設定為:NotInAuto。
-
情境
源檔案mxf格式(也可其它格式如mp4/flv/m3u8(ts)),從源檔案中提取3路音軌,提取2路視頻流。提取2路WebVTT字幕,最終組合打包成一個Master Playlist:
-
設定Bucket。
-
設定Location。
-
設定Master Playlist的名稱。
-
活動定義如下:
{ "Parameters" : { "Output" : "{\"Bucket\": \"processedmediafile\",\"Location\": \"oss-cn-hangzhou\",\"MasterPlayListName\": \"{MediaId}/{RunId}/hls/master.m3u8\"}" }, "Type" : "PackageConfig" }
-
Output設定Master Playlist的儲存位置及名稱,參見 PackageConfig活動支援的參數。
-
Type指定活動類型為PackageConfig。
-
-
設定音頻分組ID,兩個音頻流同屬於一個音頻分組。
-
活動定義:
{ "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\"}" }
-
從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:384x216
-
Profile:Main
-
Bitrate:240 Kbps
-
Fps:25
-
PixelFormat:YUV420P Max GOP size:1 segment length (4 seconds)
-
輸出格式:m3u8
-
-
在輸出中移除掉音頻流,參見 Audio詳情。
-
MultiBitrateVideoStream 定義Master Playlist中的多碼率視頻流,URI指定Media Playlist的名稱。
-
Type設定為Transcode,即轉碼活動。
-
-
設定字幕分組ID,兩個字幕流同屬於一個字幕分組。
-
活動定義:
{ "Parameters" : { "GroupId" : "subtitles" }, "Type" : "SubtitleGroup" }
-
GroupId:指定音頻分組Id為subtitles。
-
Type:類型為SubtitleGroup活動。
-
-
上傳WebVtt格式的字幕到OSS中。
-
活動定義:
{ "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。
-
活動定義:
{ "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活動。
-
{
"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" ]
}
}
範例程式碼
- 建立HLS打包工作流程
- 新增媒體