H5同层播放

在Android手机上使用H5播放视频时,大多数的国内浏览器厂商都会在视频播放时劫持<video>标签,使用浏览器自带的播放器播放视频,而且播放器会处于最高层级,视频上面无法显示其它html元素。比如在Android微信下播放视频,Polyv播放器的皮肤控件没有显示出来,也是这个原因。对于这种情况暂时没有有效的解决办法。

但是由于X5内核的浏览器(微信、QQ浏览器)提供了一些属性可以解决覆盖Dom元素的问题,腾讯命名为同层播放。Polyv播放器支持在Android手机上开启同层播放功能,此功能只对使用了腾讯X5内核的浏览器有效,比如微信、QQ。

开启同层播放的播放器代码示例如下:

<div id="player"></div>
<script src="//player.polyv.net/script/player.js"></script>
<script>
var player = polyvPlayer({
    wrap: '#player',
    width: 800,
    height: 533,
    vid: '88083abbf5bcf1356e05d39666be527a_8',   
    useH5Page: true // 开启同层播放
});
</script>

注:经测试发现,小部分机型的微信、QQ内同层播放参数可能不生效。

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

授权播放和防录屏跑马灯

屏幕录像是最难防范的一种视频盗版方式,保利威播放器提供的防录屏跑马灯功能,通过设定文字内容(一般是观众的身份ID信息)在视频上不规则滚动,以此来警示盗版者,达到视频版权保护的效果。

另外在用户网站中,除了通过登录信息(cookies)验证观众是否有权限访问视频播放页面外,还可以通过保利威播放器验证观众是否有播放某一个视频的权限,从而实现对观众权限的双重验证。

防录屏跑马灯的视频介绍:防录屏神器–跑马灯(视频)

实现流程

image-20200831160621474

实现步骤

一、管理后台设置

  1. 登录云点播管理后台,点击 【设置】【视频设置】,进入视频设置页面。
  2. 在授权播放和防录屏跑马灯接口设置栏中,填写业务方的接口服务URL。
    image-20200831161317380

播放器在请求授权接口时,会自动适配以下情况:

  1. 当填写的是完整的URL时,播放器会直接请求,例如:http://mywebsite.com/interface/validate。
  2. 当填写的是不带协议头的接口地址时,播放器会根据当前页面的请求协议自动补全。例如填写的是://mywebsite.com/interface/validate,当前页面使用https协议访问,那么实际请求的是:https://mywebsite.com/interface/validate。
  3. 当填写的是不带协议头和HOST的接口地址时,播放器会根据当前页面的请求协议和HOST自动补全。例如填写的是:/interface/validate 或 interface/validate,当前页面的域名是mywebsite2.com,且页面使用http协议访问,那么实际请求的是:http://mywebsite2.com/interface/validate。

二、业务方服务端实现

1、播放器端请求

当管理后台设置授权播放和跑马灯接口后,Polyv播放器在播放视频时会首先请求后台设置的接口,请求的方式为GET,并且会附带vid、code、t、callback这四个参数,例如:https://www.mywebsite.com/validate?vid=e2e84a73837363106d8d257f60e55c4c_e&code=&t=1457938821973&callback=polyvObject16209048491895664483_1457938783908&_=1457938784101。

其中code为播放器嵌入代码中的参数,值可以自定义;t为播放器产生的随机数。播放器示例代码如下:

<script src='https://player.polyv.net/script/player.js'></script>
<div id='player'></div>
<script>
var player = polyvPlayer({
    wrap: '#player',
    width: 800,
    height: 533,
    vid: '88083abbf5bcf1356e05d39666be527a_8',   
    code: 'myCodeValue'  // 用户可自定义参数值,也可以不设置此参数,那么在请求接口时该参数值为空。参数值为中文时需要做base64URLSafe。
});
</script>

由于H5播放器通过Ajax方式请求用户接口,需要跨域请求,因此需要callback参数。而Flash播放器是通过跨域文件实现跨域,所以不需要callback参数,请求接口时只会提交vid、code和t三个参数。Flash播放器实现跨域请参考跨域访问设置

2、服务端接口实现

业务方服务端接口如果只需实现授权验证的功能,只需返回 status、username、sign三个参数给播放器验证即可。

服务端实现的PHP示例如下:

// validate.php
<?php
$username = "elvis"; // 用户昵称, 若值为中文需要urlencode('张三'),可从session获取
$secretkey = "secretkey"; // 登录保利威管理后台,点击 【设置】 → 【API接口】获取
$vid=$_GET["vid"];
$t = $_GET["t"];
$code = $_GET["code"];

if($username=="elvis"){ 
  $status = 1; // 业务方可自定义授权验证逻辑
}else {
  $status = 2;
}
if(!empty($_GET["callback"])){
  $callback = $_GET["callback"];
}else{
  $callback = '';
}

$sign=md5("vid=$vid&secretkey=$secretkey&username=$username&code=$code&status=$status&t=$t");
$array=Array("status"=>$status,"username"=>$username,"sign"=>$sign);
$Json = json_encode($array);

if($callback!=''){ //PC H5播放器会提交callback参数
  echo $callback."(".$Json.")";
} else{ //Flash播放器不提交callback参数
  echo "(".$Json.")";
}
?>

其中,sign的计算规则为:拼接vid、secretkey、username、code、status、t参数做MD5计算:

Plain ="vid=" + vid + "&secretkey=" + secretKey + "&username=" + username + "&code=" + code + "&status=" +status + "&t=" + t
sign = MD5.hash(Plain);

以下为接口返回示例:

  polyvObject16208229674372271079_1478765178186({
  "status":1,
  "username":"elvis",
  "sign":"1cca74bd55c6076091ed84807065e5b7"
  })
// 不提交callback参数时
{
  "status":1,
  "username":"elvis",
  "sign":"2c2bfb00314da7d768d50a7d1e93bd9f"
}

如果除了授权验证,还需实现跑马灯功能,则接口需要返回跑马灯相关的参数。

服务端实现的PHP示例如下:

// validate.php
<?php
$username = "elvis"; // 用户昵称, 若值为中文需要urlencode('张三'),可从session获取
$secretkey = "secretkey"; // 登录保利威管理后台,点击 【设置】 → 【API接口】获取
$vid=$_GET["vid"];
$t = $_GET["t"];
$code = $_GET["code"];
$fontSize="40";
$fontColor="0xFFE900";
$speed="200";
$filter="on";
$setting="3";
$alpha="1";
$filterAlpha="1";
$filterColor="0x3914AF";
$blurX="2";
$blurY="2";
$tweenTime="1";
$interval="5";
$lifeTime="3";
$strength="4";
$show="on";
$msg="Errormessage!";

if($username=="elvis"){ // 业务方可自定义授权验证逻辑
 $status = 1;
}else {
 $status = 2;
}

if(!empty($_GET["callback"])){
 $callback = $_GET["callback"];
}else{
 $callback = '';
}

$sign=md5("vid=$vid&secretkey=$secretkey&username=$username&code=$code&status=$status&t=$t&msg=$msg&fontSize=$fontSize&fontColor=$fontColor&speed=$speed&filter=$filter&setting=$setting&alpha=$alpha&filterAlpha=$filterAlpha&filterColor=$filterColor&blurX=$blurX&blurY=$blurY&interval=$interval&lifeTime=$lifeTime&tweenTime=$tweenTime&strength=$strength&show=$show");
$array = Array("status"=>$status,"username"=>$username,"sign"=>$sign,"msg"=>$msg,"fontSize"=>$fontSize,"fontColor"=>$fontColor,"speed"=>$speed,"filter"=>$filter,"setting"=>$setting,"alpha"=>$alpha,"filterAlpha"=>$filterAlpha,"filterColor"=>$filterColor,"blurX"=>$blurX,"blurY"=>$blurY,"tweenTime"=>$tweenTime,"interval"=>$interval,"lifeTime"=>$lifeTime,"strength"=>$strength,"show"=>$show,);
$Json = json_encode($array);

if($callback!=''){
 echo $callback."(".$Json.")";
} else{
 echo $Json;
}
?>

其中,sign的计算规则为(参数必须按照示例中的顺序拼接):

Plain = "vid=" + vid + "&secretkey=" + secretKey + "&username=" + username + "&code=" + code + "&status=" + status + "&t=" + t + 
"&msg=" + msg + "&fontSize=" + fontSize + "&fontColor=" + fontColor + "&speed=" + speed +"&filter=" +filter + "&setting=" + setting + 
"&alpha=" + alpha + "&filterAlpha=" + filterAlpha  + "&filterColor=" + filterColor + "&blurX=" + blurX + "&blurY=" + blurY + 
"&interval=" + interval + "&lifeTime=" + lifeTime + "&tweenTime=" + tweenTime + "&strength=" + strength + "&show=" +show;
sign = MD5.hash(Plain);

例如:当vid="8f8482aaab11dd5f45f183a9192a04c5_8",secretkey="AiDQw1mAmi",username="suki",code="abc",status="1",t="143020010115550947",msg="Errormessage!",fontSize="40",fontColor="0xFFE900",speed="200",filter="on",setting="3",alpha="1",filterAlpha="1",filterColor="0x3914AF",blurX="2",blurY="2",interval="5",lifeTime="3",tweenTime="1",strength="4",show="on"时,
拼凑起来去MD5计算的字符串为:
vid=8f8482aaab11dd5f45f183a9192a04c5_8&secretkey=AiDQw1mAmi&username=suki&code=abc&status=1&t=143020010115550947&msg=Errormessage!&fontSize=40&fontColor=0xFFE900&speed=200&filter=on&setting=3&alpha=1&filterAlpha=1&filterColor=0x3914AF&blurX=2&blurY=2&interval=5&lifeTime=3&tweenTime=1&strength=4&show=on
则sign为MD5计算后32位小写的值:3b07f56f29b7fd728bf20020442338e7

以下为接口返回示例:

{
  "status":1,
  "username":"elvis",
  "sign":"6ab63590797e513d1b6c46b407413478",
  "msg":"Errormessage!",
  "fontSize":"40",
  "fontColor":"0xFFE900",
  "speed":"200",
  "filter":"on",
  "setting":"3",
  "alpha":"1",
  "filterAlpha":"1",
  "filterColor":"0x3914AF",
  "blurX":"2",
  "blurY":"2",
  "tweenTime":"1",
  "interval":"5",
  "lifeTime":"3",
  "strength":"4",
  "show":"on"
}

三、接口返回参数说明

参数名 类型 必填 默认值 说明
status Integer / 是否允许播放:1 允许 2 禁止
username String / 观众名称,也会用于跑马灯显示的文字内容。如果是中文需要做URLEncode
sign String / 接口签名,用于校验返回内容是否被篡改
show String off 当参数值为“on”时表示显示跑马灯,默认不显示
setting Integer 1 跑马灯滚动的样式:1 从右到左滚动 2 随机位置闪烁 3 从右到左闪烁滚动
speed Integer 200 跑马灯文字从右侧移至左侧所需时间,单位:1/10秒
lifeTime Integer 3 跑马灯文字显示时间,单位:秒
interval Integer 5 跑马灯文字隐藏间隔时间,单位:秒
tweenTime Integer 1 跑马灯文字渐隐渐现时间,单位:秒
fontSize Integer 30 跑马灯文字的字体大小
fontColor String 0x000000 跑马灯文字颜色,使用十六进制颜色值表示,如0xFF0000,默认为黑色
alpha Float 1 跑马灯文字透明度,取值范围0.01~1,参数值不能小于0.01
filter String off 跑马灯文字是否描边,on 描边 off 不描边
filterAlpha Float 1 文字描边透明度,取值范围0~1
filterColor String 0x000000 文字描边颜色,使用十六进制颜色值表示,如0xFF0000,默认为黑色
strength Integer 4 描边强度,取值范围0~255
blurX Integer 2 描边水平模糊量,取值范围0~255
blurY Integer 2 描边垂直模糊量,取值范围0~255
msg String / 自定义错误提示信息
  1. 当接口只做授权验证用途时,只需返回 status、username和sign三个参数,跑马灯相关参数可不返回。
  2. 请确保接口返回数据是utf-8编码,注意 status参数是整型,不能是字符串类型。
  3. 目前跑马灯功能不支持在移动端H5播放器上使用。
  4. 请尽量不要对播放器样式或\标签进行修改
以上内容是否对您有帮助?根本没有帮助文档较差文档一般文档不错文档很好
Loading...

视频加密

域名黑白名单、授权播放等安全机制主要用于控制视频播放请求来源的合法性,能够有效保障用户的合法访问。但这些机制不会对视频数据本身进行加密,对于付费观看视频的业务场景,用户只需通过一次付费行为拿到视频资源URL便可将视频下载到本地并进行二次分发,因此,这些机制对于视频版权保护是不够的。

保利威视频加密采用私有的加密算法,提供包括加密转码、安全传输、解密播放等一体化的视频安全方案。通过对视频数据本身进行高强度的加密,视频文件即使被下载到本地也无法直接播放和传播,可有效防止视频泄露和盗版问题。

核心优势

保利威视频加密的核心优势有:

  • 保利威视频加密功能采用自有知识产权的专利技术,视频的加密转码、传输、解密播放全部受私有算法保护,破解难度极高。
  • 每个视频文件都有独立的私钥,能有效避免一个密钥的泄露引起大范围的安全问题。播放器和服务端使用加密协议进行密文传输,有效防止密钥被窃取。
  • 提供多套不同安全级别的加密方案,可根据自身业务场景选择。
  • 提供安全的播放器SDK,覆盖H5、Flash、iOS、Android、小程序、桌面客户端等多平台,且加密视频必须使用保利威安全播放器才能播放。
  • 云点播平台提供了完整的加密视频播放授权体系,开发者只需获取播放凭证并传入Polyv播放器即可实现加密播放,免去了凭证和密钥的管理、验证、分发等开发工作。
  • Polyv播放器提供的授权播放和防录屏跑马灯功能,进一步加强了版权保护能力。
  • 保利威服务于上千家在线教育客户,视频版权保护技术不断更新迭代,始终处于行业领先水平。

流程架构

点播视频加密和解密播放的整体架构流程如下:

video-encryption

使用说明

一、后台配置

在云点播管理后台,支持针对整个账号或某个视频分类进行加密设置,操作流程如下:

1、登录云点播管理后台,点击 【设置】【加密设置】,进入加密设置页面。

image-20200915115350189

  • 视频加密设置:打开后,新上传的视频都会经过加密转码。
  • 加密视频授权设置:播放加密视频有四种授权方式,分别为:非加密授权、Web授权、App授权和小程序授权。这四种授权方式的安全级别不同,支持播放的终端也不同,您可以根据自身业务场景选择合适的授权方式。详见下表:

    授权方式/支持终端 PC Web 手机H5 手机APP PC 客户端 微信小程序
    非加密授权
    WEB授权
    APP授权 × ×
    小程序授权 ×
    1. 安全级别从高到低排序为:APP授权 > 小程序授权 > WEB授权 > 非加密授权。
    2. 如果您的业务场景只有手机APP播放,建议选择“APP授权”,如果有手机H5播放视频的需求,建议选择“WEB授权”,但Web授权的安全级别低于APP授权。
    3. 加密视频只能通过保利威提供的安全播放器SDK才能播放。

2、开启加密设置后,所有新上传的视频都会经过加密转码。管理后台还支持只对某一视频分类进行单独设置。操作方式为:点击 【视频列表】【视频分类管理】,选中某个分类,点击【分类属性设置】,进行分类下的加密设置。

image-20200915135521582

二、播放加密视频

加密视频必须使用保利威提供的播放器才能播放,云点播提供Web端、iOS、Android、小程序、桌面客户端等多平台的播放器SDK,以便您快速在自身应用或网站中集成。

  • Web播放器(PC/手机 H5、Flash):通过引入Polyv Web播放器代码,可在自己的Web页面嵌入播放器并实现播放,详见:Web端播放加密视频
  • 移动端播放器(iOS、Android SDK):用户可以通过SDK快速集成视频播放能力到自己的应用中,详见:iOS SDKAndroid SDK
以上内容是否对您有帮助?根本没有帮助文档较差文档一般文档不错文档很好
Loading...

视频水印

视频水印是指在视频转码时,将水印图片编码进视频流中,使水印图片成为视频的一部分。企业可以把专属的Logo等信息作为视频水印显示在视频画面中,以此来展示企业版权信息和品牌形象。

需要注意的是,由于水印图片已经编进视频流,所以转码后的视频无法再次修改和隐藏水印。如需修改,只能重新设置水印并上传视频。

关于水印与播放器Logo的区别,详见:如何区分水印和LOGO

在管理后台设置水印

在云点播管理后台,支持针对整个账号或某个视频分类进行水印设置,操作流程如下:

  1. 登录云点播管理后台,点击 【设置】【视频设置】,进入视频设置页面。
  2. 在视频水印设置栏中,上传水印图片并设置水印的显示位置。设置水印后,会对账号下所有新上传视频生效。

    image-20200914115910569

  3. 如果只想针对某个视频分类进行水印设置时,点击 【视频列表】【视频分类管理】,选取要设置水印的某个分类,点击【分类属性设置】,打开分类属性的设置弹窗。在视频水印处,可以上传水印图片并指定显示位置。

    image-20200914140742617

注:
1. 水印图片需要为png格式,图片宽或高的尺寸超过256px时会被等比缩放。
2. 水印设置成功后,只对新上传的视频生效,旧视频不受影响。
3. 云点播平台还支持利用ASS字幕文件来实现动态水印的效果,详见:通过ASS字幕实现动态视频水印效果

通过API设置水印

您可以通过API来设置账号或分类级别的水印,详见:设置视频水印

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

播放域名黑白名单

云点播平台的视频在Web端都是通过用户网站进行播放的,保利威云点播提供了播放域名黑白名单的设置功能。您可以在点播管理后台设置允许播放域名的黑白名单,降低视频被恶意盗链的风险。

在管理后台设置域名黑白名单

  1. 登录云点播管理后台,点击 【设置】【播放域名设置】,进入域名黑白名单的设置界面。
  2. 根据自身的业务场景,选择域名限制的范围:

  • 如果选择“无域名限制”,则视频可以在任何网站(域名)下播放。
  • 如果设置了“禁止播放的域名”,则视频在“禁止域名(黑名单)”范围内无法播放,最多可设置5个域名。
  • 如果设置了“允许播放的域名”,则视频只允许在“允许域名(白名单)”范围内播放,最多可设置5个域名。
  • 如果选择了“复合判断”,播放器会先判断当前播放域名是否在白名单,再判断是否在黑名单。这个选项适用于允许视频在某域名下播放,但禁止其中一个子域名播放的场景。

    image-20200914144009405

通过API设置域名黑白名单

您还可以通过服务端API来查询和设置播放域名的黑白名单,详见:

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

概览

如何保障视频内容安全,防止视频被盗链、非法下载和传播,是众多企业困扰已久的问题,特别是在线教育、企业培训、财经金融等在线版权视频领域,处理不好会造成严重的经济损失或信息泄露风险。

保利威云点播提供了针对视频内容安全的多种保护机制,从产品功能、技术实现以及平台服务等多方面保障您的视频版权不受到非法侵犯。详见:保利威PlaySafe视频版权保护体系。视频介绍详见:保利威课件版权保护体系

在技术和产品功能层面保利威提供如下的视频安全保护机制:

安全机制 描述 安全级别
播放密码 可针对视频设置播放密码,观众需输入正确的密码才能播放视频
视频水印 把企业专属水印编码进视频流,让视频内带有版权信息,保护公司知识产权
播放域名黑白名单 通过设置域名黑白名单,实现视频只能在指定网站播放的效果 较低
授权播放 视频播放前播放器调用业务方的授权验证接口,实现二次鉴权
录屏/抓流监测 播放器自动检测主流浏览器或手机系统的录屏/抓流行为,并警告终止播放 较高
防录屏跑马灯 将观众信息显示在视频上,并不规则地跑动,可追溯录屏者身份,对翻录行为起到强有力的警示作用。 较高
视频加密 采用私有加密算法和安全传输机制,提供云端一体的视频加密解决方案
安全下载 移动端(iOS/Android SDK)将加密后的视频数据缓存在本地,私钥加密存储且只有保利威播放器才可解密播放

播放密码

播放密码是一种简单的安全保护机制,为视频设置密码后,观众需输入正确的密码才可以播放视频。

使用方式参考:播放密码

视频水印

水印是在视频编码时将图片压在视频流中的,水印图片成为了视频的一部分。企业可以把专属的Logo等信息作为视频水印显示在视频画面中,以此来展示企业版权信息和品牌形象。

使用方式参考:视频水印

播放域名黑白名单

播放域名限制是在云端配置的视频资源访问策略,根据视频所在网站的域名,可配置拒绝播放视频的网站域名黑名单,或允许播放视频的网站域名白名单,以达到基本的保护目的,防止被恶意盗链播放。

使用方式参考:播放域名设置

授权播放和防录屏跑马灯

在用户网站中,除了登录验证外,还可以通过在云点播管理后台设置授权验证接口,播放器会调用该接口去验证观众是否有播放某一个视频的权限,从而实现对观众的二次鉴权。

另外该接口还可以通过返回跑马灯的内容和样式信息,在视频播放过程中,使观众信息在视频上不规则滚动,以此来警示盗版者,达到视频版权保护的效果。

使用方式参考:授权播放和跑马灯

录屏/抓流检测

部分浏览器(比如360浏览器)以及浏览器插件带有录屏或抓取视频流并下载的功能,保利威播放器会主动监测录屏或抓流行为,一旦发现观众开启了录屏功能或抓流插件,视频会自动停止播放并提示。保利威Android/iOS SDK也提供防录屏功能,开启防录屏开关后,在Android系统中录制的视频画面为黑色,而在iOS系统中视频会终止播放并提示。

浏览器录屏检测的视频介绍:浏览器防录屏(视频)

视频加密

上述安全机制能够有效保障用户的合法访问,但对于付费观看场景,如果盗版者通过一次付费拿到视频播放URL,将视频下载到本地并进行二次分发,对于企业而言所造成的经济损失也是十分严重的。因此需要通过多种安全机制配合,共同保障视频内容安全,而其中最为重要的一项安全保护机制,就是视频加密。

保利威视频加密是对视频数据本身进行加密,加密后的视频即使被下载到本地,也是无法播放和二次分发的。视频加密可有效防止视频泄漏和盗链问题。

使用方式参考:保利威视频加密

安全下载(离线播放)

在移动端(iOS、Android)APP,一般会有缓存、下载到本地并离线播放的业务场景,保利威移动端SDK提供的安全下载功能可以有效保护下载到本地的视频文件,防止被拷贝后恶意播放和传播。主要优点有:

  1. 下载到本地的视频本身是加密的,只能通过保利威移动端SDK进行解密播放,拷贝后无法直接播放和二次分发。
  2. 私钥文件加密存储,有效防止被窃取。
  3. 每个视频文件都有独立的私钥,即使单个泄漏也不会影响其它视频。
  4. 所有的下载、解密、播放逻辑在SDK内部实现,用户无需额外处理,简单易集成。

使用方式参考:

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

播放密码

播放密码是一种较简单的视频安全保护机制,为视频设置密码后,观众需输入正确的密码才可以观看视频。

使用方式为:

  1. 登录点播管理后台,点击【视频列表】,选中视频后点击【视频设置】,为视频设置密码。

    image-20200914112710438

  2. 观众需输入正确的密码才可观看视频。

    image-20200911172710933

您还可以通过服务端API来查询和修改视频的播放密码:

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

播放加密视频

保利威视频加密采用私有的加密算法,提供包括加密转码、安全传输、解密播放等一体化的视频安全方案。通过对视频数据本身进行高强度的加密,视频文件即使被下载到本地也无法直接播放和传播,可有效防止视频泄露和盗版问题,详见:视频加密

为了方便开发者快速集成,我们将解密播放相关逻辑都封装到了播放器内部,与播放普通视频相比,在播放器端,开发者只需多传入播放凭证参数即可实现加密视频的播放。

开发指引

加密视频,需使用播放凭证方式进行播放,播放器需要传递的参数如下:

名称 类型 说明
playsafe String/Function PC端播放加密视频所需的授权凭证,业务方服务端通过创建 Playsafe Token接口获取并返回给播放器。
playsafeUrl String 获取PC端播放加密视频凭证的接口URL(与playsafe参数二选一
ts Number 移动端H5播放加密视频需传入的13位毫秒级时间戳
sign String 移动端H5播放加密视频所需的签名,生成规则为点播账号的secretkey、vid、ts的值按字母顺序拼接后进行md5计算后的值,由业务方服务端生成并返回给播放器。

注:playsafe或playsafeUrl参数用于PC端解密播放,ts、sign用于移动端H5播放器解密。如果PC和移动端使用同一份播放器代码,则三个参数都需要传值。

播放器代码示例:

<div id="player"></div>
<script src="//player.polyv.net/script/player.js"></script>
<script>
var player = polyvPlayer({
    wrap: '#player',
    width: 800,
    height: 533,
    vid: '88083abbf5bcf1356e05d39666be527a_8',   
    playsafe:'81814fed-bdd0-4506-bec1-ebc8093148c5-hfevwsfxcsbcocx', 
  //playsafeUrl:'https://myDomain.com/token', // 业务方自定义的获取播放凭证接口URL,与playsafe参数二选一
    ts:'1568131545000',
    sign:'88313661ba7ded642c7b557b0a364b4b'
});

//切换加密视频时,需要重新获取播放凭证。如果初始化播放器时使用了playsafeUrl参数,则播放器会自动获取新的凭证,无需传playsafe参数。
player.changeVid({
  vid: '88083abbf5bcf1356e05d39666be527a_9', //需要切换的视频vid
  playsafe: '81814fed-bdd0-4506-bec1-ebc8093148c6-hfevwsfxcsbcocx', //新获取的playsafe token
  sign: '88313661ba7ded642c7b557b0a364b4c', //新获取的sign和ts参数
  ts: '1568131545001'
});
</script>

Web页面播放加密视频前,需要先访问业务方自己的服务端授权验证接口(可以在这里加上自有业务的授权验证逻辑,例如是否登录、是否购买课程等, 建议使用HTTPS)。如果业务上允许播放,则通过创建 Playsafe Token接口获取播放凭证(或者在服务端生成sign、ts参数),并返回给Web端播放器。

服务端生成播放凭证代码示例:

PHP 代码:

// 接口中应附带自有业务的授权验证逻辑,如判断是否登录、是否购买课程等

// 以下为生成播放凭证的代码示例
function get_client_ip() {
  if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
    $ipaddress = $_SERVER['HTTP_CLIENT_IP'];
  } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
      $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
  } else {
      $ipaddress = $_SERVER['REMOTE_ADDR'];
  }
    return $ipaddress;
}

$userId = 'your userId';       // 保利威点播账号的userId
$secretkey = 'your secretkey';     // 保利威点播账号的secretkey
$videoId = '88083abbf5bcf1356e05d39666be527a_8';  // 视频vid
$ts = time() * 1000;      // 时间戳
$viewerIp = get_client_ip();  // 观众ip
$viewerId = '12345';      // 观众id
$viewerName = 'testUser';  // 观众昵称, 若值为中文需要urlencode('张三')
$extraParams = 'HTML5';  // 自定义扩展参数
$disposable = false // true 表示 token 仅一次有效。false 则表示在有效期内可以多次验证。默认为 false。

/* 将参数 $userId、$secretkey、$videoId、$ts、$viewerIp、$viewerIp、$viewerId、$viewerName、$extraParams按照ASCKII升序 key + value + key + value ... +value 拼接
*/
$concated =  'extraParams'.$extraParams.'ts'.$ts.'userId'.$userId.'videoId'.$videoId.'viewerId'.$viewerId.'viewerIp'.$viewerIp.'viewerName'.$viewerName;
// 首尾加上secretkey值
$plain = $secretkey.$concated.$secretkey;
// 取大写MD5
$sign = strtoupper(md5($plain));

// 然后将下列参数用post请求  https://hls.videocc.net/service/v1/token 获取 token
$url = 'https://hls.videocc.net/service/v1/token';
$data = array('userId' => $userId, 'videoId' => $videoId, 'ts' => $ts, 'viewerIp' => $viewerIp, 'viewerName' => $viewerName, 'extraParams' => $extraParams, 'viewerId' => $viewerId, 'sign' => $sign);
$options = array(
    'http' => array(
        'header'  => "Content-type: application/x-www-form-urlencodedrn",
        'method'  => 'POST',
        'content' => http_build_query($data)
    )
);
$context  = stream_context_create($options);
$result = file_get_contents($url, false, $context);

// 获取接口返回结果中的token值, 并传给播放器播放加密视频
$token = json_decode($result)->data->token;
echo $token;

如果播放器使用playsafeUrl参数的方式,则需输出json格式:

// 已省略获取token的代码...
$token = json_decode($result)->data->token;
$code = json_decode($result)->code; // 响应代码,200为成功,403为ts过期或签名错误,400为参数错误(例如缺少 userId 或 videoId)
$message=json_decode($result)->message;
$status=json_decode($result)->status;
if($code == 200){
    $array = Array("code"=>$code,'status'=>$status,'message'=>$message,"data"=>$token);
}else{
    $array = Array("code"=>$code,'status'=>$status,'message'=>$message,"data"=>json_decode($result)->data);
}
$Json = json_encode($array);
echo $Json; //输出json

playsafeUrl返回结果示例:

// 请求成功
{
    "code": 200,
    "status": "success",
    "message": "",
    "data": "973d7731803940a1b14fdc93941f493c"
}
// 请求失败(签名错误)
{
    "code": 403,
    "status": "error",
    "message": "sign_invalid",
    "data": "sign parameter invalid."
}

playsafeUrl可能存在跨域问题,解决方案请参考:跨域访问设置

如果需要在移动端H5播放Web加密视频,则需返回sign和ts参数给播放器:

// php
$vid = "88083abbf5bcf1356e05d39666be527a_8"; // 视频vid
$secretkey= "your secretkey"; // 保利威点播账号的secretkey
$ts=time()*1000;  // 10位的秒级时间戳,后面加多3个0,最后为13位的数值
$sign = md5($secretkey.$vid.$ts); 
以上内容是否对您有帮助?根本没有帮助文档较差文档一般文档不错文档很好
Loading...

跨域访问设置

一、什么是跨域?

跨域是指一个域下的文档或脚本试图去请求另一个域下的资源。广义的跨域包括:

  1. 资源跳转:A链接、重定向、表单提交
  2. 资源嵌入:<link><script><img><video>等Dom标签以及样式表中的background:url( )、@font-face( )等文件外链
  3. 脚本请求:Ajax请求、Dom和JavaScript对象的跨域操作等

而我们通常所说的跨域是狭义的,是由浏览器同源策略限制的一类请求场景。同源策略(Same-origin policy)是浏览器最核心也最基本的一个安全策略,它限制了从同一个源加载的文档或脚本如何与另一个源的资源进行交互。它能帮助阻隔恶意文档,减少可能被攻击的媒介。所谓同源是指协议、域名、端口三者相同,当一个请求URL的协议、域名、端口三者中任意一个与当前页面URL不同即为跨域。同源策略的限制如下:

  1. 无法读取非同源网页的Cookie、LocalStorage和IndexDB
  2. 无法获得非同源网页的Dom和Js对象
  3. 无法向非同源地址发送Ajax请求

二、跨域解决方案

常见的跨域解决方案有:

  • 通过jsonp跨域
  • 跨域资源共享(CORS)
  • Nginx代理跨域
  • postMessage跨域
  • WebSocket协议跨域
  • ...

开发者应结合实际情况选择最适合的方案,下面将对与保利威视频播放服务相关的跨域问题解决方案进行介绍。

1、通过jsonp跨域

<script><img>等一些获取资源的HTML标签是没有跨域限制的,基于此原理,网页可通过添加一个<script>,向服务器请求 JSON 数据,服务器收到请求后将数据放在一个指定名字的回调函数的参数位置传回来。

JSONP 是服务器与客户端跨源通信的常用方法。最大特点就是简单适用,兼容性好(兼容低版本IE),缺点是只支持GET请求。

原生实现:

<script src="http://www.domain2.com:8080/login?user=admin&callback=handleCallback"></script>
// 向服务器test.com发出请求,该请求的查询字符串有一个callback参数,用来指定回调函数的名字

// 处理服务器返回回调函数的数据
<script type="text/javascript">
    function handleCallback(res){
        // 处理获得的数据
        console.log(res);
    }
</script>

服务端返回数据如下:

handleCallback({"status":true,"user":"admin"})

jQuery Ajax:

$.ajax({
    url: 'http://www.domain2.com:8080/login',
    type: 'get',
    dataType: 'jsonp',  // 请求方式为jsonp
    jsonpCallback: "handleCallback",    // 自定义回调函数名
    data: {}
});

Vue.js:

this.$http.jsonp('http://www.domain2.com:8080/login', {
    params: {},
    jsonp: 'handleCallback'
}).then((res) => {
    console.log(res); 
})

2、跨域资源共享(CORS)

跨域资源共享(Cross-Origin Resource Sharing)是W3C标准,目前所有浏览器都支持该功能(IE8/9需要使用XDomainRequest对象来支持CORS),CORS也已经成为主流的跨域解决方案。详见Http访问控制CORS的详解

  • 普通跨域请求:只需服务端设置Access-Control-Allow-Origin即可,前端无需设置
  • 带cookie跨域请求:前后端都需要进行设置

前端设置:

1.) 原生Ajax

var xhr = new XMLHttpRequest(); // IE8/9需用window.XDomainRequest兼容

// 前端设置是否带cookie
xhr.withCredentials = true;

xhr.open('post', 'http://www.domain2.com:8080/login', true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.send('user=admin');

xhr.onreadystatechange = function() {
    if (xhr.readyState == 4 && xhr.status == 200) {
        alert(xhr.responseText);
    }
};

2.) jQuery Ajax

$.ajax({
   url: 'http://www.domain2.com:8080/login',
   type: 'get',
   data: {},
   xhrFields: {
       withCredentials: true    // 前端设置是否带cookie
   },
   crossDomain: true,   // 会让请求头中包含跨域的额外信息,但不会含cookie
});

3.) vue-resource

Vue.http.options.credentials = true

4.) axios

axios.defaults.withCredentials = true

服务端设置:

服务器端对于CORS的支持,主要是通过设置Access-Control-Allow-Origin来进行的。如果浏览器检测到相应的设置,就可以允许Ajax进行跨域的访问。

1.) Java后台

/*
 * 导入包:import javax.servlet.http.HttpServletResponse;
 * 接口参数中定义:HttpServletResponse response
 */

// 允许跨域访问的域名:若有端口需写全(协议+域名+端口),若没有端口末尾不用加'/'
response.setHeader("Access-Control-Allow-Origin", "http://www.domain1.com"); 

// 允许前端带认证cookie:启用此项后,上面的域名不能为'*',必须指定具体的域名,否则浏览器会提示
response.setHeader("Access-Control-Allow-Credentials", "true"); 

// 提示OPTIONS预检时,后端需要设置的两个常用自定义头
response.setHeader("Access-Control-Allow-Headers", "Content-Type,X-Requested-With");

2.) PHP后台

<?php
 header("Access-Control-Allow-Origin:*");

3、Flash播放器的跨域配置

Flash播放器在请求授权播放和跑马灯接口时,需要配置允许跨域请求。配置方式为:添加crossdomain.xml文件到播放域名的根目录下。

crossdomain.xml文件内容:

<?xml version="1.0" encoding="UTF-8"?>
<cross-domain-policy>
    <allow-access-from domain="*"/>
    <allow-http-request-headers-from domain="*" headers="*" secure="false"/>
</cross-domain-policy>
以上内容是否对您有帮助?根本没有帮助文档较差文档一般文档不错文档很好
Loading...