华为云媒体处理MPC对接使用完全指南:从入门到生产实践
1. 媒体处理MPC概述
媒体处理服务(Media Processing Center,简称MPC)是华为云提供的一种多媒体数据处理服务。它通过经济、弹性和高可扩展的转换方法,将存储于对象存储服务OBS上的音视频转码为适应各种终端(PC、TV、Phone等)播放的格式。MPC不仅支持常规的音视频转码,还实现了抽帧截图、图片水印、视频加密等功能,能够满足多样化的业务场景需求。
MPC的核心优势在于其结合了对象存储和云计算能力,以低成本、高效率且任意规模在线对媒体文件进行转码。它采用感知编码技术,分析视频中的每个场景、动作、内容和纹理,在保证视频画质的前提下实现更低的码率和带宽消耗。MPC预置了大量的音视频转码模板,同时也支持用户根据实际需求自定义转码模板和模板组。
需要先登录华为云控制台,点击:华为云控制台,还没有账号,点击:注册并关联,已有账号点击:登录后关联
在使用MPC服务之前,有几个关键概念需要了解。MPC本身不提供媒资存储功能,所有待处理的音视频文件必须预先上传到OBS桶中。MPC服务与OBS桶必须在同一区域,例如都位于“华北-北京四”区域。调用IAM接口的区域也需要与调用媒体处理接口的区域一致。此外,MPC设置了API流量控制,单租户接口流控为100次/分钟,接口总体流控为1000次/分钟。
2. 服务开通与准备工作
2.1 开通MPC服务
首次使用MPC服务时,需要登录华为云控制台,在服务列表中找到“媒体处理 MPC”并进入服务页面。首次开通时会进入计费详情页面,用户需要查看各个计费项的计费详情,并仔细阅读《华为云媒体处理服务协议》后,再开通使用MPC服务。单击“立即开通”即可完成服务开通。
2.2 准备工作
在使用MPC服务之前,需要完成以下准备工作:
- 创建OBS桶:在MPC服务所在区域创建一个OBS桶,用于存储原始音视频文件和转码输出文件。建议将原始文件和输出文件放在不同的桶中,便于管理和权限控制。
- 上传音视频文件:将待处理的音视频文件上传到OBS桶中。支持的上传方式包括控制台直接上传、OBS Browser+图形化工具、obsutil命令行工具以及SDK等方式。
- 获取云资源授权:需要将存储原始视频和转码视频的桶授权给媒体处理服务,允许MPC访问OBS桶中的文件。在MPC控制台的“云资源授权”页面完成授权操作。
- 获取项目ID:在“我的凭证 > API凭证”页面查看项目ID,后续调用API时需要用到。
- 获取Endpoint:从地区和终端节点页面获取MPC服务的Endpoint。
- 准备AK/SK:在“我的凭证 > 访问密钥”页面创建并获取访问密钥(AK/SK),用于SDK调用时的认证。
3. 控制台操作指南
3.1 创建视频转码任务
通过MPC控制台创建视频转码任务是最直观的操作方式。具体步骤如下:
- 登录媒体处理控制台。
- 在左侧导航树中选择“媒体处理 > 转码”,进入转码页面。
- 单击“创建任务”,进入创建任务页面。
- 配置基本参数,包括输入文件(从OBS桶中选择)、输出路径、转码模板等。
- 选择转码模板。媒体处理服务中预置了大量的一进一出和一进多出模板,建议优先使用系统预置模板。系统预置模板的相关参数可以在“全局设置 > 预置模板”页面查看。
- 配置完成,单击“确定”,转码任务开始执行。
- 在转码任务列表中查看任务执行情况。当前仅支持查看60天内的转码详情。
- 若转码成功,可在“转码输出”列单击“输出路径”查看转码后的视频文件。若转码失败,可通过“转码输出”列查看失败原因。
3.2 创建转封装任务
转封装任务可以对视频文件进行封装格式转换,而不改变其分辨率和码率。操作步骤如下:
- 登录媒体处理控制台。
- 在左侧导航树中选择“媒体处理 > 转封装”,进入转封装页面。
- 单击“创建任务”,弹出创建转封装任务对话框。
- 配置转封装任务参数,包括输入文件、输出路径、输出格式等。
- 单击“确定”完成创建。
- 在任务列表中查看执行情况,当任务状态为“处理成功”时,可在输出路径中获取转封装后的文件。
转封装支持的输入格式包括MP3、MP4、FLV、TS,输出格式包括HLS和MP4。
3.3 创建截图任务
MPC支持对视频进行抽帧截图,可以在转码过程中配置截图参数,也可以单独调用截图接口对源视频直接截图。控制台操作方式与转码任务类似,在创建任务时配置截图参数即可。
4. API调用方式
除了控制台操作,MPC提供了完整的REST风格API,支持通过HTTPS请求调用。API调用方式适用于需要将MPC集成到自有业务系统的场景,可以实现自动化、批量化的媒体处理。
4.1 获取用户Token
调用MPC API首先需要获取用户Token用于认证鉴权。在“我的凭证”页面获取username、password、domainname、projectname。然后调用IAM接口获取Token:
POST https://iam.cn-north-4.myhuaweicloud.com/v3/auth/tokens
Content-Type: application/json
{
"auth": {
"identity": {
"methods": ["password"],
"password": {
"user": {
"name": "用户名",
"password": "用户登录密码",
"domain": {
"name": "用户所属的账号名称"
}
}
}
},
"scope": {
"project": {
"name": "项目名称"
}
}
}
}调用IAM接口的区域需要与调用媒体处理接口的区域一致。获取Token后,在后续API调用的请求消息头中增加“X-Auth-Token”字段。
4.2 新建转码模板
若需要使用自定义的转码模板,可以先调用API创建转码模板。创建转码模板的API调用方式如下:
POST https://{endpoint}/v1/{project_id}/template/transcodings
X-Auth-Token: {用户Token}
Content-Type: application/json
{
"template_name": "MP4_H.264_1920x1080_6000_HEAAC",
"video": {
"codec": 1,
"bitrate": 6000,
"profile": 3,
"level": 15,
"preset": 3,
"ref_frames_count": 4,
"max_iframes_interval": 5,
"bframes_count": 4,
"frame_rate": 1,
"width": 1920,
"height": 1080,
"aspect_ratio": 0
},
"audio": {
"codec": 1,
"sample_rate": 4,
"bitrate": 128,
"channels": 2
},
"common": {
"PVC": 0,
"hls_interval": 5,
"dash_interval": 5,
"pack_type": 1
}
}请求响应成功后,返回转码模板ID。
4.3 新建水印模板
在转码时添加水印,需要先创建水印模板。创建水印模板的API调用方式如下:
POST https://{endpoint}/v1/{project_id}/template/watermark
X-Auth-Token: {用户Token}
Content-Type: application/json
{
"template_name": "watermark_1920*1080_10*10_BottomLeft",
"type": "Image",
"image_process": "Grayed",
"width": "1920",
"height": "1080",
"dx": "10",
"dy": "10",
"referpos": "BottomLeft",
"timeline_start": "6",
"timeline_duration": "8"
}请求响应成功后,返回水印模板ID。
4.4 提交视频转码任务
完成转码模板和水印模板的创建后,可以提交视频转码任务:
POST https://{endpoint}/v1/{project_id}/transcodings
X-Auth-Token: {用户Token}
Content-Type: application/json
{
"input": {
"bucket": "example-bucket",
"location": "region01",
"object": "/mpc/input/sample.mp4"
},
"output": {
"bucket": "example-bucket",
"location": "region01",
"object": "/mpc/output/"
},
"trans_template_id": [转码模板ID],
"watermark": [
{
"template_id": 水印模板ID
}
]
}4.5 提交视频截图任务
若需要单独对视频进行截图而不转码,可以调用视频截图接口。提交截图任务的API调用方式如下:
POST https://{endpoint}/v1/{project_id}/thumbnails
X-Auth-Token: {用户Token}
Content-Type: application/json
{
"input": {
"bucket": "example-bucket",
"location": "region01",
"object": "/mpc/input/sample.MP4"
},
"output": {
"bucket": "example-bucket",
"location": "region01",
"object": "/mpc/output/"
},
"tar": 1,
"thumbnail_para": {
"type": "DOTS",
"dots": [2, 4, 6, 8, 10],
"format": 0,
"aspect_ratio": 1,
"max_length": 480
}
}请求响应成功后,返回截图任务ID。可以通过查询截图任务接口获取任务执行状态。
5. SDK开发指南
MPC提供了多种编程语言的SDK,目前支持Java、Python和Go三种语言。使用SDK可以简化API调用过程,提高开发效率。下面以Python SDK和Java SDK为例进行说明。
5.1 Python SDK
5.1.1 环境准备
MPC SDK支持Python 3及以上版本。使用前需要安装两个核心包:huaweicloudsdkcore和huaweicloudsdkmpc。具体的SDK版本号请参见SDK开发中心。
pip install huaweicloudsdkcore
pip install huaweicloudsdkmpc5.1.2 导入依赖模块
from huaweicloudsdkcore.auth.credentials import BasicCredentials
from huaweicloudsdkcore.exceptions import exceptions
from huaweicloudsdkcore.http.http_config import HttpConfig
from huaweicloudsdkmpc.v1 import *5.1.3 配置客户端
# 配置认证信息
ak = os.environ.get("SDK_AK")
sk = os.environ.get("SDK_SK")
project_id = os.environ.get("PROJECT_ID")
credentials = BasicCredentials(ak, sk, project_id)
# 配置HTTP
config = HttpConfig.get_default_config()
config.timeout = 30
# 创建客户端
endpoint = "https://mpc.cn-north-4.myhuaweicloud.com"
client = MpcClient.new_builder() \
.with_http_config(config) \
.with_credentials(credentials) \
.with_endpoint(endpoint) \
.build()5.1.4 创建转码模板
def create_transcode_template(client):
request = CreateTransTemplateRequest()
body = TransTemplate()
body.template_name = "Python_SDK_MP4_1920x1080"
video = Video()
video.codec = 1 # H.264
video.bitrate = 6000
video.width = 1920
video.height = 1080
video.frame_rate = 1
body.video = video
audio = Audio()
audio.codec = 1 # AAC
audio.bitrate = 128
audio.sample_rate = 4
audio.channels = 2
body.audio = audio
common = Common()
common.pvc = 0
common.hls_interval = 5
common.pack_type = 1
body.common = common
request.body = body
try:
response = client.create_trans_template(request)
print(f"转码模板创建成功,模板ID: {response.template_id}")
return response.template_id
except exceptions.ClientRequestException as e:
print(f"创建转码模板失败: {e}")
return None5.1.5 提交转码任务
def submit_transcode_task(client, template_id):
request = CreateTranscodingTaskRequest()
body = CreateTranscodingTaskReq()
input_info = ObsObjInfo()
input_info.bucket = "example-bucket"
input_info.location = "cn-north-4"
input_info.object = "/mpc/input/sample.mp4"
body.input = input_info
output_info = ObsObjInfo()
output_info.bucket = "example-bucket"
output_info.location = "cn-north-4"
output_info.object = "/mpc/output/"
body.output = output_info
body.trans_template_id = [template_id]
request.body = body
try:
response = client.create_transcoding_task(request)
print(f"转码任务提交成功,任务ID: {response.task_id}")
return response.task_id
except exceptions.ClientRequestException as e:
print(f"提交转码任务失败: {e}")
return None5.1.6 查询转码任务状态
def query_transcode_task(client, task_id):
request = ListTranscodingTaskRequest()
request.task_id = [task_id]
try:
response = client.list_transcoding_task(request)
for task in response.task_array:
print(f"任务ID: {task.task_id}, 状态: {task.status}")
if task.status == "SUCCEEDED":
print(f"输出文件: {task.output.object}")
elif task.status == "FAILED":
print(f"失败原因: {task.error_code}")
except exceptions.ClientRequestException as e:
print(f"查询转码任务失败: {e}")5.2 Java SDK
5.2.1 初始化客户端
import com.huaweicloud.sdk.core.auth.BasicCredentials;
import com.huaweicloud.sdk.core.http.HttpConfig;
import com.huaweicloud.sdk.mpc.v1.MpcClient;
public class MpcClientExample {
public static MpcClient initMpcClient() {
HttpConfig httpConfig = HttpConfig.getDefaultHttpConfig()
.withIgnoreSSLVerification(true)
.withTimeout(3);
String ak = System.getenv("SDK_AK");
String sk = System.getenv("SDK_SK");
String projectId = System.getenv("PROJECT_ID");
String endpoint = "https://mpc.cn-north-4.myhuaweicloud.com";
BasicCredentials auth = new BasicCredentials()
.withAk(ak)
.withSk(sk)
.withProjectId(projectId);
return MpcClient.newBuilder()
.withHttpConfig(httpConfig)
.withCredential(auth)
.withEndpoint(endpoint)
.build();
}
}5.2.2 创建转码模板
import com.huaweicloud.sdk.mpc.v1.model.*;
public void createTransTemplate() {
MpcClient client = initMpcClient();
CreateTransTemplateRequest request = new CreateTransTemplateRequest();
TransTemplate body = new TransTemplate();
body.setTemplateName("Java_SDK_MP4_1920x1080");
Video video = new Video();
video.setCodec(1);
video.setBitrate(6000);
video.setWidth(1920);
video.setHeight(1080);
video.setFrameRate(1);
body.setVideo(video);
Audio audio = new Audio();
audio.setCodec(1);
audio.setBitrate(128);
audio.setSampleRate(4);
audio.setChannels(2);
body.setAudio(audio);
Common common = new Common();
common.setPvc(0);
common.setHlsInterval(5);
common.setPackType(1);
body.setCommon(common);
request.setBody(body);
try {
CreateTransTemplateResponse response = client.createTransTemplate(request);
System.out.println("转码模板创建成功,模板ID: " + response.getTemplateId());
} catch (Exception e) {
System.out.println("创建转码模板失败: " + e.getMessage());
}
}6. 核心功能详解
6.1 转码模板配置
MPC提供了丰富的转码模板配置选项,用户可以根据业务需求灵活配置。
视频参数:包括编码格式(H.264/H.265等)、码率、分辨率、帧率、编码档次(profile)、编码级别(level)等。对于H.264编码,profile可选baseline、main、high等不同档次,level决定了最大分辨率、码率等参数的上限。
音频参数:包括编码格式(AAC/MP3等)、采样率、码率、声道数等。
通用参数:包括PVC(是否开启高清低码)、HLS切片间隔、DASH切片间隔、封装格式等。
6.2 高清低码
MPC的高清低码功能通过感知编码技术,分析视频中的场景、动作、内容和纹理,在保证视频画质的前提下实现更低的码率和带宽消耗。开启高清低码后,可以在同等画质下将视频码率降低30%-50%,有效节省存储空间和带宽成本。
6.3 视频截图
MPC支持两种截图方式:
- 转码过程中截图:在提交转码任务时配置截图参数,转码的同时完成截图。
- 独立截图:单独调用截图接口,仅对源视频进行截图而不转码。
截图类型支持指定时间点截图(DOTS类型)和固定时间间隔截图(TIME类型)。截图格式支持JPG、PNG等常见图片格式。
6.4 水印添加
MPC支持在转码过程中为视频添加图片水印。水印模板支持配置以下参数:
- 水印类型:目前支持Image类型(图片水印)。
- 水印尺寸:通过width和height参数设置水印的宽度和高度。
- 水印位置:通过referpos参数设置水印在视频中的位置(如TopLeft、TopRight、BottomLeft、BottomRight等)。
- 水印偏移:通过dx和dy参数设置水印相对于参考位置的水平和垂直偏移量。
- 水印处理方式:通过image_process参数设置图片处理方式(如Grayed表示灰度处理)。
- 水印显示时间:通过timeline_start和timeline_duration参数设置水印开始显示的时间和持续时长。
6.5 转封装
转封装功能可以在不改变音视频编码格式和参数的情况下,转换文件的封装格式。支持的输入格式包括MP3、MP4、FLV、TS,输出格式包括HLS和MP4。转封装适用于需要改变文件容器格式但不需要重新编码的场景,处理速度快且不损失画质。
7. 常见问题与排查
7.1 转码失败常见原因
转码失败时,界面会输出报错提示。常见的失败原因包括:
- 编码格式不支持:源文件的编码格式不在MPC支持的格式列表中。支持转码的视频编码格式包括H.264、H.265、MPEG-2、MPEG-4、MJPEG、VP6/7/8/9、WMV1/2/3、ProRes 422等。
- 跨区域处理:MPC服务与OBS桶不在同一区域。
- OBS桶未授权:未将OBS桶授权给MPC服务访问。
- 字幕文件问题:字幕格式不符合要求(需为SRT格式)、字幕路径不正确或字幕文件不存在。
- 音频采样率过低:音频采样率低于12000Hz时可能被丢弃。
7.2 视频转码后只有音频没有画面
这种情况通常是由于转码模板中选择了音频封装格式或勾选了“禁用视频”选项。排查方法:
- 在“媒体处理 > 转码”的任务列表中检查转码模板是否为音频模板。
- 在“全局设置”中查看转码模板是否有勾选“禁用视频”。
7.3 MP3转封装MP4失败
可能原因是片源存在问题,目前仅支持采样率大于8000Hz的MP3文件转封装为MP4格式。
8. 计费说明与成本优化
8.1 计费项
MPC服务的费用包含转码费用、转封装费用、转推费用和截图费用。具体价格说明请参见MPC产品价格详情。
转码费用:按输出文件的时长计费。不同编码标准、分辨率、是否开启高清低码对应不同的单价。例如H.264标准转码或高清低码的费用都按照H.264 SD的可用时长进行计费。
一进多出模板计费:使用一进多出模板进行视频转码时,费用是多个输出视频的转码费用总和。
8.2 成本优化建议
- 合理选择存储类型:根据业务需求选择合适的热存储、冷存储类型,降低存储成本。
- 开启高清低码:在保证画质的前提下降低码率,减少带宽和存储成本。
- 按需使用:MPC支持按需计费模式,根据实际使用量付费,避免资源浪费。
- 使用价格计算器:通过MPC提供的价格计算器,根据业务诉求快速计算出参考价格。
9. 最佳实践
9.1 视频点播平台构建
MPC可以与OBS、CDN等服务组合,构建完整的视频点播平台。推荐架构如下:
- 使用OBS存储原始视频文件和转码输出文件。
- 使用MPC对视频进行转码,生成适应不同终端的多码率版本。
- 使用CDN加速视频分发,提升用户播放体验。
- 使用不同的桶隔离原始文件和输出文件,便于管理和权限控制。
9.2 自动化媒体处理
结合函数工作流FunctionGraph和OBS触发器,可以实现自动化的媒体处理流程。当OBS桶收到上传的视频后,自动触发FunctionGraph函数调用MPC接口创建转码任务,实现无人值守的自动化处理。
10. 总结
华为云媒体处理MPC是一项功能强大、易于使用的音视频处理服务。通过本文的介绍,相信读者已经掌握了MPC的基本概念、服务开通流程、控制台操作方法、API调用方式以及SDK开发技巧。无论是通过控制台进行简单的视频转码,还是通过API/SDK将MPC集成到复杂的业务系统中,MPC都能提供高效、稳定的媒体处理能力。
在实际使用过程中,建议先通过控制台熟悉MPC的各项功能,然后再根据业务需求选择合适的集成方式。对于需要自动化、批量处理的场景,推荐使用API或SDK方式进行集成。同时,合理配置转码参数、开启高清低码功能、选择合适的计费模式,可以有效控制成本,实现业务价值最大化。
常见问题解答
问1:MPC服务与OBS桶必须在同一区域吗?
是的。MPC不支持处理跨区域的媒资文件,MPC服务与OBS桶必须在同一区域。例如使用华北-北京四的MPC服务,只能处理华北-北京四OBS桶中的视频文件。
问2:如何获取项目ID和Endpoint?
项目ID可以在华为云控制台的“我的凭证 > API凭证”页面查看。Endpoint可以从地区和终端节点页面获取。
问3:MPC支持哪些输入视频编码格式?
MPC支持转码的视频编码格式包括H.264、H.265、MPEG-2、MPEG-4、MJPEG、VP6/7/8/9、WMV1/2/3、ProRes 422等。若源文件的编码格式不在支持列表中,会出现转码失败。
问4:转码任务失败如何排查?
转码失败时,界面会输出报错提示。常见原因包括编码格式不支持、跨区域处理、OBS桶未授权、字幕文件问题等。可以根据错误提示进行针对性排查,或联系华为工程师解决。
问5:MPC的转码费用如何计算?
MPC的转码费用按输出文件的时长计费。不同编码标准、分辨率、是否开启高清低码对应不同的单价。使用一进多出模板时,费用是多个输出视频的转码费用总和。具体价格请参见MPC产品价格详情。
问6:MPC支持哪些编程语言的SDK?
MPC目前支持Java、Python和Go三种语言的SDK。如果使用其他开发语言,可以通过MPC的REST API进行调用。




