多字幕转码打包最佳实践

本文档指导开发者通过阿里云IMS实现多字幕转码与打包,快速生成适配多终端播放的多字幕音视频。

转码打包流程

image

打包文件结构示例

#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基础配置

  • 存储配置:将OSS Bucket绑定至IMS服务,详情请参见配置存储地址

  • 回调配置:配置HTTP回调或MNS回调以接收任务状态通知,关于回调方式和回调事件的基本信息请参见回调事件概述

转码模板配置

配置流程

image

需求示例

编码协议:H264/H265

视频分辨率:360P/540P/720P/1080P

音频:HE-AAC 64Kbps(默认配置)。

字幕:M3U8(VTT)。

配置示例

以四种视频清晰度为例,按照下表创建转码模板,创建模板操作请参见创建转码模板

说明

如需进行窄带高清转码,请参照表格创建相应模板,随后提交工单,由阿里云在后台进行升级配置。

H264

转码模板

编码协议

封装格式

其他配置

视频-360P

H264

m3u8(.ts)

  • 分辨率(长边固定,短边自适应): 640*

  • 切片时长:5S

  • 其他按实际需求配置

视频-540P

H264

m3u8(.ts)

  • 分辨率(长边固定,短边自适应): 960*

  • 切片时长:5S

  • 其他按实际需求配置

视频-720P

H264

m3u8(.ts)

  • 分辨率(长边固定,短边自适应): 1280*

  • 切片时长:5S

  • 其他按实际需求配置

视频-1080P

H264

m3u8(.ts)

  • 分辨率(长边固定,短边自适应): 1920*

  • 切片时长:5S

  • 其他按实际需求配置

H265

说明
  • 优先选择:建议使用fmp4封装格式,这是APPLE的标准协议,且对Safari浏览器友好。

  • 替代方案:ts封装格式也可行,但不兼容Safari。

  • 控制台限制:fmp4封装格式在控制台中无法自主创建,建议先按m3u8(ts)封装格式进行创建,随后由阿里云在后台进行配置升级。

转码模板

编码协议

封装格式

其他配置

视频-360P

H265

m3u8(.fmp4)

  • 分辨率(长边固定,短边自适应): 640*

  • 切片时长:5S

  • 其他按实际需求配置

视频-540P

H265

m3u8(.fmp4)

  • 分辨率(长边固定,短边自适应): 960*

  • 切片时长:5S

  • 其他按实际需求配置

视频-720P

H265

m3u8(.fmp4)

  • 分辨率(长边固定,短边自适应): 1280*

  • 切片时长:5S

  • 其他按实际需求配置

视频-1080P

H265

m3u8(.fmp4)

  • 分辨率(长边固定,短边自适应): 1920*

  • 切片时长:5S

  • 其他按实际需求配置

多码率转码打包任务

发起多码率任务

调用SubmitMediaConvertJob接口,提交视频或音频文件的转码任务到智能媒体服务。

使用 OverrideParams 设置字幕流

当前无法在转码模板中自定义设置字幕信息,需要在提交任务时使用OverrideParams显示设置字幕信息。

参数

类型

说明

Subtitles

Array of Subtitle

字幕流设置。

Subtitle

参数

类型

说明

Codec

String

字幕流编码格式。HLS只支持vtt格式。

Config说明(HlsGroupConfig)

参数

类型

说明

Type

string

指定数据流类型:

取值:

  • video:视频流,处理时将仅保留与视频相关的设置。

  • audio:音频流,处理时将仅保留与音频相关的设置。

  • hybrid:混合流,处理时将保留与音频和视频相关的设置。

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\"}"
}