多音轨转码打包最佳实践

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

转码打包流程

image

打包文件结构示例

#EXTM3U

# 音频流定义(多语言)
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio",NAME="中文",LANGUAGE="zh",DEFAULT=YES,URI="audio/chinese.m3u8"
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio",NAME="English",LANGUAGE="en",DEFAULT=NO,URI="audio/english.m3u8"

# 视频流定义(多码率)
#EXT-X-STREAM-INF:BANDWIDTH=400000,RESOLUTION=360x640,AUDIO="audio",CODECS="hvc1,mp4a.40.5"
video/360p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=900000,RESOLUTION=720x1280,AUDIO="audio",CODECS="hvc1,mp4a.40.5"
video/720p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2000000,RESOLUTION=1080x1920,AUDIO="audio",CODECS="hvc1,mp4a.40.5"
video/1080p.m3u8

前提条件

已开通智能媒体服务。请参见开通服务

配置准备

IMS基础配置

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

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

转码模板配置

配置流程

image

需求示例

编码协议:H264/H265

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

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

配置示例

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

说明

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

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

  • 其他按实际需求配置

音频-64Kbps

HE-AAC

m3u8(.ts)

  • 禁用视频

  • 切片时长:5S

说明

控制台当前无法创建该模板,建议通过API提交工单,以寻求协助进行修改。

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

  • 其他按实际需求配置

音频-64Kbps

HE-AAC

m3u8(.fmp4)

  • 禁用视频

  • 切片时长:5S

说明

控制台当前无法创建该模板,建议通过API提交工单,以寻求协助进行修改。

多码率转码打包任务

发起多码率任务

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

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:转码并生成多码率打包文件

{
  "Inputs": [
    {
      "Name": "video",
      "InputFile": {
        "Type": "OSS",
        "Media": "https://<Bucket>.<外网Endpoint>/<视频1中文>"
      }
    },
    {
      "Name": "EnglishAudio",
      "InputFile": {
        "Type": "OSS",
        "Media": "https://<Bucket>.<外网Endpoint>/<视频1英文>"
      }
    },
    {
      "Name": "JapaneseAudio",
      "InputFile": {
        "Type": "OSS",
        "Media": "https://<Bucket>.<外网Endpoint>/<视频1日语>"
      }
    }
  ],
  "OutputGroups": [
    {
      "GroupConfig": {
        "Type": "Hls",
        "OutputFileBase": {
          "Type": "OSS",
          "Media": "https://<Bucket>.<外网Endpoint>/<URI>/"
        },
        "ManifestName": "<m3u8filename>"
      },
      "Outputs": [
        {
          "Name": "360P",
          "InputRef": "video",
          "OutputFileName": "video/360p/360p",
          "TemplateId": "视频-360P"
        },
        {
          "Name": "540P",
          "InputRef": "video",
          "OutputFileName": "video/540p/540p",
          "TemplateId": "视频-540P"
        },
        {
          "Name": "720P",
          "InputRef": "video",
          "OutputFileName": "video/720p/720p",
          "TemplateId": "视频-720P"
        },
        {
          "Name": "1080P",
          "InputRef": "video",
          "OutputFileName": "video/1080p/1080p",
          "TemplateId": "视频-1080P"
        },
        {
          "OutputFileName": "audio/chinese/chinese",
          "TemplateId": "音频-64Kbps",
          "HlsGroupConfig": {
            "Name": "Chinese",
            "Type":"audio",
            "Language": "zh",
            "Autoselect": "TRUE",
            "Default": "TRUE"
          }
        },
        {
          "InputRef": "EnglishAudio",
          "OutputFileName": "audio/english/english",
          "TemplateId": "音频-64Kbps",
          "HlsGroupConfig": {
            "Name": "English",
            "Type":"audio",
            "Language": "en",
            "Autoselect": "TRUE"
          }
        },
        {
          "InputRef": "JapaneseAudio",
          "OutputFileName": "audio/japanese/japanese",
          "TemplateId": "音频-64Kbps",
          "HlsGroupConfig": {
            "Name": "Japanese",
            "Type":"audio",
            "Language": "ja",
            "Autoselect": "TRUE"
                    }
                }
            ]
        }
    ]
}

场景2:在原 hls manifest 基础上增加音轨

配置步骤:

  1. 指定了名为“ExtraAudio”的输入。并在输出中引用该输入以转码为音频 HLS 流。

  2. 在 GroupConfig 中的 ManifestExtend 选项中设置 InputRef,以引用输入中的 "RefManifest" 文件,从而复用 manifest,实现基于原 manifest 增加额外音轨的目的。

{
  "Inputs": [
    {
      "Name": "ExtraAudio",
      "InputFile": {
        "Type": "OSS",
        "Media": "http://your-bucket.oss-region.aliyuncs.com/in/extra-audio.mp4"
      }
    },
    {
      "Name": "RefManifest",
      "InputFile": {
        "Type": "OSS",
        "Media": "http://your-bucket.oss-region.aliyuncs.com/in/manifest.m3u8"
      }
    }
  ],
  "OutputGroups": [
    {
      "GroupConfig": {
        "Type": "Hls",
        "OutputFileBase": {
          "Type": "OSS",
          "Media": "http://your-bucket.oss-region.aliyuncs.com/out/demo"
        },
        "ManifestName": "manifest",
        "ManifestExtend": {
          "InputRef": "RefManifest"
        }
      },
      "Outputs": [
        {
          "Name": "ExtraAudioOut",
          "InputRef": "ExtraAudio",
          "OutputFileName": "extra-audio",
          "TemplateId": "#音频模板Id",
          "hlsGroupConfig": {
            "Type": "audio",
            "Name":"Chinese",
            "Language": "zh-cn"
          }
        }
      ]
    }
  ]
}

场景3:在原 hls manifest 基础上音轨替换

场景2的基础上,在 ManifestExtend 中增加 “Excludes” 选项,以排除原始 manifest 中的一些流。

{
  "Inputs": [
    {
      "Name": "ExtraAudio",
      "InputFile": {
        "Type": "OSS",
        "Media": "http://your-bucket.oss-region.aliyuncs.com/in/extra-audio.mp4"
      }
    },
    {
      "Name": "RefManifest",
      "InputFile": {
        "Type": "OSS",
        "Media": "http://your-bucket.oss-region.aliyuncs.com/in/manifest.m3u8"
      }
    }
  ],
  "OutputGroups": [
    {
      "GroupConfig": {
        "Type": "Hls",
        "OutputFileBase": {
          "Type": "OSS",
          "Media": "http://your-bucket.oss-region.aliyuncs.com/out/demo"
        },
        "ManifestName": "manifest",
        "ManifestExtend": {
          "InputRef": "RefManifest",
          "Excludes": [
            {
              "Rule": "tag",
              "Tags": {"Language": "zh-CN"}
            }]
        }
      },
      "Outputs": [
        {
          "Name": "ExtraAudioOut",
          "InputRef": "ExtraAudio",
          "OutputFileName": "extra-audio",
          "TemplateId": "#音频模板Id",
          "hlsGroupConfig": {
            "Type": "audio",
            "Name":"Chinese",
            "Language": "zh-cn"
          }
        }
      ]
    }
  ]
}

查询任务结果

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

播放多码率打包视频

使用阿里云播放器,以实现多码率打包视频的播放。

视频翻译+多码率打包流程

image
  1. 输入准备:输入源文件。

  2. 翻译处理:将源文件翻译为目标语言(如英语、日语),生成对应的音频或视频文件。

  3. 视频转码打包流程:调用 SubmitMediaConvertJob 接口,合并多语言内容并转码为支持多码率的标准化视频。