简介
试看指用户在观看视频或者音频等内容时,只能观看指定时间(如前五分钟)的内容,通常用于会员等付费业务场景。
阿里云视频点播服务提供了试看的完整解决方案,您可自由设置试看时长(或观看完整视频),播放服务会根据设置提供含有试看限制的特定的播放地址,可借此来实现完整的试看功能。
使用前提
试看的基本原理是,播放的CDN加速地址带有试看的指定时长信息,云端会对该信息进行鉴权,鉴权通过会返回指定的文件内容,否则拒绝访问、返回403。
- 点播试看功能基于阿里云CDN加速实现,且必须在视频点播(VOD)控制台配置CDN加速域名。
- 此方案必须开启A鉴权,同时,为了防止试看参数被篡改,试看参数也作为auth_key计算的一部分。
使用步骤
-
首先将需要试看的域名开启试看功能,具体可参考 配置方式
> 需要注意的是,如果域名没有开启试看,则请求点播时不能携带试看参数,否则返回的地址不能访问。
- 请求点播的播放服务,在请求时带试看参数,指定所需要试看的时间,具体可参考 试看地址获取
- 点播返回试看地址
- 客户根据此地址访问CDN,此地址只返回试看所需要的时长数据
流程示例
配置方式
- 登陆点播控制台,域名管理-访问控制-URL鉴权中,开启A方式鉴权,同时,勾选"支持试看"选项即可。
试看地址获取
通过点播获取
注意:
- 只有配置CDN加速域名的情况,才支持试看功能。
- 如果域名没有开启试看,则请求点播时不能携带试看参数,否则返回的地址不能访问。
- 目前支持的文件格式为mp4、flv、m3u8
- 调用 获取播放地址接口 或者获取播放凭证接口时,您可以设置 PlayConfig 结构中的
PreviewTime
来获取指定时长的播放试看地址。
自行计算
- 在生成authkey时如果有试看参数,计算md5hash时要带上试看时长参数,即在原来 URL鉴权 md5hash计算方式的基础上,加入试看时长的计算。试看md5hash的计算方法为 MD5(uri-timestamp-rand-uid-auth_key-preview_time)
- 在最后加上&end={试看时长},如果需要看完整视频,试看参数不设置即可,并且不参与进行auth_key计算
示例代码如下
private String generateRand() {
return UUID.randomUUID().toString().replaceAll("-", "");
}
public String genAuthKey(String object, String privateKey, Long expireTime, Long previewTime) {
String rand = "0";
String uid = "0";
if (StringUtils.isBlank(privateKey)) {
return "";
}
rand = generateRand();
long timestamp = System.currentTimeMillis() / 1000 + (expireTime == null ? 0 : expireTime);
String authStr = timestamp + "-" + rand + "-" + uid;
String md5Str = object + "-" + authStr + "-" + privateKey;
if(previewTime!=0)
md5Str = md5Str + "-" + previewTime;
String auth_key = authStr + "-" + MD5Util.md5( md5Str);
return auth_key;
}
public void previewTest() throws Exception {
try {
String key = "your cdn auth key";
String fileUrl = "http://test.yourdomain.com/test/bee21427ca3346848835c1bd786054c5-19bd8528c1d51576cd726cf86471ca04-fd.mp4";
URL url = new URL(fileUrl);
String file = url.getFile();
Long previewtime = 120L;
Long expireTime = 1800L;
String auth_key =genAuthKey(file, key, expireTime, previewtime);
fileUrl = fileUrl + "?auth_key=" + auth_key;
if(previewtime != 0)
fileUrl = fileUrl + "&end=" + previewtime;
System.out.println(fileUrl);
} catch (Exception e) {
e.printStackTrace();
}
}