如何正确使用SDK加密串

保利威点播SDK需要用户提供 useridreadtokenwritetokensecretkey几个配置信息才能解密播放视频。基于安全性考虑,建议这些参数保存在服务端,APP 在启动时从服务端获取并配置。

为防止 APP 端被嗅探这几个参数,需要对传输的内容进行加密。因此,就有了 SDK加密串——在服务器端对以上四个参数进行加密,APP端对应的进行解密。开发者应当设计自己的加解密方式,并且APP端应通过https协议请求服务端接口。

为方便快速集成和调试SDK的功能,保利威管理后台提供了一种固定加密方式的临时SDK加密串,请勿直接在正式环境使用。

点播SDK集成文档详见:

正式使用解决方案

一、设计自己的加解密方式。

服务端Java示例:

   /*该示例采用AES加密算法,开发者也可以选择使用不同的加密算法,并在APP端做对应的解密。*/
    String plainString = userid + "," + secretkey + "," + readtoken + "," + writetoken;
    String key = "1234567812345678"; // 加密密钥
    String iv = "1234567812345678"; // 加密向量

    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    int blockSize = cipher.getBlockSize();

    byte[] dataBytes = plainString.getBytes();
    int plaintextLength = dataBytes.length;
    if (plaintextLength % blockSize != 0) {
        plaintextLength = plaintextLength + (blockSize - (plaintextLength % blockSize));
    }

    byte[] plaintext = new byte[plaintextLength];
    System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length);

    SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
    IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());

    cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);
    byte[] encrypted = cipher.doFinal(plaintext);
    String baseString = Base64.encode(encrypted);
    System.out.println(baseString);

服务器端 PHP 加密示例:

<?php
   /*该示例采用AES加密算法,开发者也可以选择使用不同的加密算法,并在APP端做对应的解密。*/
    $privateKey = "1234567812345678";// 加密密钥
    $iv = "1234567812345678"; // 加密向量

    $userid = "你的userid";
    $secretkey = "你的secretkey";
    $readtoken = "你的readtoken";
    $writetoken = "你的writetoken";
    $plainstring = $userid.",".$secretkey.",".$readtoken.",".$writetoken;

    $str_padded = $plainstring;
    if (strlen($str_padded) % 16) {
        $str_padded = str_pad($str_padded, strlen($str_padded) + 16 - strlen($str_padded) % 16, "\0");
    }

    $encrypted = openssl_encrypt($str_padded, 'aes-128-cbc', $privateKey, OPENSSL_RAW_DATA, $iv);
    echo(base64_encode($encrypted));
?>

Android 端解密和配置

public class PolyvApplication extends Application {
    @Override
    public void onCreate() {
        new LoadConfigTask().execute();
    }

    private class LoadConfigTask extends AsyncTask<String, String, String> {

    @Override
    protected String doInBackground(String... params) {
        String config = PolyvSDKUtil.getUrl2String("https://demo.polyv.net/demo/appkey.php");
        if (TextUtils.isEmpty(config)) {
        try {
            throw new Exception("没有取到数据");
        } catch (Exception e) {
            e.printStackTrace();
        }
        }

        return config;
    }

    @Override
    protected void onPostExecute(String config) {
        PolyvSDKClient client = PolyvSDKClient.getInstance();
        String iv = "1234567812345678"; // 加密密钥
        String aeskey = "1234567812345678"; // 加密向量
        client.settingsWithConfigString(config, aeskey, iv);
      /*
       *开发者若使用其它加密算法,可自行解密并使用
       *client.settingsWithUserid(String userid, String secretkey, String readtoken, String writetoken)方法进行初始化。
      */

    }
    }
}

iOS 端解密和配置:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"https://demo.polyv.net/demo/appkey.php"]];
    NSString *aesKey = @"1234567812345678"; // 加密密钥
    NSString *aesIv = @"1234567812345678"; // 加密向量
    NSArray *config = [PolyvUtil decryptUserConfig:data key:aesKey iv:aesIv];

    // 初始化SDK
    [[PolyvSettings sharedInstance] initVideoSettings:[config objectAtIndex:1] Readtoken:[config objectAtIndex:2] Writetoken:[config objectAtIndex:3] UserId:[config objectAtIndex:0]];
    [[PolyvSettings sharedInstance] setDownloadDir:[NSHomeDirectory() stringByAppendingPathComponent:@"Documents/plvideo/a"]];
    return YES;
}

二、保证服务端接口稳定

服务器端接口不稳定可能会导致加密串无法成功获取,APP播放视频会出现无法解码播放的错误,建议:

  • 程序上对接口请求增加失败重试机制;
  • 针对加密串和不经常改动的配置,利用CDN加速和缓存,保证高可用性;
  • 增加备用接口,当主接口请求和重试都失败时,调用备用接口。

三、对APP进行加固

对于安全性要求较高的公司,可对 APP 进行加固,防止 APP 被反编译得到源码,从而导致账号及用户隐私数据的泄漏。市面上有很多对 APP进行加固的产品可以使用。

以上内容是否对您有帮助?根本没有帮助文档较差文档一般文档不错文档很好
Loading...

H5播放器介绍(视频)

视频说明

保利威全线产品完美支持HTML5技术, 为用户提供更稳定、流畅、清晰的视频体验。

保利威H5播放器使用便捷,一键观看视频,无需安装升级插件;拥有良好的用户体验,支持倍速播放,多清晰度切换,音视频模式切换,自动适配全终端播放,符合多种观看需求。

针对教学培训类场景,H5播放器推出问答播放功能,视频关键点预览,多语言字幕、互动弹幕、音视频连麦、画笔白板、抽奖等,为您和学员提供最活泼的互动方式。

H5播放器多项功能可自定义!视频片头片尾,企业 Logo水印,右键品牌信息展示,暂停广告添加,界面UI风格定制等,打造专属您企业品牌形象的播放器。

除此之外,H5播放器搭载PlaySafe视频版权保护体系,会对视频逐帧加密,防盗链、防录屏、防篡改,杜绝盗版对付费视频版权造成的损失,为您的视频保驾护航!

保利威H5播放器,视频播放极致体验!

以上内容是否对您有帮助?根本没有帮助文档较差文档一般文档不错文档很好
Loading...

删除视频关联的课件

接口URL

https://api.polyv.net/v2/video/${userid}/deletePPT

接口说明

接口用于删除视频关联课件

返回结果支持格式

JSON

请求方式

POST

请求参数

参数名 必选 类型及范围 说明
userid true string 用户id,路径参数
ptime true string 当前13位毫秒级时间戳,3分钟内有效
sign true string 签名,40位大写的sha1值
vid true string 视频vid

返回结果

{
    "code": 200, 
    "status": "success", 
    "message": "success"
}

失败返回json(不带jsonp)

{
  "code": 400,
  "status": "error",
  "message": "ptime is too old.",
  "data": ""
}

响应说明

错误代码 message 说明
400 sign can not be empty. 加密串为空
400 ptime is too old. 时间戳过期
400 ptime is illegal. 时间戳参数格式不对或者超过当前时间3分钟
400 Could not find user by userid. userid不存在
400 the sign is not right. 加密串不正确
400 该视频尚未关联课件 该视频尚未关联课件

PHP请求示例

<?php
header("Content-type: text/html; charset=utf-8");
$userid="用户id";
$secretkey="用户secretkey";
$params = array(
    'ptime' => time()*1000,
    'vid' => 'b0f704132491a4ba75c4eead81a8aca9_b'
);

# 创建排序后的字典
foreach ($params as $key=>$value){
    $arr[$key] = $key;
}
sort($arr);
$str='';
$length=count($arr);
foreach ($arr as $k => $v) {
    $str = $str.$v.'='.$params[$v];
    if($k < $length-1) {
      $str = $str.'&';
    }
}
$hash=strtoupper(sha1($str.$secretkey));

$params['sign']=$hash;
$url="http://api.polyv.net/v2/video/${userid}/deletePPT?".http_build_query($params);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
curl_close($ch);
//打印获得的数据
print_r($output);
?>

签名规则:

将非空的请求参数按照参数名字典顺序排列,连接参数名与参数值,并在尾部加上secretkey,生成40位大写SHA1值,作为sign。 以下是示例过程:

1、请求参数为

ptime = "1492591990000"
vid = "382839019131be68715e9455f8d0971a_3"
format = "json"

2、将请求参数按照参数名字典顺序排列

format = "json"
ptime = "1492591990000"
vid = "382839019131be68715e9455f8d0971a_3"

3、连接字符串
连接参数名与参数值,并在尾部加上secretkey(secretkey的值为tIQp4ATe9Z),如下:

format=json&ptime=1492591990000&vid=382839019131be68715e9455f8d0971a_3tIQp4ATe9Z

4、生成签名sign

50BF9B165630A8047EB1D17D95A469CC51FF754E
以上内容是否对您有帮助?根本没有帮助文档较差文档一般文档不错文档很好
Loading...

查询视频关联的课件

接口URL

https://api.polyv.net/v2/video/${userid}/getPPTPage

接口说明

接口用于获取视频关联课件信息

返回结果支持格式

JSON

请求方式

GET

请求参数

参数名 必选 类型及范围 说明
userid true string 用户id,路径参数
ptime true string 当前13位毫秒级时间戳,3分钟内有效
sign true string 签名,40位大写的sha1值
vid true string 视频vid

返回结果

{
    "code": 200, 
    "status": "success", 
    "message": "success", 
    "data": [
        {
            "pageNo": 1, 
            "pageTitle": "Java锁事", 
            "pageImage": "https://doc-oss.polyv.net/images/2020/04/913dbde44242910b2681a8183a354a71160b03c/913dbde44242910b26851a8183a354a71160b03c_0000.jpeg", 
            "pageThumbnail": "https://doc-oss.polyv.net/images/2020/04/913dbde44242910b2681a8183a354a71160b03c/913dbde44242910b26851a8183a354a71160b03c_0000_s.jpeg", 
            "showTime": 0
        }
    ]
}

失败返回json(不带jsonp)

{
  "code": 400,
  "status": "error",
  "message": "ptime is too old.",
  "data": ""
}

字段描述

字段名称 描述
pageNo 课件页码
pageTitle 页面标题
pageImage 转码后的图片URL
pageThumbnail 缩略图URL
showTime 视频播放到第几秒时显示该页PPT,单位:秒

响应说明

错误代码 message 说明
400 sign can not be empty. 加密串为空
400 ptime is too old. 时间戳过期
400 ptime is illegal. 时间戳参数格式不对或者超过当前时间3分钟
400 Could not find user by userid. userid不存在
400 the sign is not right. 加密串不正确
400 该视频尚未关联课件 该视频尚未关联课件

PHP请求示例

<?php
header("Content-type: text/html; charset=utf-8");
$userid="用户id";
$secretkey="用户secretKey";
$params = array(
    'ptime' => time()*1000,
    'vid' => 'b0f704132491a4ba75c4eead81a8aca9_b'
);

# 创建排序后的字典
foreach ($params as $key=>$value){
    $arr[$key] = $key;
}
sort($arr);
$str='';
$length=count($arr);
foreach ($arr as $k => $v) {
    $str = $str.$v.'='.$params[$v];
    if($k < $length-1) {
      $str = $str.'&';
    }
}
$hash=strtoupper(sha1($str.$secretkey));

$params['sign']=$hash;
$url="http://api.polyv.net/v2/video/${userid}/getPPTPage?".http_build_query($params);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
curl_close($ch);
//打印获得的数据
print_r($output);
?>

签名规则:

将非空的请求参数按照参数名字典顺序排列,连接参数名与参数值,并在尾部加上secretkey,生成40位大写SHA1值,作为sign。 以下是示例过程:

1、请求参数为

ptime = "1492591990000"
vid = "382839019131be68715e9455f8d0971a_3"
format = "json"

2、将请求参数按照参数名字典顺序排列

format = "json"
ptime = "1492591990000"
vid = "382839019131be68715e9455f8d0971a_3"

3、连接字符串
连接参数名与参数值,并在尾部加上secretkey(secretkey的值为tIQp4ATe9Z),如下:

format=json&ptime=1492591990000&vid=382839019131be68715e9455f8d0971a_3tIQp4ATe9Z

4、生成签名sign

50BF9B165630A8047EB1D17D95A469CC51FF754E
以上内容是否对您有帮助?根本没有帮助文档较差文档一般文档不错文档很好
Loading...

上传课件

接口URL

http://api.polyv.net/v2/video/{userid}/uploadPPT/asyn

接口说明

  1. 上传课件,支持ppt、pptx及pdf文件格式。
  2. 接口只返回上传结果,课件转换结果需通过事件回调获取,详见:回调通知说明

返回结果支持格式

JSON

请求方式

POST

请求数限制

TRUE

请求参数

参数名 必选 类型及范围 说明
vid true string 视频ID
sign true string 签名,40位大写的sha1值
ptime true string 当前13位毫秒级时间戳,3分钟内有效
format false string 默认返回json格式,如果format=xml返回xml格式
jsonp false string 例如,正常情况{error:0,data:””},加 jsonp=a后返回a({error:0,data:””})
courseware true file 上传ppt文件

JSON示例

成功数据返回

{
    "code": 200,
    "status": "success",
    "message": "success",
    "data": "ppt上传成功."
}

返回错误json

{
    "code":400,
    "status":"error",
    "message":"sign can not be empty.",
    "data":""
}

上传文件大小不能超过50M

{
    "code":400,
    "status":"error",
    "message":"ppt文件不能超过50M",
    "data":""
}

文件类型错误

{
    "code":400,
    "status":"error",
    "message":"文件类型必须为ppt、pptx或pdf",
    "data":""
}

当视频已关联课件,并且在转码中,则不允许上传。

{
    "code":400,
    "status":"error",
    "message":"当前vid关联的课件正在转码中,请稍后再试。",
    "data":""
}

PHP示例代码

<?php
$userid="2d939377c2";
$vid="2d939377c272967efcdb812a1dad8c5c_2";
$ptime=time()*1000;
$secretkey="3OmoLbTlHu";
$str="ptime=$ptime&vid=$vid".$secretkey;
$sign=strtoupper(sha1($str));
?>
<!DOCTYPE html>
<html>
<head>
   <meta charset="utf-8">
   <title>上传PPT异步转换</title>
</head>
<body>
   <form action="http://api.polyv.net/v2/video/<?php echo $userid; ?>/uploadPPT/asyn" method="post" enctype='multipart/form-data'>
     <input type="hidden" name="ptime" value="<?php echo $ptime; ?>">
     <input type="hidden" name="vid" value="<?php echo $vid; ?>">
     <input type="hidden" name="sign" value="<?php echo $sign; ?>">
     ppt:<input type="file" name="courseware" id="fileupload1" /><br>
   <input type="submit" value="点击上传"/>
 </form>
</body>
</html>

签名规则

将非空的请求参数按照参数名字典顺序排列,连接参数名与参数值,并在尾部加上secretkey,生成40位大写SHA1值,作为sign。 以下是示例过程:

1、请求参数为

"ptime" = "1493188350000"
"vid" = "3828390191de2b3fd3467c36187aac08_3"

2、将请求参数按照参数名字典顺序排列

"ptime" = "1493188350000"
"vid" = "3828390191de2b3fd3467c36187aac08_3"

3、连接字符串
连接参数名与参数值,并在尾部加上secretkey(secretkey的值为tIQp4ATe9Z),如下:

ptime=1493188350000&vid=3828390191de2b3fd3467c36187aac08_3tIQp4ATe9Z

4、生成签名sign

4CE511177FD5A8A3E56EB31A20776C0DE157519A
以上内容是否对您有帮助?根本没有帮助文档较差文档一般文档不错文档很好
Loading...

视频专辑使用教程(视频)

视频说明

保利威推出视频专辑功能,无需开发,简单几步即可将一系列点播视频整合成一个页面播放。可以用于系列专题课程、产品展示、操作教程等场景。

下面,我们来看下具体怎么操作:
第一步:新建专辑
登陆官网后台,打开视频列表,在左面菜单栏可以看到“视频专辑”,我们打开它,然后点击“新增专辑”,输入专辑名称确定即可。

第二步:添加视频内容
在添加视频之前,需要对视频内容进行分组,点击“创建分组”,输入分组名称,然后点击“添加视频”,根据自己的需求点击右边的加号添加视频,再点击右上角“添加”完成视频添加。如果需要添加其他分组视频,同样的操作方式即可。

有几点要注意:
1.需要先创建分组,再添加视频;
2.分组和视频都可通过鼠标拖拽方式进行排序;
3.基于安全性考虑,不支持添加加密视频。

第三步:展示页外观设置
点击外观设置,左边区域是设置项。右边区域是预览区。
首先设置封面,封面类型可以选择图片或者视频。这里以图片形式展示为例,选择图片类型,点击上传,选择上传的一张图片点击打开即可。

有几点要需要注意:
1.图片尺寸不能超过1920*1080,图片大小不能超过 2M。
2.支持 jpg、jpeg、png、gif 格式。
3.上传多张图片时,将以轮播的方式呈现,最多可上传6张图片。

在下列选项中分别填写好专辑标题、专辑描述、按钮文字,然后选择主题颜色,点击保存就可以完成外观设置。

第四步:分享观看链接
我们回到视频专辑首页,可以在专辑列表看到我们新建好的专辑,点击“分享”,可以获得一个链接地址和二维码。可以使用网页端进行观看或者手机扫描二维码观看。

好啦,今天的体验就到这里,如果您在使用过程有任何疑问,欢迎联系保利威服务团队

 

以上内容是否对您有帮助?根本没有帮助文档较差文档一般文档不错文档很好
Loading...

Java 上传SDK使用文档

Polyv Java 上传 SDK 为您提供服务端上传媒体文件到保利威云点播平台的开发工具包。

功能

  • 快捷上传多种格式的媒体文件。
  • 支持上传时的各种设置,如文件标题、描述、标签、上传目录、是否开启课件优化处理等。
  • 采用分片并发上传的方式,支持断点续传

使用方法

前提条件

  1. 使用本 SDK 前,要先开通保利威云点播服务。如果您还不了解该服务,请登录产品主页查看,详见:云点播
  2. 获取userId、secretKey 等相关信息用于用户身份校验,您可以在「云点播管理后台 -> 设置 -> API接口」页面中找到相关信息,点击这里登录后台

环境要求

Java版本1.8.0及以上

集成 SDK

  1. 下载Java上传SDK开发包(包含示例代码和所需jar包),点击这里下载
  2. 将解压后的jar文件拷贝至您的项目中;

  3. 使用IDE开发时引用jar包的方法,以Eclipse和IntelliJ IDEA为例说明如下:

3.1 在Eclipse中选择您的工程,右击 -> Properties -> Java Build Path -> Add JARs;

3.2 在IntelliJ IDEA中打开您的工程,File -> Project Structure -> Modules -> 右侧Dependencies -> + -> JARs or directories

API参考

1. 入口类 PolyvUploadClient.java

1.1 构造方法

PolyvUploadClient(String userId, String secretKey, int partitionSize, String checkpoint, int threadNum)

参数解释:

参数 说明
userId 保利威账号ID
secretKey 保利威账号的secretKey
partitionSize 可指定分片上传时每个分片的大小,单位:字节,默认为1MB,取值范围为100KB~5GB
checkpoint 使用断点续传时,写入续传位置的本地磁盘路径,需保证文件路径已经创建好
threadNum 可指定分片上传时的并发线程数,默认为1。注:该配置会占用服务器CPU资源,需根据服务器情况指定。

1.2 上传方法

uploadVideoParts(VideoInfo videoInfo)

该方法返回视频ID。

2. 视频实体类 VideoInfo.java

视频信息字段:

名称 类型 必填 描述
fileLocation String Y 视频文件在本地的绝对路径,必须包含文件后缀
title String N 视频标题,为空时会取视频文件名作为标题(不含后缀)
fileSize Long N 文件大小
describ String N 视频简介
tag String N 视频标签,多个用,分隔
cataId Long N 视频分类ID,默认值:1,表示上传到默认分类
luping Int N 是否进行课件优化处理,默认值:0
keepsource Int N 是否保持源文件播放,默认:0
videoPoolId String N 视频ID,当上传中断续传时,需要指定vid来恢复上传
state String N 自定义拓展信息,如果提交了该字段,会在上传完成的事件回调中透传返回。

示例代码

import net.polyv.bean.vo.VideoInfo;
import net.polyv.callback.UploadCallBack;
import net.polyv.entry.PolyvUploadClient;
import net.polyv.enumeration.UploadErrorMsg;

public class PolyvUploadVideoDemo {
    private static final String userId = ""; //保利威账号的userId(必填)
    private static final String secretKey = ""; //账号的secretKey(必填)

    public static void main(String[] args) {
        int partitionSize = 1*1024 * 1024; //可指定分片上传时每个分片的大小,默认为1M
        int threadNum = 1; //可指定分片上传时的并发线程数,默认为1,(注:该配置会占用服务器CPU资源,需根据服务器情况指定)
        String checkpoint = "/Users/TestUser/Desktop"; //断点续传的上传位置写入路径
        PolyvUploadClient client = new PolyvUploadClient(userId, secretKey, partitionSize, checkpoint, threadNum); //初始化PolyvUploadClient实例

        VideoInfo videoInfo = new VideoInfo();
        videoInfo.setFileLocation("/Users/TestUser/Desktop/testVideo.mp4"); //视频文件在服务器上的绝对路径,必须包含拓展名(必填)
        videoInfo.setTitle("测试视频"); // 视频标题(必填)
        videoInfo.setCataId(1L); // 上传的分类目录,默认值:1,表示上传到默认分类(可选)
        videoInfo.setDescrib("视频描述"); // 视频描述(可选)
        videoInfo.setTag("视频标签"); // 视频标签(可选)
        videoInfo.setLuping(0); //是否进行课件优化处理,默认值:0(可选)
        videoInfo.setKeepSource(0); //是否保持源文件播放,默认:0(可选)
        videoInfo.setState("自定义拓展信息"); //如果提交了该字段,会在上传完成的事件回调中透传返回

        System.out.println("vid=" + client.uploadVideoParts(videoInfo, new UploadCallBack() {
            @Override
            public void start(String s) {
                System.out.println("start=" + s);
            }
            @Override
            public void process(String s, long l, long l1) {
                System.out.println("process=" + s + ",uploaded=" + l + ", total=" + l1);
            }
            @Override
            public void complete(String s) {
                System.out.println("complete=" + s);
            }
            @Override
            public void success(String s) {
                System.out.println("success=" + s);
            }

            @Override
            public void error(String s, UploadErrorMsg uploadErrorMsg) {
                System.out.println("error=" + s + ", message=" + uploadErrorMsg.getMessage());
            }
        }, true));
        // 当上传中断,重新恢复的时候,可以指定vid来恢复上传 videoInfo.setVideoPoolId("xxxxxxxxxxx");
        //     videoInfo = new VideoInfo();
        //     videoInfo.setFileLocation("C:\\Users\\Lenovo\\Desktop\\video\\test.mp4");
        //     videoInfo.setVideoPoolId("xxxxxxxxxxx");
        //     System.out.println("vid=" + client.uploadVideoParts(videoInfo), new UploadCallBack() {
        //         @Override
        //         public void start(String s) {
        //             System.out.println("start=" + s);
        //         }
        //         @Override
        //         public void process(String s, long l, long l1) {
        //             System.out.println("process=" + s + ",uploaded=" + l + ", total=" + l1);
        //         }
        //         @Override
        //         public void complete(String s) {
        //             System.out.println("complete=" + s);
        //         }
        //         @Override
        //         public void success(String s) {
        //             System.out.println("success=" + s);
        //         }
        //         @Override
        //         public void error(String s, UploadErrorMsg uploadErrorMsg) {
        //             System.out.println("error=" + s + ", message=" + uploadErrorMsg.getMessage());
        //         }
        //     }, true);
        // }
    }
}

Change log

日期 版本 更新内容
2020-03-29 v1.1.1 支持自定义拓展字段,可在上传完成回调中透传返回
2019-08-05 v1.0.0 支持断点续传的新版Java上传SDK 发布
以上内容是否对您有帮助?根本没有帮助文档较差文档一般文档不错文档很好
Loading...

回调通知使用说明

功能说明

在视频相关处理环节(如上传、转码、审核)完成后,系统会将处理结果提交到配置的回调地址,通知用户处理进展和状态,以便进行其他业务操作。

回调配置

登录云点播管理后台,在 设置 --> 回调设置 配置回调URL。
image-20200224093654793

事件类型

目前支持的事件通知类型参考如下:

一、视频上传完成

点播服务端接收完上传的视频文件后,会产生视频上传完成事件。

HTTP请求方式为:GET。

事件内容

名称 描述
sign 系统签名,由“upload”字符串拼接vid、secretkey并做MD5运算生成。例如,vid的值为e2e84a738302f20a4f6eb202976f5c63_e,secretkey的值为7UagtQOq2A,将字符串uploade2e84a738302f20a4f6eb202976f5c63_e7UagtQOq2A进行MD5计算,得到sign的值为:b245e3e65aa45b60dc02337b5cd914a7
type 回调类型:upload 已上传,invalidVideo 不合规格视频(当上传的视频的信息无法被系统分析时,判断为不合规格视频)。
vid 视频ID
state 用户自定义数据,在上传视频接口上传SDK中,如果提交了该字段,会在事件完成回调时透传返回。

回调示例

http://demo.polyv.net/callback?sign=b245e3e65aa45b60dc02337b5cd914a7&type=upload&vid=e2e84a738302f20a4f6eb202976f5c63_e

二、异步上传处理失败

当使用管理后台的视频同步功能或者使用异步方式上传视频,处理失败时会产生此事件。

当收到此回调时,说明远程上传视频失败,需检查源视频的URL地址。

HTTP请求方式为:GET。

事件内容

名称 描述
sign 系统签名,由type、fileUrl、secretkey按顺序拼接并做MD5运算生成。例如:fileUrl 的值为 "http://a.mp4" , secretkey 的值为 kXmHMLeX6M ,将字符串 async_uploadhttp://a.mp4kXmHMLeX6M 进行MD5计算,得到 c2f168b96d882c1a03f1021c29208916
type 回调类型,返回固定值:async_upload。
fileUrl 用户提交的需要远程上传的视频URL地址
title 用户提交的需要远程上传的视频标题
state 用户自定义数据,在上传远程视频接口中,如果提交了该字段,会在事件完成回调时透传返回。

回调示例

http://demo.polyv.net/callback?sign=c2f168b96d882c1a03f1021c29208916&fileUrl=http://a.mp4&type=async_upload&title=test

三、视频同步失败

当视频上传成功后,系统需要把上传至边缘节点的视频源文件同步回中心节点,同步失败时会产生此事件。

HTTP请求方式为:GET。

事件内容

名称 描述
sign 系统签名,由type、vid、secretkey按顺序拼接并做MD5运算生成。
type 回调类型,返回固定值:videoSyncedFail。
vid 视频ID

回调示例

http://demo.polyv.net/callback?sign=b245e3e65aa45b60dc02337b5cd914a7&type=videoSyncedFail&vid=e2e84a738302f20a4f6eb202976f5c63_e

四、视频单个清晰度转码完成

视频的某种格式的某个清晰度(如:高清的mp4格式)转码完成时会产生此事件。

视频任一清晰度转码完成并审核通过后即可播放(视频状态会更新为“已发布”,如果其它清晰度的转码还未完成,播放器会自动选择已完成转码的清晰度)。

HTTP请求方式为:GET。

事件内容

名称 描述
sign 系统签名,由type、format、vid、df、secretkey按顺序拼接并做MD5运算生成,例如type的值为encode,format的值为flv,vid的值为e2e84a738302f20a4f6eb202976f5c63_e,df的值为1,secretkey的值为7UagtQOq2A,将字符串encodeflve2e84a738302f20a4f6eb202976f5c63_e17UagtQOq2A进行MD5计算,得到3c3eab358901ad19bc59b5df7704ed48
type 回调类型:encode 转码完成,encode_failed 转码失败
format 转码后的视频格式,非加密视频默认转码出flv、mp4格式;加密视频默认转码出pdx、m3u8格式。
vid 视频ID
df 视频清晰度:1 流畅,2 高清,3 超清

回调示例

http://demo.polyv.net/callback?sign=3c3eab358901ad19bc59b5df7704ed48&type=encode&format=mp4&vid=e2e84a738302f20a4f6eb202976f5c63_e&df=1

五、视频全部清晰度转码完成

视频所有清晰度转码完成会产生此事件。

由于返回内容较多,该回调的请求方式为POST。

事件内容

名称 描述
sign 系统签名,由eventType、vid、secretkey按顺序拼接并做MD5运算生成。注:sign不在POST Body中,而是作为回调URL中的一个参数返回
eventType 事件类型,取固定值:TranscodeComplete
status 视频转码状态,取值:success 成功,fail 失败 。只要有一个清晰度转码成功即返回success。
vid 视频ID
videoInfos 视频转码详情

videoInfos为数组,每个视频流的信息字段如下:

名称 描述
status 单个清晰度视频转码状态,取值:success 成功,fail 失败
format 视频格式
df 视频清晰度:1 流畅,2 高清,3 超清
bitrate 视频码率
duration 视频时长,单位:秒
size 视频大小,单位:Byte
resolution 视频分辨率

回调示例

Content-Type:application/json
Request URL:http://demo.polyv.net/callback?sign=3c3eab358901ad19bc59b5df7704ed48
HTTP POST Body:
{
  "eventType": "TranscodeComplete",
  "status": "success"
  "vid": "812a792458101ebf5ff6a1e5e76e1c58_8",
  "videoInfos": [
    {
      "duration": 883,
      "df": 1,
      "size": 15499011,
      "format": "mp4",
      "bitrate": 256,
      "resolution": "480x360",
      "status": "success"
    },
    {
      "duration": 883,
      "df": 2,
      "size": 27574109,
      "format": "mp4",
      "bitrate": 512,
      "resolution": "848x636",
      "status": "success"
    }
  ]
}

六、视频审核完成

视频任一清晰度转码完成后需经过智能审核或人工审核,只有审核通过的视频才可播放。审核完成后会产生此事件。

HTTP请求方式为:GET。

事件内容

名称 描述
sign 系统签名,由“manage”字符串拼接type、vid、secretkey并做MD5运算生成。例如,type的值为pass,vid的值为e2e84a738302f20a4f6eb202976f5c63_e,secretkey的值为7UagtQOq2A,将字符串managepasse2e84a738302f20a4f6eb202976f5c63_e7UagtQOq2A进行MD5计算,得到8ebb91d444ce53fafa3256670fb65d84
type 回调类型:pass 审核通过 nopass 审核不通过
vid 视频ID

回调示例

http://demo.polyv.net/callback?type=pass&vid=e2e84a738302f20a4f6eb202976f5c63_e&sign=8ebb91d444ce53fafa3256670fb65d84

七、视频删除完成

当视频文件被删除至回收站或者从回收站彻底删除时,会产生此事件。

HTTP请求方式为:POST。

事件内容

名称 描述
sign 系统签名,由eventType、secretkey按顺序拼接并做MD5运算生成:md5("DeleteMediaComplete"+secretKey) 。
注:sign不在POST Body中,而是作为回调URL中的一个参数返回。
eventType 回调类型,取固定值:DeleteMediaComplete
operateTime 操作时间,例如:2020-01-20 07:49:17
operator 操作者账号
status 操作状态,success 成功
deleteType 删除方式:MoveToTrash 删除到回收站 DeletePermanently 永久删除
vids 被删除视频的vid,批量删除时返回多个vid

回调示例

Content-Type:application/json
Request URL:http://demo.polyv.net/callback?sign=3c3eab358901ad19bc59b5df7704ed48
HTTP POST Body:
{
  "eventType": "DeleteMediaComplete",
  "operateTime": "2020-01-20 07:49:17",
  "operator": "aaa@polyv.net",
  "status": "success",
  "deleteType": "MoveToTrash",
  "vids": "e2e84a738302f20a4f6eb202976f5c63_e,e2e84a738302f20a4f6eb202976f5c63_f"
}

八、视频内容安全审核不通过

当视频经过AI智能扫描,发现有确认或疑似违规内容时,会产生此事件。

HTTP请求方式为:POST。

事件内容

名称 描述
sign 系统签名,由eventType、secretkey按顺序拼接并做MD5运算生成,md5("AIContentScanNotPassed"+secretKey)。
注:sign不在POST Body中,而是作为回调URL中的一个参数返回
eventType 回调类型,取固定值:AIContentScanNotPassed
scanSource 扫描来源,video 视频 ppt 三分屏课件
vid 视频ID
scanResults 扫描结果数组,包含一个或多个扫描结果,详见下表:

扫描结果信息如下:

名称 描述
imageUrl 检测图片的URL
scene 检测场景:porn 鉴黄 terrorism 暴恐涉政识别
label 检测结果分类,当scene=porn时,label取值为:
- normal 正常图片
- sexy 性感图片
- porn 色情图片
当scene为terrorism时,label取值为:
- normal 正常图片
- politics 涉政图片
- bloody 血腥图片
- weapon 武器
- others 其它
suggestion 检测建议:review 需人工复审;block 确认违规
rate 检测结果为该分类的概率,取值范围[0.00-100.00]

回调示例

Content-Type:application/json
Request URL:http://demo.polyv.net/callback?sign=6c5b14548fb9c06ee1b987debf88f639
HTTP POST Body:
{
  "eventType": "AIContentScanNotPassed",
  "scanSource": "video",
  "vid": "8205ac89d3699e1fc08cd8f9b8486748",
  "scanResults": [
    {
      "imageUrl": "http://img.videocc.net/uimage/8/8205ac89d3/8/8205ac89d3699e1fc08cd8f9b8486748_0_b.jpg",
      "scene": "porn",
      "label": "sexy",
      "suggestion": "block",
      "rate": 93.26
    }
  ]
}

九、课件转换完成

当上传的课件(PPT、PDF文件)转换图片完成时,会产生此事件。

HTTP请求方式为:POST。

事件内容

名称 描述
sign 系统签名,由eventType、secretkey按顺序拼接并做MD5运算生成,md5("CoursewareConvertComplete"+secretKey)。
注:sign不在POST Body中,而是作为回调URL中的一个参数返回
eventType 回调类型,取固定值:CoursewareConvertComplete
status success 转换成功, convertFailed 转换失败,auditNotPassed 内容审核不通过
vid 视频ID
convertedImages 转换后的图片,包含一个或多个图片信息,当转换失败时不返回。详见下表:

转换后的图片信息如下:

名称 描述
pageNo 课件页码,从1开始
pageTitle 课件页标题,若PPT文件中未设置页标题,则值为空
pageImage 转换后的图片地址
pageThumbnail 缩略图地址

回调示例

Content-Type:application/json
Request URL:http://demo.polyv.net/callback?sign=de9d5652a5682718c5662499c5e4e5bb
HTTP POST Body:
{
  "eventType": "CoursewareConvertComplete",
  "status": "success",
  "vid": "f13e995735d99df23a7728be335e7a41_f",
  "convertedImages": [
    {
      "pageNo": 1,
      "pageTitle": "第一页的标题",
      "pageImage": "https://doc-oss.polyv.net/images/2020/04/b0a8a0ed3425c117e6552cd027b6eb4b31243c9/b0a8a0e6d3425c117e6552cd027b6eb4b31243c9_0000.jpeg",
      "pageThumbnail": "https://doc-oss.polyv.net/images/2020/04/b0a8a0ed3425c117e6552cd027b6eb4b31243c9/b0a8a0e6d3425c117e6552cd027b6eb4b31243c9_0000_s.jpeg"
    },
    {
      "pageNo": 2,
      "pageTitle": "第二页的标题",
      "pageImage": "https://doc-oss.polyv.net/images/2020/04/b0a8a0ed3425c117e6552cd027b6eb4b31243c9/b0a8a0e6d3425c117e6552cd027b6eb4b31243c9_0001.jpeg",
      "pageThumbnail": "https://doc-oss.polyv.net/images/2020/04/b0a8a0ed3425c117e6552cd027b6eb4b31243c9/b0a8a0e6d3425c117e6552cd027b6eb4b31243c9_0001_s.jpeg"
    }
  ]
}
以上内容是否对您有帮助?根本没有帮助文档较差文档一般文档不错文档很好
Loading...

统计视频观看时长的相关方式说明

不少教育类场景都有统计观众的视频观看时长的需求,以此来判断是否完成了课程,能否触发下一步动作(比如观看下一阶段的课程),或者单纯统计并在前台显示观众的观看时长以及观看视频数量。

整体来看统计观看时长有两种方案,一种是通过服务端API来获取统计数据,另一种是借助前端播放器提供的接口,业务方自己统计,两种方案的优劣及适用场景见下表:

统计方式 前端统计 服务端API获取
时效性 实时 非实时。由于服务端需要处理整个平台的播放数据,所以会有一定延时。
数据准确性 准确 有轻微误差。因网络、链路等影响,前端上报的播放数据有可能会发送失败,所以服务端返回的观看时长不能保证绝对准确。
开发成本 较高,业务方需借助播放器的相关接口,自行在前端计算观看时长等数据并上报业务后台。 低,只需调用对应的API来获取统计结果。
适用场景 对统计实时性要求高的业务场景 对统计实时性要求不高的业务场景

前端统计方式介绍

Web播放器(包括PC H5、Flash、移动端H5播放器)

在Web页面播放视频时,可借助播放器提供的相关接口、事件并结合自身业务规则来统计所需的数据,并上报自己的业务系统。

接口:

  • j2s_getCurrentTime() //获取当前播放的时间点,比如视频播放到第20s时返回:20。
  • j2s_realPlayVideoTime() //获取正片播放时间,不包括广告、片头、暂停、片尾等时间,视频播放过程中该值会累加。

事件:

  • s2j_onPlayStart // 播放器成功加载视频文件并缓冲完成后,即将开始播放时触发。
  • s2j_onPlayOver // 播放结束后触发。

其它的播放器属性、接口和事件详见播放器事件汇总播放器函数汇总

注:j2s_realPlayVideoTime获取的是播放的自然时间时长,比如当使用2倍速播放到视频的第60s时:
player.j2s_getCurrentTime() = 60
player.j2s_realPlayVideoTime() = 30

移动端SDK(Android SDK、iOS SDK)

在APP中播放视频时,可使用保利威点播SDK提供的相关接口、事件并结合自身业务规则来统计所需的数据,并上报自己的业务系统。

iOS SDK:

  • @property (nonatomic, assign, readonly) NSTimeInterval viewerWatchDuration // 用户观看时间,假如用2倍速播放到视频的第60s,该方法返回30。
  • @property (nonatomic, assign, readonly) NSTimeInterval videoContentPlayedTime //视频内容播放的时间,假如用2倍速播放到视频的第60s,该方法返回60。

Android SDK:

  • getWatchTimeDuration() // 用户观看时间,假如用2倍速播放到视频的第60s,该方法返回30。
  • getVideoContentPlayedTime() // 视频内容播放时间,假如用2倍速播放到视频的第60s,该方法返回60。

SDK也都有播放开始、完成、出错等事件回调,其它的播放器属性、接口和事件详见Github文档:iOS,Android

服务端API获取方式介绍

通过观看日志:

通过视频完成度接口:

接口文档:获取视频观看完成度接口

该接口可查看某一观众累计观看某一视频的完成度情况。无论观众使用哪种终端、分多少次观看,接口返回的是最终的汇总的完成度。

比如,视频A时长为50分钟,观众使用PC H5观看了第0~20分钟,使用手机H5观看了第10~30分钟,又使用APP观看了第40~50分钟,累计观看时长为20+20+10=50分钟,但观看的视频内容是 0~30 和 40~50 的部分。虽然累计观看时长与视频时长相同,但完成度为 (30+10)/50=80%。而用前端统计的方式,只能统计当次观看的时长,即使通过业务后台汇总累加了每次的时长,也只能通过对比观看时长和视频时长来判断是否完成了观看,上述例子中观看时长与视频时长相同,但实际完成度是80%。

通过视频高级分析来统计:

功能说明文档:高级分析功能说明

接口文档:高级分析-分页查询观看行为列表

注:
- 通过观看日志接口获取的数据在平台数据量大的情况下可能会滞后几个小时(也就是视频播放后隔几小时才能查到数据),后续会优化到10分钟以内。
- 后台导出excel表中的开始时间,是数据存储的时间,并不等同于视频开始播放的时间。
- 视频观看完成度在服务端每隔1小时计算一次,也就是有最大1小时的延迟。
- 高级分析每天统计一次,也就是有最大24小时的延迟。
- 完成度接口和高级分析中的完成度是基于视频正常速度来计算的,假如用2倍速完整观看一个视频,完成度会计算为50%。

以上内容是否对您有帮助?根本没有帮助文档较差文档一般文档不错文档很好
Loading...

恢复回收站视频API接口

接口URL

https://api.polyv.net/v2/video/{userId}/recover-videos

接口说明

该接口恢复点播回收站中的视频,接口支持批量恢复,一次性最多支持恢复100个视频。

返回结果支持格式

JSON

请求方式

POST

请求参数

参数名 必选 类型及范围 说明
userId true string 用户id,路径参数
ptime true string 当前13位毫秒级时间戳,3分钟内有效
sign true string 签名,40位大写的sha1值
vids true string 点播视频vid

返回结果

{
    "code": 200,
    "status": "success",
    "message": "success",
    "data": ""
}

失败返回json

// 时间戳过期:
{
  "code": 400,
  "status": "error",
  "message": "ptime is too old.",
  "data": ""
}
// 视频vids为空
{
    "code": 400,
    "status": "error",
    "message": "vids can't be empty",
    "data": ""
}
// vids数量超过100个
{
    "code": 400,
    "status": "error",
    "message": "vids limits 100",
    "data": ""
}
// 签名报错
{
    "code": 400,
    "status": "error",
    "message": "the sign is not right.",
    "data": ""
}

响应参数说明

字段 说明 类型 schema
code 响应码 int32
status 响应状态:success/error/fail string
message 错误信息说明 string
data 响应数据

响应错误说明

错误代码 message 说明
400 sign can not be empty. 加密串为空
400 ptime is too old. 时间戳过期
400 ptime is illegal. 时间戳参数格式不对或者超过当前时间3分钟
400 Could not find user by userId. userId不存在
400 the sign is not right. 签名不正确
400 vids can't be empty 视频vid为空
400 vids limits 100 vids数量超过100个

PHP请求示例

<?php

$userId="xxxxxx";
$secretkey="xxxxxx";
$url = 'http://api.polyv.net/v2/video/'.$userId.'/recover-videos';
$header = array('application/x-www-form-urlencoded');
$data = array(
    "ptime" => time()*1000,
    "vids" => "xxxxxx_x",
);
ksort($data);
$str='';
foreach ($data as $k => $v) {
    $str = $str.$k.'='.$v.'&';
}
$str=substr($str,0,strlen($str)-1);
$str=$str.$secretkey;
$hash=strtoupper(sha1($str));
$data["sign"]=$hash;
// 请求接口
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$sResult = curl_exec($ch);
if($sError=curl_error($ch)){
    die($sError);
}
curl_close($ch);
//打印获得的数据
print_r($sResult);
?>

签名规则:

将非空的请求参数按照参数名字典顺序排列,连接参数名与参数值,并在尾部加上secretkey,生成40位大写SHA1值,作为sign。 以下是示例过程:

1、请求参数为

ptime = "1492591990000"
vid = "382839019131be68715e9455f8d0971a_3"
format = "json"

2、将请求参数按照参数名字典顺序排列

format = "json"
ptime = "1492591990000"
vid = "382839019131be68715e9455f8d0971a_3"

3、连接字符串
连接参数名与参数值,并在尾部加上secretkey(secretkey的值为tIQp4ATe9Z),如下:

format=json&ptime=1492591990000&vid=382839019131be68715e9455f8d0971a_3tIQp4ATe9Z

4、生成签名sign

50BF9B165630A8047EB1D17D95A469CC51FF754E
以上内容是否对您有帮助?根本没有帮助文档较差文档一般文档不错文档很好
Loading...