媒体处理可以将一个音视频文件转换成另一个或多个音视频文件,以适应不同网络带宽、终端设备和用户的需求,包括音视频转码、视频截图、视频水印等多个功能。本文提供了Python SDK媒体处理相关的API调用示例,包含提交转码作业(包含HLS标准加密、普通转码、替换水印等场景)、提交截图作业、查询截图数据、导播台视频预处理。
接口调用说明
本文提供的接口调用示例均通过AccessKey初始化客户端实例。
接口的参数解释和返回字段的详细说明请访问阿里云OpenAPI门户,在各接口右侧的文档页签查看。
本文仅提供部分复杂接口的代码示例,其余接口的SDK代码示例,可以通过阿里云OpenAPI门户获取。访问阿里云OpenAPI门户,在接口的左侧参数配置页签,填写需要的参数信息并发起调用后,在右侧的SDK示例页签,选择SDK版本,选择目标语言,查看并下载示例代码。
本文均以V1.0版本的SDK为例进行接口调用,如需获取V2.0版本的SDK示例,请在通过阿里云OpenAPI门户获取SDK示例时,指定到对应的SDK版本。
初始化客户端
使用前请先初始化客户端,请参见初始化。
提交转码作业-普通
调用SubmitTranscodeJobs接口,生成提交普通转码作业的SDK示例。
阿里云OpenAPI门户地址:SubmitTranscodeJobs。
调用示例如下:
此示例代码为普通转码(不加密)。阿里云视频加密方案请参见阿里云视频加密(私有加密)。
"""
* 构建覆盖参数,目前只支持图片水印文件地址、文字水印的内容覆盖;如不使用可忽略
* 需要替换的水印信息对应水印ID必须是关联在指定的转码模板ID上(即TranscodeTemplateId)
* 不支持通过本接口去增加一个没有关联上的水印
"""
def build_override_params():
# 以替换水印为例
watermarks = []
# 替换图片水印文件,FlieURL示例:https://192.168.0.0/16/watermarks/sample****.png
watermark1 = {'WatermarkId': '<watermarkId>', 'FileUrl': '<your File URL>'}
watermarks.append(watermark1)
# 替换文字水印
watermark2 = {'WatermarkId': '<watermarkId>', 'Content': 'new Text'}
watermarks.append(watermark2)
return {'Watermarks': watermarks}
""" 发起转码处理 """
from aliyunsdkvod.request.v20170321 import SubmitTranscodeJobsRequest
def normal_submit_transcode_jobs(clt):
request = SubmitTranscodeJobsRequest.SubmitTranscodeJobsRequest()
# 需要转码的视频ID
request.set_VideoId('<videoId>')
# 指定转码模板组
request.set_TemplateGroupId('<templateGroupId>')
"""
# 可选设置覆盖参数,如替换水印
overrideParams = build_override_params()
request.set_OverrideParams(json.dumps(overrideParams))
"""
request.set_accept_format('JSON')
response = json.loads(clt.do_action_with_exception(request))
return response
try:
clt = init_vod_client()
jobs = normal_submit_transcode_jobs(clt)
print(jobs['TranscodeJobs']['TranscodeJob'])
print(json.dumps(jobs, ensure_ascii=False, indent=4))
except Exception as e:
print(e)
print(traceback.format_exc())
提交转码作业-HLS标准加密
调用SubmitTranscodeJobs接口,生成使用HLS标准加密发起转码作业的SDK示例。
阿里云OpenAPI门户地址:SubmitTranscodeJobs。
调用示例如下:
此示例代码为使用HLS标准加密提交转码作业的示例。
"""
* 生成HLS标准加密参数的可选配置,无需使用时可忽略该配置
"""
from aliyunsdkvod.request.v20170321 import GenerateKMSDataKeyRequest
from aliyunsdkcore.http import protocol_type
def build_encrypt_config(clt):
try:
# 随机生成一个加密的密钥,返回的response包含明文密钥以及密文密钥
# 视频标准加密只需要传递密文密钥即可
request = GenerateKMSDataKeyRequest.GenerateKMSDataKeyRequest()
request.set_protocol_type(protocol_type.HTTPS)
request.set_accept_format('JSON')
response = json.loads(clt.do_action_with_exception(request))
# 解密接口地址,该参数需要将每次生成的密文密钥与接口URL拼接生成,表示每个视频的解密的密文密钥都不一样;注意您需要自己部署解密服务
# Ciphertext作为解密接口的参数名称,可自定义,此处只作为参考
# decryptKeyUri示例:http://example.aliyundoc.com/decrypt?' + 'Ciphertext=' + response['CiphertextBlob
decryptKeyUri = ['<your decryptKeyUri>']
return {'DecryptKeyUri': decryptKeyUri, 'KeyServiceType': 'KMS', 'CipherText': response['CiphertextBlob']}
except Exception as e:
print(e)
#print(traceback.format_exc())
return None
""" 发起转码处理 """
from aliyunsdkvod.request.v20170321 import SubmitTranscodeJobsRequest
def hlsencrypt_submit_transcode_jobs(clt):
request = SubmitTranscodeJobsRequest.SubmitTranscodeJobsRequest()
# 需要转码的视频ID
request.set_VideoId('<videoId>')
# 指定转码模板组
request.set_TemplateGroupId('<templateGroupId>')
# 使用KMS生成随机的加密密钥
encryptConfig = build_encrypt_config(clt)
if encryptConfig is not None:
request.set_EncryptConfig(json.dumps(encryptConfig))
request.set_accept_format('JSON')
response = json.loads(clt.do_action_with_exception(request))
return response
try:
clt = init_vod_client()
jobs = hlsencrypt_submit_transcode_jobs(clt)
print(jobs['TranscodeJobs']['TranscodeJob'])
print(json.dumps(jobs, ensure_ascii=False, indent=4))
except Exception as e:
print(e)
print(traceback.format_exc())
提交截图作业
调用SubmitSnapshotJob接口,生成提交截图作业的SDK示例。
阿里云OpenAPI门户地址:SubmitSnapshotJob。
调用示例如下:
创建截图模板详细请参见截图模板。
from aliyunsdkvod.request.v20170321 import SubmitSnapshotJobRequest
def submit_snapshot_job(clt):
request = SubmitSnapshotJobRequest.SubmitSnapshotJobRequest()
# 需要截图的视频ID
request.set_VideoId('<videoId>')
# 截图模板ID
#request.set_SnapshotTemplateId('<snapshotTemplateId>')
# 如果设置了截图模板ID,则会忽略下面参数
request.set_Count(50)
request.set_SpecifiedOffsetTime(0)
request.set_Interval(1)
request.set_Width(200)
request.set_Height(200)
# 雪碧图参数,如不使用可不设置
spriteSnapshotConfig = {'CellWidth': 120, 'CellHeight': 68, 'Columns': 3,
'Lines': 10, 'Padding': 20, 'Margin': 50}
# 保留雪碧图原始图
spriteSnapshotConfig['KeepCellPic'] = 'keep'
spriteSnapshotConfig['Color'] = 'tomato'
request.set_SpriteSnapshotConfig(json.dumps(spriteSnapshotConfig))
request.set_accept_format('JSON')
response = json.loads(clt.do_action_with_exception(request))
return response
try:
clt = init_vod_client()
job = submit_snapshot_job(clt)
print(json.dumps(job, ensure_ascii=False, indent=4))
except Exception as e:
print(e)
print(traceback.format_exc())
查询截图数据
调用ListSnapshots接口,生成查询截图数据的SDK示例。
阿里云OpenAPI门户地址:ListSnapshots。
导播台视频预处理
调用SubmitPreprocessJobs接口,生成导播台视频预处理的SDK示例。
阿里云OpenAPI门户地址:SubmitPreprocessJobs。