场景:

  阿里云视频点播在控制台上传加密转码视频时,控制台使用模板上传视频只支持私有加密和不加密两种方式,如果需要对视频进行标准加密,需要使用阿里云的SDK在本地进行加密上传操作。

控制台步骤:

  1,创建转码模板,在模板详情里获取TemplateGroupId(模板id),同时在域名配置中获取解密接口地址

  

 

  2,上传需要标准加密的视频(使用不转码模板),然后在视频详情里获取videoId(视频id)

  3,使用RAM服务给视频点播授权访问业务方密钥管理服务(KMS)的权限,在RAM控制台获取主用户accessKeyId和accessKeySecret,在KMS控制台获取上传视频区域的serviceKey

   

 

 

本地代码步骤:

  1,引入阿里云jar包(maven),版本可根据实际情况来引入

    <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-core</artifactId>
            <version>4.5.1</version>
        </dependency>
        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>3.10.2</version>
        </dependency>
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-vod</artifactId>
            <version>2.15.11</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.28</version>
        </dependency>
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20170516</version>
    </dependency>

  2,使用官网给的java demo经过修改适配自己的标准加密视频上传

  

package com.downdog;

import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.kms.model.v20160120.GenerateDataKeyRequest;
import com.aliyuncs.kms.model.v20160120.GenerateDataKeyResponse;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.vod.model.v20170321.SubmitTranscodeJobsRequest;
import com.aliyuncs.vod.model.v20170321.SubmitTranscodeJobsResponse;

public class AliyunMain {

    /**
     * 以下为调用示例
     */
    public static void main(String[] args) throws ClientException {
        DefaultAcsClient client = initVodClient("${accessKeyId}", "${accessKeySecret}");
        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());
    }

    public static DefaultAcsClient initVodClient(String accessKeyId, String accessKeySecret) throws ClientException {
        String regionId = "cn-shanghai";  // 点播服务接入区域
        DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
        DefaultAcsClient client = new DefaultAcsClient(profile);
        return client;
    }

    /**
     * 提交媒体处理作业
     */
    public static SubmitTranscodeJobsResponse submitTranscodeJobs(DefaultAcsClient client) throws Exception {
        SubmitTranscodeJobsRequest request = new SubmitTranscodeJobsRequest();
        //需要转码的视频ID
        request.setVideoId("${videoId}");
        //转码模板ID
        request.setTemplateGroupId("${templateGroupId}");
        //构建标准加密配置参数(只有标准加密才需要构建)
        JSONObject encryptConfig = buildEncryptConfig(client);
        //HLS标准加密配置(只有标准加密才需要传递)
        request.setEncryptConfig(encryptConfig.toJSONString());
        return client.getAcsResponse(request);
    }

    /**
     * 构建HLS标准加密的配置信息
     *
     * @return
     * @throws ClientException
     */
    public static JSONObject buildEncryptConfig(DefaultAcsClient client) throws ClientException {
        //点播给用户在KMS(密钥管理服务)中的Service Key,可在用户密钥管理服务对应的区域看到描述为vod的service key
        String serviceKey = "${serviceKey}";
        //随机生成一个加密的密钥,返回的response包含明文密钥以及密文密钥
        //视频标准加密只需要传递密文密钥即可
        //注意:KMS Client建议单独初始化来保证正确的接入区域,可参考VOD初始化方式,传入正确的KMS服务区域。
        GenerateDataKeyResponse response = generateDataKey(client, serviceKey);
        JSONObject encryptConfig = new JSONObject();
        //解密接口地址,该参数需要将每次生成的密文密钥与接口URL拼接生成,表示每个视频的解密的密文密钥都不一样
        //至于Ciphertext这个解密接口参数的名称,用户可自行制定,这里只作为参考参数名称
        encryptConfig.put("DecryptKeyUri", "${url}" +
                "Ciphertext=" + response.getCiphertextBlob());
        //密钥服务的类型,目前只支持KMS
        encryptConfig.put("KeyServiceType", "KMS");
        //密文密钥
        encryptConfig.put("CipherText", response.getCiphertextBlob());
        return encryptConfig;
    }

    /**
     * 生成加密需要的密钥,response中包含密文密钥和明文密钥,用户只需要将密文密钥传递给点播即可
     * 注意:KeySpec 必须传递AES_128,且不能设置NumberOfBytes
     *
     * @param client     KMS-SDK客户端
     * @param serviceKey 点播提供生成密钥的service key,在用户的密钥管理服务中可看到描述为vod的加密key
     * @return
     * @throws ClientException
     */
    public static GenerateDataKeyResponse generateDataKey(DefaultAcsClient client, String serviceKey) throws ClientException {
        GenerateDataKeyRequest request = new GenerateDataKeyRequest();
        request.setKeyId(serviceKey);
        request.setKeySpec("AES_128");
        return client.getAcsResponse(request);
    }
}

结语:

  官方文档是程序员最好的书籍,养成看官方文档的好习惯

  

posted on 2021-08-23 14:34  楼下的狗  阅读(406)  评论(0)    收藏  举报