试看指让用户在观看视频或者音频等内容时,只能观看或收听指定时长的内容,通常用于付费课程、付费短剧等付费业务场景。本文介绍如何开启视频点播的试看功能并获取试看地址。
工作原理
阿里云视频点播提供完整的试看解决方案。您可以通过视频点播播放服务(调用服务端GetPlayInfo - 获取音视频播放地址接口)设置试看时长后获取试看地址或者自行拼接含有试看信息的试看地址(URL鉴权地址)。
重要
如果设置的试看时长超过原视频总时长,用户可凭借点播返回的试看地址播放完整视频。
阿里云视频点播试看功能基于阿里云CDN加速实现。试看的基本原理是:播放端携带含有指定试看时长信息的试看地址(CDN加速地址)访问服务,云端对试看地址鉴权。鉴权通过则返回指定的文件内容,否则拒绝访问并返回403。下图展示了点播试看的实现流程:

点播用户配置CDN加速域名并开启试看功能。
重要
域名配置和开启试看功能是使用试看功能的前提。详细操作请参见开启试看功能。
点播用户的播放端向视频点播发起试看请求。
视频点播根据域名配置及试看请求中的试看时长配置生成试看地址。
点播用户的播放端通过播放地址向CDN请求播放视频(试看)。
使用限制
目前试看功能支持的文件格式为MP4、HLS。其中,MP4视频的Meta信息必须在文件头部,不支持Meta信息在尾部的MP4视频。通过视频点播服务转码封装格式为MP4的时候,会将Meta信息放置在文件头部。
试看时间与关键帧存在依赖(点播转码输出文件默认10秒一个关键帧),因此短视频不建议使用试看,长视频试看时间建议至少设置为30秒。
说明
关键帧时长可通过转码模板修改。修改方法请参见转码模板。
HLS文件试看精度为ts分段时长,具体可能存在误差,试看时长采用最大化原则。以10秒一个ts为标准,如果试看时长设置为15秒,实际返回数据为20秒。
开启试看功能
无论您调用点播接口获取试看地址还是手动拼接试看地址,都必须提前配置域名并开启试看功能。详细配置及操作指引如下:
配置CDN加速域名。操作指引请参见添加加速域名。
为域名开启URL鉴权,开启过程中打开试看功能。操作指引请参见URL鉴权。
重要
如果域名没有开启试看,请求点播时不能携带试看参数,返回的地址不能访问。因此,在开启URL鉴权功能时必须同时打开支持试看按钮。
开启试看功能控制台界面截图参考如下:
说明
如需手动拼接试看链接,需要传入privateKey参数用于计算鉴权值。其取值为控制台操作时生成或输入的主Key或备Key值。请根据需求记录上述值为后续使用做准备。

为域名开启Range回源和拖拽播放。操作指引请参见配置Range回源及拖拽播放。
调用接口获取试看地址
视频点播提供获取视频播放地址的接口。接口详情请参见GetPlayInfo - 获取音视频播放地址。用户可集成服务端SDK,通过SDK调用该接口获取试看地址。具体步骤如下:
重要
调用接口前请确保已开启试看功能。操作指引请参见开启试看功能。
根据业务需求集成服务端SDK。集成步骤请参考视频点播SDK快速入门。
通过SDK调用GetPlayInfo - 获取音视频播放地址接口。调用接口时设置请求参数PlayConfig中的PreviewTime指定试看时长。服务端会根据试看时长设置返回试看地址。PlayConfig参数描述请参见PlayConfig。
import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.vod.model.v20170321.GetPlayInfoRequest;
import com.aliyuncs.vod.model.v20170321.GetPlayInfoResponse;
public class VodPreviewTest {
public static void main(String[] args) throws ClientException {
String regionId = "cn-shanghai";
String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
String accessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
String videoId = "<your videoId>";
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));
}
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;
}
public static GetPlayInfoResponse getPlayInfo(DefaultAcsClient client, String videoId) throws Exception {
GetPlayInfoRequest request = new GetPlayInfoRequest();
request.setVideoId(videoId);
request.setAuthTimeout(3600L);
request.setFormats("mp4");
JSONObject playConfig = new JSONObject();
playConfig.put("PreviewTime", "30");
request.setPlayConfig(playConfig.toJSONString());
return client.getAcsResponse(request);
}
}
手动拼接试看地址
视频点播支持手动拼接带试看信息的URL鉴权地址。操作步骤如下:
重要
拼接试看地址前请确保已开启试看功能。操作指引请参见开启试看功能。
手动拼接加入试看参数的鉴权URL地址。与完整观看时URL鉴权地址拼接不同的是,拼接试看地址在计算md5hash时要带上试看时长参数previewTime
,即在原来URL鉴权md5hash计算方式的基础上,加入试看时长的计算。
完整视频地址md5hash计算 | 试看地址md5hash计算 |
完整视频地址md5hash计算 | 试看地址md5hash计算 |
MD5(uri-timestamp-rand-uid-PrivateKey)
| MD5(uri-timestamp-rand-uid-PrivateKey-previewTime)
|
说明
md5hash计算的参数描述及手动拼接鉴权URL的方法请参考配置URL鉴权。如果需要看完整视频,不设置试看参数即可。
在拼接完成的鉴权URL末尾加上&end=
,&end=
后添加试看参数previewTime
,生成完整的试看地址。
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
import java.util.UUID;
import java.net.URL;
import org.apache.commons.lang3.StringUtils;
private String generateRand() {
return UUID.randomUUID().toString().replaceAll("-", "");
}
private String md5(String str) {
try {
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(str.getBytes("UTF-8"));
return bytesToHex(md5.digest());
} catch (Exception e) {
e.printStackTrace();
}
}
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 + "-" + this.md5(md5Str);
return auth_key;
}
public void previewTest() throws Exception {
try {
String key = "<Your PrivateKey>";
String fileUrl = "<Your File URL>";
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();
}
}