本文档指导开发者通过阿里云IMS实现多字幕转码与打包,快速生成适配多终端播放的多字幕音视频。
转码打包流程
打包文件结构示例
#EXTM3U
# 音频流定义(多语言)
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio",NAME="中文-音频",DEFAULT=YES,AUTOSELECT=YES,FORCED=NO,LANGUAGE="zh",URI="audio/chinese/chinese.m3u8"
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio",NAME="English-Audio",DEFAULT=NO,AUTOSELECT=YES,FORCED=NO,LANGUAGE="en",URI="audio/english/english.m3u8"
# 视频流定义(多码率)
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=900000,CODECS="avc1.640020",RESOLUTION=720x1280,AUDIO="audio",SUBTITLES="subtitle"
video/720p/720p.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=400000,CODECS="avc1.640020",RESOLUTION=360x640,AUDIO="audio",SUBTITLES="subtitle"
video/360p/360p.m3u8
# 字幕流定义(多语言)
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subtitle",NAME="中文-字幕",DEFAULT=YES,AUTOSELECT=YES,FORCED=NO,LANGUAGE="zh",URI="subtitle/chinese/chinese.m3u8"
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subtitle",NAME="English-Subtitle",DEFAULT=NO,AUTOSELECT=YES,FORCED=NO,LANGUAGE="en",URI="subtitle/english/english.m3u8"
前提条件
已开通智能媒体服务。请参见开通服务。
配置准备
IMS基础配置
转码模板配置
配置流程
需求示例
编码协议:H264/H265
视频分辨率:360P/540P/720P/1080P
音频:HE-AAC 64Kbps(默认配置)。
字幕:M3U8(VTT)。
配置示例
以四种视频清晰度为例,按照下表创建转码模板,创建模板操作请参见创建转码模板。
如需进行窄带高清转码,请参照表格创建相应模板,随后提交工单,由阿里云在后台进行升级配置。
H264
转码模板 | 编码协议 | 封装格式 | 其他配置 |
视频-360P | H264 | m3u8(.ts) |
|
视频-540P | H264 | m3u8(.ts) |
|
视频-720P | H264 | m3u8(.ts) |
|
视频-1080P | H264 | m3u8(.ts) |
|
H265
优先选择:建议使用fmp4封装格式,这是APPLE的标准协议,且对Safari浏览器友好。
替代方案:ts封装格式也可行,但不兼容Safari。
控制台限制:fmp4封装格式在控制台中无法自主创建,建议先按m3u8(ts)封装格式进行创建,随后由阿里云在后台进行配置升级。
转码模板 | 编码协议 | 封装格式 | 其他配置 |
视频-360P | H265 | m3u8(.fmp4) |
|
视频-540P | H265 | m3u8(.fmp4) |
|
视频-720P | H265 | m3u8(.fmp4) |
|
视频-1080P | H265 | m3u8(.fmp4) |
|
多码率转码打包任务
发起多码率任务
调用SubmitMediaConvertJob接口,提交视频或音频文件的转码任务到智能媒体服务。
使用 OverrideParams 设置字幕流
当前无法在转码模板中自定义设置字幕信息,需要在提交任务时使用OverrideParams
显示设置字幕信息。
参数 | 类型 | 说明 |
Subtitles | Array of Subtitle | 字幕流设置。 |
Subtitle
参数 | 类型 | 说明 |
Codec | String | 字幕流编码格式。HLS只支持vtt格式。 |
Config说明(HlsGroupConfig)
参数 | 类型 | 说明 |
Type | string | 指定数据流类型: 取值:
|
Bandwidth | string | 设置带宽(可选),默认使用码率(bps)。 当Type为 video 和 hybrid 时生效。 |
AudioGroup | string | 该路视频流引用的音频组。当Type为 video 生效。 |
SubtitleGroup | string | 该路视频流引用的字幕组。当Type为 video 和 hybrid 时生效。 |
Name | string | 该输出流在 HLS manifest 中的 NAME 属性。当Type为 audio 或 subtitle 时,此项为必填。 |
Group | string | 该输出流在 HLS Manifest 中的 GROUP_ID 属性。该属性在 Type 为 audio 和 subtitle 时生效。 默认与 Type 的取值相同。 |
Language | string | 该输出流在 HLS manifest 中的 LANGUAGE 属性,当Type为 audio 和 subtitle 时生效,需遵循 RFC 5646 标准。 |
Default | boolean | 是否设为默认流。当Type为 audio 时生效。 |
AutoSelect | boolean | 是否自动选择流。当Type为 audio 时生效。 |
Forced | boolean | 是否强制显示。当Type为 audio 时生效。 |
场景1:转码并生成多码率打包文件
{
"Config": {
"Inputs": [
{
"Name": "video",
"InputFile": {
"Type": "OSS",
"Url": "https://<Bucket>.<OSS外网Endpoint>/<视频1中文>"
}
},
{
"Name": "EnglishAudio",
"InputFile": {
"Type": "OSS",
"Url": "https://<Bucket>.<OSS外网Endpoint>/<音频频1英文>"
}
},
{
"Name": "ChineseSubtitle",
"InputFile": {
"Type": "OSS",
"Url": "https://<Bucket>.<OSS外网Endpoint>/<字幕1中文>"
}
},
{
"Name": "EnglishSubtitle",
"InputFile": {
"Type": "OSS",
"Url": "https://<Bucket>.<OSS外网Endpoint>/<字幕1英文>"
}
}
],
"OutputGroups": [
{
"Name": "Hls",
"GroupConfig": {
"Type": "Hls",
"OutputFileBase": {
"Type": "OSS",
"Url": "https://<Bucket>.<外网Endpoint>/<URI>/"
},
"ManifestName": "<m3u8filename>"
},
"Outputs": [
{
"Name": "720P",
"OutputFileName": "video/720p/720p",
"TemplateId": "视频-720P",
"HlsGroupConfig": {
"Type": "Video"
}
},
{
"Name": "360P",
"OutputFileName": "video/360p/360p",
"TemplateId": "视频-360P",
"HlsGroupConfig": {
"Type": "Video"
}
},
{
"OutputFileName": "audio/chinese/chinese",
"TemplateId": "音频-64Kbps",
"HlsGroupConfig": {
"Type": "Audio",
"Name": "ChineseAudio",
"Language": "zh",
"Autoselect": "TRUE",
"Default": "TRUE"
}
},
{
"InputRef": "ChineseSubtitle",
"OutputFileName": "subtitle/chinese/chinese",
"TemplateId": "打包任务中任意模板ID",
"OverrideParams": {
"Subtitles": [
{
"Codec": "vtt"
}
]
},
"HlsGroupConfig": {
"Type": "Subtitle",
"Name": "ChineseSubtitle",
"Language": "zh",
"Autoselect": "TRUE",
"Default": "TRUE"
}
},
{
"InputRef": "EnglishAudio",
"OutputFileName": "audio/english/english",
"TemplateId": "音频-64Kbps",
"HlsGroupConfig": {
"Type": "Audio",
"Name": "EnglishAudio",
"Language": "en",
"Autoselect": "TRUE",
"Default": "FALSE"
}
},
{
"InputRef": "EnglishSubtitle",
"OutputFileName": "subtitle/english/english",
"TemplateId": "打包任务中任意模板ID",
"OverrideParams": {
"Subtitles": [
{
"Codec": "vtt"
}
]
},
"HlsGroupConfig": {
"Type": "Subtitle",
"Name": "EnglishSubtitle",
"Language": "en",
"Autoselect": "TRUE",
"Default": "FALSE"
}
}
]
}
]
}
}
查询任务结果
调用GetMediaConvertJob接口获取转码任务详情。
回调事件通知
事件类型:EventType:MediaConvertComplete
配置方式:控制台尚未开发该事件的选择功能,用户可通过SetEventCallback接口进行配置。
关键字段说明
参数名称 | 类型 | 必选 | 描述 | |
Name | String | 是 | 主任务名称。 | |
JobId | String | 是 | 任务id。 | |
Status | String | 是 | 任务结果中,"Success"表示成功。如果在子任务中有任一任务成功,则整体结果视为成功。 | |
TriggerSource | String | 否 | 触发来源,API指的是API的提交操作。 | |
FinishTime | String | 否 | 完成时间,格式应与EventTime相同。 | |
UserData | string | 否 | 提交任务时传入的自定义数据。 |
示例
{
"FinishTime": "2025-05-09T08:03:21Z",
"JobId": "your-job-id",
"Status": "Success",
"TriggerSource": "IceWorkflow",
"UserData": "{\"ImsSrc\":\"Workflow\",\"TaskId\":\"e89a955d88ca47f0b9b79c562e5c622f\"}"
}