阿里云视频点播提供完整的试看解决方案。本文介绍如何开启试看功能并提供获取试看地址的最佳实践。

功能简介

试看指用户在观看视频或者音频等内容时,只能观看指定时间的内容,通常用于付费业务场景。阿里云视频点播提供完整的试看解决方案。您可以通过视频点播播放服务(调用服务端获取视频播放地址接口)设置试看时长后获取试看地址或者自行拼接含有试看信息的试看地址(URL鉴权地址)。

注意 如果设置的试看时长超过原视频总时长,用户可凭借点播返回的试看地址播放完整视频。

阿里云视频点播试看功能基于阿里云CDN加速实现。试看的基本原理是:播放端携带含有指定试看时长信息的试看地址(CDN加速地址)访问服务,云端对试看地址鉴权。鉴权通过则返回指定的文件内容,否则拒绝访问并返回403。下图展示了点播试看的实现流程:

流程提示
  1. 点播用户配置CDN加速域名并开启试看功能。
    注意 域名配置和开启试看功能是使用试看功能的前提。详细操作请参见开启试看功能
  2. 点播用户的播放端向视频点播发起试看请求。
  3. 视频点播根据域名配置及试看请求中的试看时长配置生成试看地址。
    说明 点播支持调用服务端接口生成试看地址,也支持用户自行拼接试看地址。详情请参见调用接口获取试看地址手动拼接试看地址
  4. 点播用户的播放端通过播放地址向CDN请求播放视频(试看)。

使用限制

  • 目前试看功能支持的文件格式为MP4、M3U8。
  • 试看时间与关键帧存在依赖(点播转码输出文件默认10秒一个关键帧),因此短视频不建议使用试看,长视频试看时间建议至少设置为30秒。
    说明 关键帧时长可通过转码模板修改。修改方法请参见普通转码模板设置
  • M3U8文件试看精度为ts分段时长,具体可能存在误差,试看时长采用最大化原则。以10秒一个ts为标准,如果试看时长设置为15秒,实际返回数据为20秒。

开启试看功能

无论您调用点播接口获取试看地址还是手动拼接试看地址,都必须提前配置域名并开启试看功能。详细配置及操作指引如下:

  1. 配置CDN加速域名。操作指引请参见添加加速域名
    注意 只有配置CDN加速域名的域名才支持试看功能。
  2. 为域名开启URL鉴权,同时打开试看功能。操作指引请参见URL鉴权
    注意 如果域名没有开启试看,则请求点播时不能携带试看参数,否则返回的地址不能访问。因此,在开启URL鉴权功能时必须同时打开支持试看按钮。

    开启试看功能控制台界面截图参考如下:

    开启试看功能
  3. 为域名开启Range回源和拖拽播放。操作指引请参见配置Range回源拖拽播放

调用接口获取试看地址

视频点播提供获取视频播放地址的接口。接口详情请参见获取视频播放地址。用户可集成服务端SDK,通过SDK调用该接口获取试看地址。具体步骤如下:

注意 调用接口前请确保已开启试看功能。操作指引请参见开启试看功能
  1. 根据业务需求集成服务端SDK。集成步骤请参考服务端SDK文档
  2. 通过SDK调用获取视频播放地址接口。调用接口时设置请求参数PlayConfig中的PreviewTime指定试看时长。服务端会根据试看时长设置返回试看地址。PlayConfig参数描述请参见PlayConfig

获取试看地址示例代码(Java)

说明
  • 更多语言示例代码请参见OpenAPI
  • 调用服务端接口需要使用AccessKey完成身份验证,请提前获取AccessKey。获取方法请参见获取AccessKey

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;

/**
 * @date 2021/12/30
 */
public class VodPreviewTest {
    public static void main(String[] args) {
        //请根据点播服务接入区域填写,更多信息,请参见点播中心和访问域名。
        String regionId = "cn-shanghai";
        //提前获取的账号AccessKey。
        String accessKeyId = "<your accessKeyId>";
        //提前获取的账号AccessKey Secret。
        String accessKeySecret = "<your accessKeySecret>";
        //视频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鉴权地址。操作步骤如下:

注意 拼接试看地址前请确保已开启试看功能。操作指引请参见开启试看功能
  1. 手动拼接加入试看参数的鉴权URL地址。与完整观看时URL鉴权地址拼接不同的是,拼接试看地址在计算md5hash时要带上试看时长参数previewTime,即在原来URL鉴权md5hash计算方式的基础上,加入试看时长的计算。
    完整视频地址md5hash计算 试看地址md5hash计算
    MD5(uri-timestamp-rand-uid-PrivateKey) MD5(uri-timestamp-rand-uid-PrivateKey-previewTime)
    说明 md5hash计算的参数描述及手动拼接鉴权URL的方法请参考URL鉴权。如果需要看完整视频,不设置试看参数即可。
  2. 在拼接完成的鉴权URL末尾加上&end=&end=后添加试看参数previewTime,生成完整的试看地址。
手动拼接试看地址示例代码(Java)
    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 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();
        }
    }