视频安全之授权播放和防录屏跑马灯
阿酷TONY 2021-2-26 整理
视频安全之授权播放和防录屏跑马灯
先上效果图(视频播放时,显示学员名称和学员手机号):
屏幕录像是最难防范的一种视频盗版方式,保利威播放器提供的防录屏跑马灯功能,通过设定文字内容(一般是观众的身份ID信息)在视频上不规则滚动,以此来警示盗版者,达到视频版权保护的效果。
另外在用户网站中,除了通过登录信息(cookies)验证观众是否有权限访问视频播放页面外,还可以通过保利威播放器验证观众是否有播放某一个视频的权限,从而实现对观众权限的双重验证。
实现流程
实现步骤
一、管理后台设置
- 登录云点播管理后台,点击 【设置】 → 【视频设置】,进入视频设置页面。
在授权播放和防录屏跑马灯接口设置栏中,填写业务方的接口服务URL。
播放器在请求授权接口时,会自动适配以下情况:
- 当填写的是完整的URL时,播放器会直接请求,例如:http://mywebsite.com/interface/validate。
- 当填写的是不带协议头的接口地址时,播放器会根据当前页面的请求协议自动补全。例如填写的是://mywebsite.com/interface/validate,当前页面使用https协议访问,那么实际请求的是:https://mywebsite.com/interface/validate。
- 当填写的是不带协议头和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 | 是 | / | 自定义错误提示信息 |
- 当接口只做授权验证用途时,只需返回 status、username和sign三个参数,跑马灯相关参数可不返回。
- 请确保接口返回数据是utf-8编码,注意 status参数是整型,不能是字符串类型。
- 目前跑马灯功能不支持在移动端H5播放器上使用。
- 请尽量不要对播放器样式或\标签进行修改
视频安全之授权播放和防录屏跑马灯相关推荐
- html5视频播放器带ID跑马灯效果(视频防录屏)
通过接口配置获取观看者信息,将观看者信息随机显示于视频播放界面(可自定义位置.时间.时长.及颜色等),在不影响观看体验的同时,让视频具备指纹信息. ID跑马灯可快速追踪被盗视频出处,方便第一时间对录屏 ...
- 防录屏体现在哪几个方面?
一般来说视频创作完成发布的那一刻就有可能会面临着被转播复制的风险,相对于原创作者来说这是他们辛辛苦苦的劳动成果,对于一些别有用心的人来说却是获取不当利益的方式. 其实录屏的出现其实对于生活中一些人是非 ...
- drm android 截屏,DRM-X4.0新增防盗录功能Windows智能防录屏,全面防止截屏和屏幕录制...
据国家版权局网络版权产业研究基地研究调查显示,2018年中国网络版权产业规模达7423亿元,相比2017年6364.5亿元增长了16.6%,成为中国经济增长的新动能.随着互联网技术的急速发展,尤其是在 ...
- Android iOS防录屏截屏
目录 Android防录屏和截屏 关于WindowManager.LayoutParams.FLAG_SECURE 关于Display.FLAG_SECURE iOS防录屏和截屏 监听截屏 录屏监听 ...
- 录屏状态监听之防录屏 - iOS
继之前接到电话.短信和截屏监听需求之后,在 iOS 11.0 系统之上新增了屏幕录制的新功能玩法,所以也随之迎来了新的屏幕录制监听的需求,即防录屏功能监听 ... 通过官方文档得知 capturedD ...
- Android防录屏防截屏功能失效、不起作用
有关Android防录屏功能网上有很多资料,在这里还是稍微说一下,实现方法就是在Activity.onCreate中,添加以下代码: getWindow().addFlags(WindowManage ...
- 基于ijkplayer封装ffmpeg播放器的录屏实现
关于ijkplayer我自己提出的issue的https://github.com/Bilibili/ijkplayer/issues/1166的一个小总结,还先不要期望我有完整代码给出,如果只想知道 ...
- 抖音中的视频怎么使用手机录制 安卓手机录屏软件哪个好
抖音短视频已经普及一段时间了,这个效果我们都看到了,不管走到哪里,几乎可以达到人人都在刷抖音的壮观场面,坐在公交上,等公交都是看个短视频的好时间,经常刷抖音的朋友一定分享过抖音视频给好友,但是如果直接 ...
- JavaCV音视频开发宝典:JavaCV混合屏幕录屏和系统声音录制mp4视频文件(windows桌面屏幕和系统声音混合录制)
<JavaCV音视频开发宝典>专栏目录导航 <JavaCV音视频开发宝典>专栏介绍和目录 前言 之前已经写过dshow方式采集摄像头画面.麦克风.系统声音和桌面屏幕画面. 之前 ...
最新文章
- Python将小于0的书数换成0的几种方式
- JSP第二次作业_1小题
- oracle节点1关闭节点2的集群,[Oracle] Oracle两个节点分裂,识别不到对方节点的状态...
- 用 Python 做数据处理必看:12 个使效率倍增的 Pandas 技巧(上)
- 解决win7“该文件没有与之关联的程序来执行该操作”
- Linux文件IO-例会笔记总结
- 网络世界在某种程度上助长了人格的分裂
- UpdateData( )
- linux select 与 阻塞( blocking ) 及非阻塞 (non blocking)实现io多路复用的示例
- mysql 5.7 64位 解压版安装
- uniapp app端调起高德地图导航
- 领导力有哪些方面?什么是领导力?
- 学习笔记——FPGA芯片主要资源介绍
- 室内定位系列(一)——WiFi位置指纹(译)
- 微信小程序wepy框架快速入门
- i5 11400f和i5 11400区别?哪个好?深度爆料评测
- html的字体和文本样式
- 第十三届蓝桥杯JavaB组国赛H题——修路 (AC)
- 免费个人网页制作指南Dreamweaver教程
- 天朝网络已将老衲搞哭在电脑前