簡介

HLS打包是指將多字幕、多音軌、多碼率視頻流產生一個Master Playlist檔案的過程。包括兩個步驟:建立HLS打包工作流程、調用AddMedia介面指定視頻及HLS打包工作流程ID進行視頻的處理。

  1. 建立工作流程 時,有幾個需要關注的對象:
    • 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. 調用 新增媒體,需要注意以下幾點:
    • 指定媒體工作流程ID。

    • 若存在字幕提取,可以設定字幕檔案地址覆蓋Transcode活動中的參數WebVTTSubtitleURL,只支援WebVTT的字幕檔案。

    • 工作流程觸發模式設定為:NotInAuto。

情境

源檔案mxf格式(也可其它格式如mp4/flv/m3u8(ts)),從源檔案中提取3路音軌,提取2路視頻流。提取2路WebVTT字幕,最終組合打包成一個Master Playlist:

設定HLS打包輸出Master Playlist的位置及名稱。
  • 設定Bucket。

  • 設定Location。

  • 設定Master Playlist的名稱。

  • 活動定義如下:
    
    {
    "Parameters" : {
    "Output" : "{\"Bucket\": \"processedmediafile\",\"Location\": \"oss-cn-hangzhou\",\"MasterPlayListName\": \"{MediaId}/{RunId}/hls/master.m3u8\"}"
    },
    "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\"}"
    }
    • 預置靜態模板 ID:S00000001-100020表示音訊輸出為m3u8(ts),預置模板內設定的音頻碼率為80kbps。

    • AudioStreamMap:音頻流選擇字,參見 Output詳情 中的說明。

    • 在輸出中移除掉視頻流,參見 Video詳情

    • 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: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。
  • 通過提取音頻、視頻、字幕,將所有提取轉換後的資源打包成一個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" ]
}
}

範例程式碼

  1. 建立HLS打包工作流程

    建立工作流程-Java

    建立工作流程-Python

    建立工作流程-PHP

  2. 新增媒體

    新增媒體-Java

    新增媒體-Python

    新增媒體-PHP