简介
阿里云视频点播服务提供了试看的完整解决方案,您可自由设置试看时长(或观看完整视频),播放服务会根据设置提供含有试看限制的特定的播放地址,可借此来实现完整的试看功能。
使用前提
试看的基本原理是,播放的 CDN 加速地址带有试看的指定时长信息,云端会对该信息进行鉴权,鉴权通过会返回指定的文件内容,否则拒绝访问、返回 403。
- 点播试看功能基于阿里云 CDN 加速实现,且必须在视频点播 (VOD) 控制台配置 CDN 加速域名。
- 此方案必须开启 A 鉴权,同时,为了防止试看参数被篡改,试看参数也作为 auth_key 计算的一部分。
- 域名必须开启 range 回源和拖拽播放。具体可在域名管理 > 配置 (对应域名处)> 视频相关处开启。
使用步骤
-
首先将需要试看的域名开启试看功能,具体可参见配置方式。
说明 如果域名没有开启试看,则请求点播时不能携带试看参数,否则返回的地址不能访问。
- 请求点播的播放服务,在请求时带试看参数,指定所需要试看的时间,具体可参见试看地址获取。
- 点播返回试看地址。
- 客户根据此地址访问 CDN,此地址只返回试看所需要的时长数据。
流程示例

配置方式
登录点播控制台,【媒体处理配置】>【分发加速配置】>【域名管理】>【选择域名 - 配置】>【访问控制】>【URL 鉴权】,开启 A 方式鉴权,同时打开支持试看开关。
试看地址获取
通过点播获取
说明
- 只有配置 CDN 加速域名的情况,才支持试看功能。
- 如果域名没有开启试看,则请求点播时不能携带试看参数,否则返回的地址不能访问。
- 目前支持的文件格式为 mp4、m3u8。
- 由于试看时间与关键帧存在依赖 (点播转码输出文件默认 10 秒一个关键帧,可在转码模板修改),因此短视频不建议使用试看,长视频试看时间建议至少设置为 30 秒。
- m3u8 文件试看精度为 ts 分段时长,具体可能存在误差,采用最大化原则,即 10 秒一个 ts,试看 15 秒,实际返回数据为 20 秒。
调用时,您可以设置
PlayConfig结构中的 PreviewTime 来获取指定时长的播放试看地址。
示例代码如下:
package com.ali.vod.test;
import com.alibaba.fastjson.JSONObject;
import com.aliyun.oss.ClientException;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.vod.model.v20170321.GetPlayInfoRequest;
import com.aliyuncs.vod.model.v20170321.GetPlayInfoResponse;
/**
* @author wb-zzb
* @date 2020/6/3
*/
public class VodPreviewTest {
public static void main(String[] args) {
//请根据点播服务接入区域填写,详情参见点播服务接入区域(https://help.aliyun.com/document_detail/98194.html?spm=a2c4g.11186623.6.612.51c6534bqLs9Wd)
String regionId = "cn-shanghai";
String accessKeyId = "<your accessKeyId>";
String accessKeySecret = "<your accessKeySecret>";
String videoId = "595d020bad3*****f37433451720";
DefaultAcsClient client = InitVodClient(regionId, accessKeyId, accessKeySecret);
GetPlayInfoResponse response = null;
try {
response = getPlayInfo(client, videoId);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("response = " + JSONObject.toJSONString(response));
}
/**
* 初始化Client
*
* @param regionId
* @param accessKeyId
* @param accessKeySecret
* @return
* @throws ClientException
*/
public static DefaultAcsClient InitVodClient(String regionId, String accessKeyId, String accessKeySecret) throws ClientException {
DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
DefaultAcsClient client = new DefaultAcsClient(profile);
return client;
}
/**
* 获取视频播放地址
*
* @param client
* @param videoId
* @return
* @throws Exception
*/
public static GetPlayInfoResponse getPlayInfo(DefaultAcsClient client, String videoId) throws Exception {
GetPlayInfoRequest request = new GetPlayInfoRequest();
request.setVideoId(videoId);
//设置过期时间,单位秒,不设置,默认3600s
request.setAuthTimeout(3600L);
request.setFormats("mp4");
JSONObject playConfig = new JSONObject();
//视频点播试看时长,单位为秒。最小值1
playConfig.put("PreviewTime", "30");
request.setPlayConfig(playConfig.toJSONString());
return client.getAcsResponse(request);
}
}
自行计算
- 在生成 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-19bd8528c1d51576cd726cf86471ca0****.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();
}
}
「视频云技术」你最值得关注的音视频技术公众号,每周推送来自阿里云一线的实践技术文章,在这里与音视频领域一流工程师交流切磋。