简介

阿里云视频点播服务提供了试看的完整解决方案,您可自由设置试看时长(或观看完整视频),播放服务会根据设置提供含有试看限制的特定的播放地址,可借此来实现完整的试看功能。

使用前提

试看的基本原理是,播放的CDN加速地址带有试看的指定时长信息,云端会对该信息进行鉴权,鉴权通过会返回指定的文件内容,否则拒绝访问、返回403。
  • 点播试看功能基于阿里云CDN加速实现,且必须在视频点播(VOD)控制台配置CDN加速域名。
  • 此方案必须开启A鉴权,同时,为了防止试看参数被篡改,试看参数也作为auth_key计算的一部分。
  • 域名必须开启range回源和拖拽播放。具体可在域名管理>配置(对应域名处)>视频相关处开启。

使用步骤

  1. 首先将需要试看的域名开启试看功能,具体可参考配置方式。
    说明 如果域名没有开启试看,则请求点播时不能携带试看参数,否则返回的地址不能访问。
  2. 请求点播的播放服务,在请求时带试看参数,指定所需要试看的时间,具体可参考 试看地址获取。
  3. 点播返回试看地址。
  4. 客户根据此地址访问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();
        }
    }