媒体处理

媒体处理可以将一个音视频文件转换成另一个或多个音视频文件,以适应不同网络带宽、终端设备和用户的需求,包括音视频转码、视频截图、视频水印等多个功能。本文提供了Java SDK媒体处理相关的API调用示例,包含提交转码作业(包含HLS标准加密、普通转码、替换水印等场景)、提交截图作业、查询截图数据、导播台视频预处理。

接口调用说明

  • 本文提供的接口调用示例均通过AccessKey初始化客户端实例。

  • 接口的参数解释和返回字段的详细说明请访问阿里云OpenAPI门户,在各接口右侧的文档页签查看。

  • 本文仅提供部分复杂接口的代码示例,其余接口的SDK代码示例,可以通过阿里云OpenAPI门户获取。访问阿里云OpenAPI门户,在接口的左侧参数配置页签,填写需要的参数信息并发起调用后,在右侧的SDK示例页签,选择SDK版本,选择目标语言,查看并下载示例代码。

  • 本文均以V1.0版本的SDK为例进行接口调用,如需获取V2.0版本的SDK示例,请在通过阿里云OpenAPI门户获取SDK示例时,指定到对应的SDK版本。image.png

初始化客户端

使用前请先初始化客户端,请参见初始化

提交转码作业

调用SubmitTranscodeJobs接口,完成提交转码作业功能。

说明

阿里云OpenAPI门户地址:SubmitTranscodeJobs

调用示例如下:

import com.aliyuncs.auth.AlibabaCloudCredentials;
import com.aliyuncs.auth.EnvironmentVariableCredentialsProvider;
import com.aliyuncs.vod.model.v20170321.SubmitTranscodeJobsRequest;
import com.aliyuncs.vod.model.v20170321.SubmitTranscodeJobsResponse;
import com.aliyuncs.vod.model.v20170321.GenerateKMSDataKeyRequest;
import com.aliyuncs.vod.model.v20170321.GenerateKMSDataKeyResponse;

/** 
 * 读取AccessKey信息
 */
public static DefaultAcsClient initVodClient() throws ClientException {
    // 点播服务接入地域
    String regionId = "cn-shanghai";  
    // 阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维。
    // 强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。
    // 本示例通过从环境变量中读取AccessKey,来实现API访问的身份验证。运行代码示例前,请配置环境变量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
    DefaultProfile profile = DefaultProfile.getProfile(regionId, System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
    DefaultAcsClient client = new DefaultAcsClient(profile);
    return client;
    }

/**
 * 提交媒体处理作业
 */
public static SubmitTranscodeJobsResponse submitTranscodeJobs(DefaultAcsClient client) throws Exception {
    SubmitTranscodeJobsRequest request = new SubmitTranscodeJobsRequest();
    //需要转码的视频ID
    request.setVideoId("34a6ca54f5c140eece85a289****");
    //转码模板ID
    request.setTemplateGroupId("e8aa925a9798c630d30cd****");
    //构建需要替换的水印参数(只有需要替换水印相关信息才需要构建)
    JSONObject overrideParams = buildOverrideParams();
    //覆盖参数,暂只支持水印部分参数替换(只有需要替换水印相关信息才需要传递)
    request.setOverrideParams(overrideParams.toJSONString());
    //构建标准加密配置参数(只有标准加密才需要构建)
    JSONObject encryptConfig = buildEncryptConfig(client);
    //HLS标准加密配置(只有标准加密才需要传递)
    request.setEncryptConfig(encryptConfig.toJSONString());
    return client.getAcsResponse(request);
}


/**
 * 以下为调用示例
 */
public static void main(String[] args) throws ClientException {
    DefaultAcsClient client = initVodClient();
    SubmitTranscodeJobsResponse response = new SubmitTranscodeJobsResponse();
    try {
        response = submitTranscodeJobs(client);
        //任务ID
        System.out.println("JobId = " + response.getTranscodeJobs().get(0).getJobId());
    } catch (Exception e) {
        System.out.println("ErrorMessage = " + e.getLocalizedMessage());
    }
    System.out.println("RequestId = " + response.getRequestId());
}

/**
 * 构建HLS标准加密的配置信息
 * @return
 * @throws ClientException
 */
public static JSONObject buildEncryptConfig(DefaultAcsClient client) throws ClientException {
    //注意:Client为VOD的sdk client。可以通过 initVodClient 方法初始化
    GenerateKMSDataKeyResponse response = generateDataKey(client);
    JSONObject encryptConfig = new JSONObject();
    //解密接口地址,该参数需要将每次生成的密文密钥与接口URL拼接生成,表示每个视频的解密的密文密钥都不一样
    //至于Ciphertext这个解密接口参数的名称,用户可自行制定,这里只作为参考参数名称
    encryptConfig.put("DecryptKeyUri", "http://example.aliyundoc.com/decrypt?" +
            "Ciphertext=" + response.getCiphertextBlob());
    //密钥服务的类型,目前只支持KMS
    encryptConfig.put("KeyServiceType", "KMS");
    //密文密钥
    encryptConfig.put("CipherText", response.getCiphertextBlob());
    return encryptConfig;
}

/**
 * 1、构建覆盖参数,目前只支持图片水印文件地址、文字水印的内容覆盖。
 * 2、需要替换的水印信息,对应水印ID必须是关联在指定的模板ID(即TranscodeTemplateId)中。
 * 3、不支持通过媒体处理接口去增加一个没有关联上的水印。
 * 注意:图片水印的文件存储源站需要和发起转码的视频存储源站一致。
 * @return
 */
public static JSONObject buildOverrideParams() {
    JSONObject overrideParams = new JSONObject();
    JSONArray watermarks = new JSONArray();
    //图片水印文件地址替换
    JSONObject watermark1 = new JSONObject();
    //模板上面关联需要替换的水印文件图片水印ID
    watermark1.put("WatermarkId", "2ea587477c5a1bc8b57****");
    //需要替换成对应图片水印文件的OSS地址,水印文件存储源站需要和视频存储源站一致
    watermark1.put("FileUrl", "https:192.168.0.1/16");

    //文字水印内容替换
    JSONObject watermark2 = new JSONObject();
    //模板上面关联需要替换内容的文字水印ID
    watermark2.put("WatermarkId", "d297ba31ac5242d207****");
    //需要替换成对应的内容
    watermark2.put("Content", "用户ID:6****");
    watermarks.add(watermark2);
    overrideParams.put("Watermarks", watermarks);
    return overrideParams;
}

/**
 * 生成加密需要的密钥,response中包含密文密钥和明文密钥,用户只需要将密文密钥传递给点播即可
 * @return
 * @throws ClientException
 */
public static GenerateKMSDataKeyResponse generateDataKey(DefaultAcsClient client) throws ClientException {
    GenerateKMSDataKeyRequest request = new GenerateKMSDataKeyRequest();
    return client.getAcsResponse(request);
}

提交截图作业

调用SubmitSnapshotJob接口,完成提交截图作业功能。

说明

创建截图模板的详细信息请参见截图模板

阿里云OpenAPI门户地址:SubmitSnapshotJob

调用示例如下:

import com.aliyuncs.auth.AlibabaCloudCredentials;
import com.aliyuncs.auth.EnvironmentVariableCredentialsProvider;
import com.aliyuncs.vod.model.v20170321.SubmitSnapshotJobRequest;
import com.aliyuncs.vod.model.v20170321.SubmitSnapshotJobResponse;

/** 
 * 读取AccessKey信息
 */
public static DefaultAcsClient initVodClient() throws ClientException {
    // 点播服务接入地域
    String regionId = "cn-shanghai";  
    // 阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维。
    // 强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。
    // 本示例通过从环境变量中读取AccessKey,来实现API访问的身份验证。运行代码示例前,请配置环境变量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
    DefaultProfile profile = DefaultProfile.getProfile(regionId, System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
    DefaultAcsClient client = new DefaultAcsClient(profile);
    return client;
    }

/**
 * 提交媒体截图处理作业调用函数
 */
public static SubmitSnapshotJobResponse submitSnapshotJob(DefaultAcsClient client) throws Exception {
    SubmitSnapshotJobRequest request = new SubmitSnapshotJobRequest();
    //需要截图的视频ID(推荐传递截图模板ID)
    request.setVideoId("4d237a8270084849bf4207876181****");
    //截图模板ID
    request.setSnapshotTemplateId("5d745e6b8baadf589e0702426cfc6****");

    //如果设置了SnapshotTemplateId,会忽略下面参数
    request.setCount(50L);
    request.setSpecifiedOffsetTime(0L);
    request.setInterval(1L);
    request.setWidth("200");
    request.setHeight("200");
    JSONObject spriteSnapshotConfig = buildSnapshotTemplateConfig();
    request.setSpriteSnapshotConfig(spriteSnapshotConfig.toJSONString());
    return client.getAcsResponse(request);
}

/**
 * 构建雪碧图截图配置
 * @return
 */
public static JSONObject buildSnapshotTemplateConfig() {
    JSONObject spriteSnapshotConfig = new JSONObject();
    spriteSnapshotConfig.put("CellWidth", "120");
    spriteSnapshotConfig.put("CellHeight", "68");
    spriteSnapshotConfig.put("Columns", "3");
    spriteSnapshotConfig.put("Lines", "10");
    spriteSnapshotConfig.put("Padding", "20");
    spriteSnapshotConfig.put("Margin", "50");
    //保留雪碧图原始图
    spriteSnapshotConfig.put("KeepCellPic", "keep");
    spriteSnapshotConfig.put("Color", "tomato");
    return spriteSnapshotConfig;
}

/**
 * 以下为调用示例
 */
public static void main(String[] args) throws ClientException {
    DefaultAcsClient client = initVodClient();
    SubmitSnapshotJobResponse response = new SubmitSnapshotJobResponse();
    try {
        response = submitSnapshotJob(client);
        //任务ID
        System.out.println("JobId = " + response.getSnapshotJob().getJobId());
    } catch (Exception e) {
        System.out.println("ErrorMessage = " + e.getLocalizedMessage());
    }
    System.out.println("RequestId = " + response.getRequestId());
}

查询截图数据

调用ListSnapshots接口,完成查询截图数据的功能。

阿里云OpenAPI门户地址:ListSnapshots

导播台视频预处理

调用SubmitPreprocessJobs接口,完成导播台视频预处理功能。

阿里云OpenAPI门户地址:SubmitPreprocessJobs

相关文档

  • 媒体处理概述:介绍视频点播提供的媒体处理能力,包括能力类型、使用场景及各媒体处理能力的详细信息。

  • 转码常见问题:介绍使用视频点播转码过程中的常见问题及处理建议。