试看指让用户在观看视频或者音频等内容时,只能观看或收听指定时长的内容,通常用于付费课程、付费短剧等付费业务场景。本文介绍如何开启视频点播的试看功能并获取试看地址。
工作原理
阿里云视频点播提供完整的试看解决方案。您可以通过视频点播播放服务(调用服务端GetPlayInfo - 获取音视频播放地址接口)设置试看时长后获取试看地址或者自行拼接含有试看信息的试看地址(URL鉴权地址)。
重要 如果设置的试看时长超过原视频总时长,用户可凭借点播返回的试看地址播放完整视频。
阿里云视频点播试看功能基于阿里云CDN加速实现。试看的基本原理是:播放端携带含有指定试看时长信息的试看地址(CDN加速地址)访问服务,云端对试看地址鉴权。鉴权通过则返回指定的文件内容,否则拒绝访问并返回403。下图展示了点播试看的实现流程:
点播用户配置CDN加速域名并开启试看功能。
重要 域名配置和开启试看功能是使用试看功能的前提。详细操作请参见开启试看功能。
点播用户的播放端向视频点播发起试看请求。
视频点播根据域名配置及试看请求中的试看时长配置生成试看地址。
点播用户的播放端通过播放地址向CDN请求播放视频(试看)。
使用限制
目前试看功能支持的文件格式为MP4、HLS。其中,MP4视频的Meta信息必须在文件头部,不支持Meta信息在尾部的MP4视频。通过视频点播服务转码封装格式为MP4的时候,会将Meta信息放置在文件头部。
试看时间与关键帧存在依赖(点播转码输出文件默认10秒一个关键帧),因此短视频不建议使用试看,长视频试看时间建议至少设置为30秒。
HLS文件试看精度为ts分段时长,具体可能存在误差,试看时长采用最大化原则。以10秒一个ts为标准,如果试看时长设置为15秒,实际返回数据为20秒。
开启试看功能
无论您调用点播接口获取试看地址还是手动拼接试看地址,都必须提前配置域名并开启试看功能。详细配置及操作指引如下:
配置CDN加速域名。操作指引请参见添加加速域名。
重要 只有配置CDN加速域名的域名才支持试看功能。
为域名开启URL鉴权,开启过程中打开试看功能。操作指引请参见URL鉴权。
重要 如果域名没有开启试看,请求点播时不能携带试看参数,返回的地址不能访问。因此,在开启URL鉴权功能时必须同时打开支持试看按钮。
开启试看功能控制台界面截图参考如下:
说明 如需手动拼接试看链接,需要传入privateKey参数用于计算鉴权值。其取值为控制台操作时生成或输入的主Key或备Key值。请根据需求记录上述值为后续使用做准备。
为域名开启Range回源和拖拽播放。操作指引请参见配置Range回源及拖拽播放。
调用接口获取试看地址
视频点播提供获取视频播放地址的接口。接口详情请参见GetPlayInfo - 获取音视频播放地址。用户可集成服务端SDK,通过SDK调用该接口获取试看地址。具体步骤如下:
重要 调用接口前请确保已开启试看功能。操作指引请参见开启试看功能。
根据业务需求集成服务端SDK。集成步骤请参考视频点播SDK快速入门。
通过SDK调用GetPlayInfo - 获取音视频播放地址接口。调用接口时设置请求参数PlayConfig中的PreviewTime指定试看时长。服务端会根据试看时长设置返回试看地址。PlayConfig参数描述请参见PlayConfig。
展开查看获取试看地址示例代码(Java)
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;
/**
* @date 2021/12/30
*/
public class VodPreviewTest {
public static void main(String[] args) throws ClientException {
//请根据点播服务接入区域填写,更多信息,请参见点播地域标识。
String regionId = "cn-shanghai";
// 阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维。
// 强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。
// 本示例通过从环境变量中读取AccessKey,来实现API访问的身份验证。运行代码示例前,请配置环境变量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
//您的AccessKeyId
String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
//您的AccessKeySecret
String accessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
//视频ID。示例:533606af570e4db4961248d0978b****。通过控制台上传的视频,可登录点播控制台,选择媒资库 > 音/视频查看视频ID。通过CreateUploadVideo接口上传的视频,视频ID为返回参数VideoId的值。
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));
}
/**
* 初始化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);
}
}
手动拼接试看地址
视频点播支持手动拼接带试看信息的URL鉴权地址。操作步骤如下:
重要 拼接试看地址前请确保已开启试看功能。操作指引请参见开启试看功能。
手动拼接加入试看参数的鉴权URL地址。与完整观看时URL鉴权地址拼接不同的是,拼接试看地址在计算md5hash时要带上试看时长参数previewTime
,即在原来URL鉴权md5hash计算方式的基础上,加入试看时长的计算。
完整视频地址md5hash计算 | 试看地址md5hash计算 |
MD5(uri-timestamp-rand-uid-PrivateKey)
| MD5(uri-timestamp-rand-uid-PrivateKey-previewTime)
|
说明 md5hash计算的参数描述及手动拼接鉴权URL的方法请参考配置URL鉴权。如果需要看完整视频,不设置试看参数即可。
在拼接完成的鉴权URL末尾加上&end=
,&end=
后添加试看参数previewTime
,生成完整的试看地址。
展开查看手动拼接Jar包需要的依赖(Java)
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
展开查看手动拼接试看地址示例代码(Java)
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>";//控制台配置的主Key或备Key。如何获取请参见开启试看功能。
String fileUrl = "<Your File URL>";//文件地址,示例:http://example.aliyundoc.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();
}
}