场景:
阿里云视频点播在控制台上传加密转码视频时,控制台使用模板上传视频只支持私有加密和不加密两种方式,如果需要对视频进行标准加密,需要使用阿里云的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); } }
结语:
官方文档是程序员最好的书籍,养成看官方文档的好习惯
浙公网安备 33010602011771号