CRMEB知识付费二次开发 加密阿里云视频MP4点播链接为m3u8格式 hls blob协议

news2024/12/25 14:16:02

只有添加分发加速的域名才能使用HLS加密,同时也要做HTTPS证书添加,不然也会报错。
1、这是电脑端视频播放页面效果
在这里插入图片描述
2、这个手机端H5视频播放页面效果
在这里插入图片描述
3、在网站后台上传你的视频内容

4、上传完之后可以进行预览
在这里插入图片描述5、在阿里云控制台设置就好自己的转码模板
将不转码设为默认的原因是自动触发转码不支持HLS标准加密,所以需要先上传不转码,然后根据回调再去调用转码接口,实现手动转码
在这里插入图片描述
6、设置上传完成回调 - 用于手动转码
在这里插入图片描述
7、创建回调接口
可以用frp搭一个,然后就是正常的restful接口
回调是POST请求,然后请求体我是用 @RequestBody String body接收的,不知道为什么,用对象接收就是不行
请求转码需要用到KMS加密,因此需要准备文档中准备工作的第三步搭建密钥管理服务生成AES_128密钥

// 示例代码
技术开发QQ 735660248
// getClient()是我封装的获取client对象的方法
IAcsClient client = getClient();
CommonRequest request = new CommonRequest();
request.setSysMethod(MethodType.POST);
request.setSysVersion("2016-01-20");
// 一定要和自己的服务地区相匹配
request.setSysDomain("kms.cn-shenzhen.aliyuncs.com");
request.setSysAction("GenerateDataKey");
// kms服务仅支持HTTPS
request.setSysProtocol(ProtocolType.HTTPS);
// 提交工单后,工作人员会帮你生成,前往KMS控制台就能看到
request.putQueryParameter("KeyId", "KMS控制台中的id");
request.putQueryParameter("KeySpec", "AES_128");
CommonResponse response = client.getCommonResponse(request);
// 封装了一个对象来存储aes_128
aes128 = JSON.parseObject(response.getData(), AliyunGenAes128Vo.class);
log.info("生成AES_128 {}", aes128);

8、请求转码

/**
 * 提交转码请求
 */
public static void submitTranscodeJobs(String videoId) throws ClientException {
    IAcsClient client = getClient();
    CommonRequest request = new CommonRequest();
    request.setSysMethod(MethodType.POST);
    request.setSysDomain("vod.cn-shenzhen.aliyuncs.com");
    request.setSysVersion("2017-03-21");
    request.setSysAction("SubmitTranscodeJobs");
    // 转码模板
    request.putQueryParameter("TemplateGroupId", "转码模板id");
    request.putQueryParameter("VideoId", videoId);
    request.putQueryParameter("EncryptConfig", genEncryptConfigStr());
    CommonResponse response = client.getCommonResponse(request);
    log.info("发送转码请求成功 {}", response.getData());
}

/**
 * 获取加密配置字符串
 */
private static String genEncryptConfigStr() throws ClientException {
	// 上面生成的aes128对象
    AliyunGenAes128Vo aes128 = genAes128();
    AliyunEncryptConfig encryptConfig = new AliyunEncryptConfig();
    encryptConfig.setCipherText(aes128.getCiphertextBlob());
    encryptConfig.setKeyServiceType("KMS");
    // 自己的服务,等会创建接口
    encryptConfig.setDecryptKeyUri("http://test.abc.com/play?Ciphertext=" + aes128.getCiphertextBlob());
    String jsonString = JSON.toJSONString(encryptConfig);
    log.info("加密信息 {}", jsonString);
    return jsonString;
}

这样文件上传完成后就会转码生成加密文件了

9、开通加密播放
在这里插入图片描述
10、获取视频信息或凭证

/**
     * 获取视频信息 - 播放地址等
     * @param videoId 阿里云视频id
     */
    public static AliyunPlayInfo getPlayInfo(String videoId) throws Exception {
        IAcsClient client = getClient();
        CommonRequest request = new CommonRequest();
        request.setSysMethod(MethodType.POST);
        request.setSysDomain("vod.cn-shenzhen.aliyuncs.com");
        request.setSysVersion("2017-03-21");
        request.setSysAction("GetPlayInfo");
        request.putQueryParameter("VideoId", videoId);
        CommonResponse response = client.getCommonResponse(request);
        AliyunPlayInfo playInfo = JSON.parseObject(response.getData(), AliyunPlayInfo.class);
        JSONObject jsonObject = JSONObject.parseObject(playInfo.getInfoStr());
        String listJson = jsonObject.getString("PlayInfo");
        playInfo.setPlayInfoList(JSON.parseArray(listJson, AliyunPlayInfo.PlayInfo.class));
        return playInfo;
    }

11、获取上传凭证 - 用于上传视频

// AliStsResVo 自己封装的对象
public ReturnResult<AliUploadAuthResVo> uploadAuth(@RequestBody AliStsResVo vo) {
        // 点播服务所在的Region,接入服务中心为上海,则填cn-shanghai
        String regionId = "cn-shenzhen";
        IClientProfile profile = DefaultProfile.getProfile(regionId, vo.getKeyId(), vo.getKeySecret(), vo.getToken());
        DefaultAcsClient client = new DefaultAcsClient(profile);

        CommonRequest request = new CommonRequest();
        request.setSysMethod(MethodType.POST);
        request.setSysDomain("vod.cn-shenzhen.aliyuncs.com");
        request.setSysVersion("2017-03-21");
        request.setSysAction("CreateUploadVideo");
        request.putQueryParameter("Title", vo.getFileName());
        request.putQueryParameter("FileName", vo.getFilePath());
        try {
            CommonResponse response = client.getCommonResponse(request);
            AliUploadAuthResVo uploadAuthResVo = JSON.parseObject(response.getData(), AliUploadAuthResVo.class);
            return ReturnResult.success(uploadAuthResVo);
        } catch (ClientException e) {
            e.printStackTrace();
            return ReturnResult.error();
        }
    }

12、上传凭证有效期为3000秒, 刷新凭证

public ReturnResult<AliUploadAuthResVo> refreshUploadAuth(@RequestBody AliStsResVo vo) {
        DefaultProfile profile = DefaultProfile.getProfile("cn-shenzhen", vo.getKeyId(), vo.getKeySecret(), vo.getToken());
        IAcsClient client = new DefaultAcsClient(profile);
        CommonRequest request = new CommonRequest();
        request.setSysMethod(MethodType.POST);
        request.setSysDomain("vod.cn-shenzhen.aliyuncs.com");
        request.setSysVersion("2017-03-21");
        request.setSysAction("RefreshUploadVideo");
        request.putQueryParameter("VideoId", vo.getVideoId());

        try {
            CommonResponse response = client.getCommonResponse(request);
            AliUploadAuthResVo uploadAuthResVo = JSON.parseObject(response.getData(), AliUploadAuthResVo.class);
            return ReturnResult.success(uploadAuthResVo);
        } catch (Exception e) {
            e.printStackTrace();
            return ReturnResult.error();
        }
    }

13、CRMEB阿里云视频加密
设置上传完成回调 - 用于手动转码
在这里插入图片描述

14、这样文件上传完成后就会转码生成加密文件了
开通加密播放
在这里插入图片描述

15、获取视频凭证

/**
     *
     * @param videoId 阿里云视频id
     * @param timeout 凭证有效期 100-3000 秒
     */
    public static AliyunPlayAuth getPlayAuth(String videoId, String timeout) throws Exception {
        IAcsClient client = getClient();
        CommonRequest request = new CommonRequest();
        request.setSysMethod(MethodType.POST);
        request.setSysDomain("vod.cn-shenzhen.aliyuncs.com");
        request.setSysVersion("2017-03-21");
        request.setSysAction("GetVideoPlayAuth");
        request.putQueryParameter("VideoId", videoId);
        request.putQueryParameter("AuthInfoTimeout", timeout);
        CommonResponse response = client.getCommonResponse(request);
        return JSON.parseObject(response.getData(), AliyunPlayAuth.class);
    }

16、用到的两个对象

@Data
@ApiModel("视频详细信息")
public class AliyunPlayInfo {
    @JSONField(name = "VideoBase")
    private VideoBase videoBase;
    @JSONField(name = "PlayInfoList")
    private String infoStr;
    private List<PlayInfo> playInfoList;


    @Data
    public static class VideoBase {
        @ApiModelProperty("阿里云视频id")
        @JSONField(name = "VideoId")
        private String videoId;
        @ApiModelProperty("封面地址")
        @JSONField(name = "CoverURL")
        private String coverURL;
        @ApiModelProperty("阿里云视频名")
        @JSONField(name = "Title")
        private String title;
        @ApiModelProperty("视频时长 秒")
        @JSONField(name = "Duration")
        private String duration;
    }
    @Data
    public static class PlayInfo {
        @ApiModelProperty("视频字节")
        @JSONField(name = "Size")
        private Long size;
        @ApiModelProperty("播放地址")
        @JSONField(name = "PlayURL")
        private String playURL;
        @ApiModelProperty("帧率")
        @JSONField(name = "Fps")
        private String fps;
        @ApiModelProperty("高")
        @JSONField(name = "Height")
        private String height;
        @ApiModelProperty("宽")
        @JSONField(name = "Width")
        private String width;
        @ApiModelProperty("FD:流畅。\n" +
                "LD:标清。\n" +
                "SD:高清。\n" +
                "HD:超清\n" +
                "OD:原画。\n" +
                "2K:2K。\n" +
                "4K:4K。\n" +
                "SQ:普通音质。\n" +
                "HQ:高音质。\n" +
                "AUTO:自适应码率。")
        @JSONField(name = "Definition")
        private String definition;
    }
}

@Data
@ApiModel("视频播放凭证")
public class AliyunPlayAuth {
    @JSONField(name = "PlayAuth")
    @ApiModelProperty("凭证")
    private String playAuth;
    @JSONField(name = "VideoMeta")
    @ApiModelProperty("视频信息")
    private AliyunPlayInfo.VideoBase videoMeta;
}

17、此时获取的视频是加密的
可以测试一下
前往阿里在线诊断地址
选择视频播放
将上面获取的视频的地址放到Source中,点击播放。F12查看网络请求, 发现它一直往第四步请求转码中genEncryptConfigStr()方法中设置的setDecryptKeyUri发送请求,所以需要搭建一个解密的接口

解密

@GetMapping("play")
    public void play(@RequestParam String Ciphertext, HttpServletResponse response) throws IOException {
        //从KMS中解密出来,并Base64 decode
        byte[] key = decrypt(Ciphertext);
        //设置header
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setStatus(200);
        response.setContentLength(key.length);
        //返回base64decode之后的密钥
        response.getOutputStream().write(key);
    }
    private byte[] decrypt(String ciphertext) {
        DecryptRequest request = new DecryptRequest();
        request.setCiphertextBlob(ciphertext);
        request.setSysProtocol(ProtocolType.HTTPS);
        try {
            DecryptResponse response = AliyunVideoUtils.getClient().getAcsResponse(request);
            String plaintext = response.getPlaintext();
            //注意:需要base64 decode
            return Base64.decodeBase64(plaintext);
        } catch (ClientException e) {
            e.printStackTrace();
            return null;
        }
    }

18、这样再次点击播放就能成功播放了
不过这里面我并没有进行安全认证,所以后续需要安全认证需要自己手动添加
设置URL鉴权
在这里插入图片描述
19、开启URL鉴权后,在生成视频地址后面就会增加一个auth_key
但是此时在点击视频播放就会出现跨域问题,因此需要在HTTP头这里设置
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/508938.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

舞台特效-第14届蓝桥杯省赛Scratch初级组真题第2题

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第131讲。 舞台特效&#xff0c;本题是2023年5月7日举行的第14届蓝桥杯省赛Scratch图形化编程初级组真题第2题&#xf…

SRVCC流程及异常场景介绍

SRVCC(Single Radio Voice Call Continuity)用于在LTE和3G网络之间,实现VoLTE电话无缝切换到3G网络。用户正在使用VoLTE电话进行通话,当他们移出了LTE网络覆盖范围,SRVCC技术会自动将电话切换到3G网络,从而保持通话不中断。 关键流程如下 UE(用户设备)向MME(移动管理…

Python 密码破解指南:5~9

协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【OpenDocCN 饱和式翻译计划】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 收割 SB 的人会被 SB 们封神&#xff0c;试图唤醒 SB 的人是 SB 眼中的 SB。——SB 第三定律 五、凯…

RHCSA之基础配置

目录 RHCSA之基础配置 快照设置 1.快照的作用 2.创建快照 3.删除快照 界面图标 Boxes --- 命令行字符形状工具 Calculator --- 计算器 Cheese --- 摄像头 Files --- 文件 FireFox --- 火狐浏览器 Red Hat Subscription Manager --- red hat订阅经理 Settings --- 设…

车载铁路M12工业交换机 3U 轨道交通板卡交换机设计方案

支持双电源冗余 支持Bypass 专门为轨道交通应用设计和制造的以太网数据通信设备 根据IEC61375-2-5和IEC61375-2-3协议实现的列车级骨干以太网核心设备 中国铁路 产品认证 XM-5145工业交换机是专为轨道交通、船载、车载等恶劣环境设计开发的二层网管型交换机。产品设计符合轨…

Java学习(11):Java实现图书馆书库管理系统

接上次博客&#xff1a;Java学习&#xff08;10&#xff09;多接口、接口的继承、抽象类和接口的区别、Object类【toString 、equals、hashcode】、接口实例 【compareTo、clone 】、浅拷贝和深拷贝、内部类_di-Dora的博客-CSDN博客 我们要想完成这个书库管理系统&#xff0c;…

MySQL基础(十七)触发器

在实际开发中&#xff0c;我们经常会遇到这样的情况&#xff1a;有 2 个或者多个相互关联的表&#xff0c;如商品信息和库存信息分别存放在 2 个不同的数据表中&#xff0c;我们在添加一条新商品记录的时候&#xff0c;为了保证数据的完整性&#xff0c;必须同时在库存表中添加…

VMware ESXi 7.0 U3m Unlocker OEM BIOS 集成网卡驱动和 NVMe 驱动 (集成驱动版)

ESXi 7 U3 标准版集成 Intel 网卡、USB 网卡 和 NVMe 驱动 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-esxi-7-u3-sysin/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 2023-05-03&#xff0c;发布 ESXi 7.0U…

8-1HBase的安装与简单操作

目录 第1关&#xff1a;Hbase数据库的安装 代码如下&#xff1a; 第二关&#xff1a;创建表 首先要启动&#xff1a;hbase shell 1、create “表名” , ”列族名” 新建一个表 2、list 列出hbase中存在的所有表 代码测试&#xff1a; 第三关&#xff1a;添加数据、…

加解密技术了解

常用的对称加密算法&#xff1a; 对称算法&#xff0c;指加密和解密使用相同密钥的加密算法&#xff0c;对称加密算法用来对敏感数据等信息进行加密。 1). DES算法 2). 3DES算法 3). AES算法 4). TDEA算法 5). Blowfish算法 6). RC5算法 7). IDEA算法 三种常用对称算法…

Speech and Language Processing之word2vec

1、介绍 事实证明&#xff0c;在每一个NLP任务中&#xff0c;密集向量都比稀疏向量工作得更好。虽然我们不能完全理解其中的所有原因&#xff0c;但我们有一些直觉。首先&#xff0c;密集向量可以更成功地作为特征包含在机器学习系统中;例如&#xff0c;如果我们使用100维…

Shell脚本之正则表达式详解(花每年都开,你还是那个你吗)

文章目录 一、什么叫做正则表达式二、正则表达式的组成三、正则表达式分类四、正则表达式字符用法五、正则表达式练习1.匹配/etc/fstab中不是以#开头的行2.匹配/etc/passwd中以bash结尾的行3.匹配文件中025开头&#xff0c;后一个字符为"-"、" " 或没有&am…

Linux进程信号(下)

目录 1&#xff1a;信号保存概念 2&#xff1a;sigset_t 3&#xff1a;信号集操作函数 3.1&#xff1a;sigprocmask 3.2&#xff1a;9号进程不能被阻塞&#xff08;验证&#xff09; 3.3&#xff1a;sigpending 4&#xff1a;信号处理 5&#xff1a;sigaction 6&#x…

C++知识点 -- C++的IO流

C知识点 – C的IO流 文章目录 C知识点 -- C的IO流一、C标准IO流1.多个输入数据2.多行数据读入 二、C文件IO流1.ifstream读文件2.文件读写类 三、stringstream 一、C标准IO流 C系统实现了一个庞大的类库&#xff0c;其中以ios为基类&#xff0c;其他类都是直接或间接派生自ios类…

springboot 阿里云oss图片上传和异常处理

自己去申请开通阿里云oss。 对象存储 OSS_云存储服务_企业数据管理_存储-阿里云 1.在pom.xml添加依赖 <dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.14.0</version></dep…

港科夜闻|香港科大与香港资管通有限公司签署校企合作备忘录,成立校企合作基金促科研成果落地...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科大与香港资管通有限公司签署校企合作备忘录&#xff0c;成立校企合作基金促科研成果落地。“港科资管通领航基金”28日在香港成立&#xff0c;将致力于推动高校科研成果转化&#xff0c;助力香港国际创科中心建设。…

Fabric.js 拖拽顶点修改多边形形状

theme: smartblue 我正在参加「掘金启航计划」 本文简介 戴尬猴&#xff0c;我是德育处主任 这次要介绍的一个demo是"拖拽多边形定点修改多边形形状"。 其实 Fabric.js 官网也有这个demo&#xff1a;Fabric.js demos Custom controls, polygon 。但这个demo可能对于…

ASEMI代理ADV7611BSWZ原装ADI车规级ADV7611BSWZ

编辑&#xff1a;ll ASEMI代理ADV7611BSWZ原装ADI车规级ADV7611BSWZ 型号&#xff1a;ADV7611BSWZ 品牌&#xff1a;ADI/亚德诺 封装&#xff1a;LQFP-64 批号&#xff1a;2023 引脚数量&#xff1a;64 工作温度&#xff1a;-40C~85C 安装类型&#xff1a;表面贴装型 …

怎么轻松地搞定Win11系统备份任务?

“我是一个电脑小白&#xff0c;不是很懂电脑的一些操作。我刚买了一台新电脑&#xff0c;它装的是Win11系统&#xff0c;我害怕它出现什么问题&#xff0c;听朋友说可以通过备份的方法保护系统&#xff0c;这是真的吗&#xff1f;有谁知道该怎么进行Win11系统备份吗&#xff1…

OJ练习第101题——柱状图中最大的矩形

柱状图中最大的矩形 力扣链接&#xff1a;84. 柱状图中最大的矩形 题目描述 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 示例 思路 我们先嵌…