简介
阿里云视频点播服务提供了试看的完整解决方案,您可*设置试看时长(或观看完整视频),播放服务会根据设置提供含有试看限制的特定的播放地址,可借此来实现完整的试看功能。
使用前提
试看的基本原理是,播放的 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(); } }
「视频云技术」你最值得关注的音视频技术公众号,每周推送来自阿里云一线的实践技术文章,在这里与音视频领域一流工程师交流切磋。