在线教育平台付费课程、企业内训的培训课程,这类视频课程内容是如何做防下载和防盗录的?
这个功能能够将水印隐藏在视频中,不会影响观看体验,但却能够帮助企业很好的视频版权保护。更重要的是,对于盗录侵权内容,我们可以通过这个功能做溯源,追踪侵权行为。
图:AI隐形溯源水印
采用分布式编码技术,将视频文件物理切片,每片视频进行多种算法混合型加密, 同时结合独立研制密码本,将关键数据进行错序混淆,对视频文件进行最高级别加密,这样经过加密的视频内容即使被下载,也无法进行恶意的二次分发,视频破解难度倍增。
市面上常见的H5加密,采用标准的Apple HLS Encryption 视频保护机制,我们在此基础上进行深度优化,对密钥key进行深度加密,同时实现对视频播放器与视频数据文件双重加密处理,形成端到端的全链路视频安全防护,即使视频文件被盗用,其他应用也无法播放,让视频更加安全。
我们的加密调用方法示例:
Web页面播放加密视频前,需要先访问业务方自己的服务端授权验证接口(可以在这里加上自有业务的授权验证逻辑,例如是否登录、是否购买课程等, 建议使用HTTPS)。如果业务上允许播放,则通 过创建 Playsafe Token接 口获取播放凭证(或者在服务端生成sign、ts参数),并返回给Web端播放器。
服务端生成播放凭证代码示例:
// 接口中应附带自有业务的授权验证逻辑,如判断是否登录、是否购买课程等
// 以下为生成播放凭证的代码示例
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-urlencoded",
'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;
Java SpringMvc代码:
@ResponseBody
@RequestMapping("/playerSafe")
public String playerSafe(HttpServletRequest request) {
String userId = "your userId"; // 保利威点播账号的userId
String secretkey = "your secretkey"; // 保利威点播账号的secretkey
String videoId = "88083abbf5bcf1356e05d39666be527a_8"; // 视频vid
long ts = System.currentTimeMillis(); // 时间戳
String viewerIp = getClientIp(request); // 观众ip
String viewerId = "12345"; // 观众id
String viewerName = "testUser"; // 观众昵称, 若值为中文需要urlencode('张三')
String extraParams = "HTML5"; // 自定义扩展参数
boolean disposable = false; // true 表示 token 仅一次有效。false 则表示在有效期内可以多次验证。默认为 false。
/* 将参数 userId、secretkey、videoId、ts、viewerIp、viewerIp、viewerId、viewerName、extraParams按照ASCKII升序 key + value + key + value ... +value 拼接
*/
String concated = "extraParams" + extraParams + "ts" + ts + "userId" + userId + "videoId" + videoId + "viewerId" + viewerId + "viewerIp" + viewerIp + "viewerName" + viewerName;
// 首尾加上secretkey值
String plain = secretkey + concated + secretkey;
// 取大写MD5,可自行选择md5库
String sign = md5Hex(plain).toUpperCase();
// 然后将下列参数用post请求 https://hls.videocc.net/service/v1/token 获取 token
String url = "https://hls.videocc.net/service/v1/token";
Map params = new HashMap<>();
params.put("userId", userId);
params.put("videoId", videoId);
params.put("ts", String.valueOf(ts));
params.put("viewerIp", viewerIp);
params.put("viewerName", viewerName);
params.put("extraParams", extraParams);
params.put("viewerId", viewerId);
params.put("sign", sign);
// 可自行选择http客户端
String response = HttpClientUtil.getInstance().sendHttpPost(url, params);
try {
//解析json
ObjectMapper objectMapper = new ObjectMapper();
TokenResponse tokenResponse = objectMapper.readValue(response, TokenResponse.class);
// 响应代码,200为成功,403为ts过期或签名错误,400为参数错误(例如缺少 userId 或 videoId)
if (tokenResponse.getCode() == 200) {
Map data = (Map) tokenResponse.getData();
return data.get("token").toString();
}
} catch (IOException e) {
e.printStackTrace();
}
return "";
}
static class TokenResponse {
int code;
String status;
String message;
Object data;
//省略getter、setter...
}
public String getClientIp(HttpServletRequest request) {
String ip = request.getHeader("x-forwarded-for");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return ip;
}
图:用户ID跑马灯
将用户I的ID、电话号码或其他信息内容等设置在视频上不规则跑动(作追溯盗版者用)。 ID跑马灯功能,是指通过设定文字内容(一般是观众的身份ID信息)在视频上不规则滚动,以此来警示盗版者,达到视频版权保护的效果,示例中是将用户的ID和电话号码显示出来。
图:数字化动态水印
将用户ID、电话号码或其他信息内容等以动态水印形式展现在视频上,实现水印在视频上不规则地显现,可追溯录屏者身份,对翻录行为起到强有力的震慑作用。
图 / 浏览器防录屏
通过播放器实时监测,如果检测到视频处于录屏状态或小窗待录屏状态,视频会立即停止播放,显示报错信息,视频无法继续播放。
在视频中添加企业专属的视频水印,从而让视频中融入企业的版权信息,防止盗录者盗取版权,保护公司的知识产权。视频上传后自动将企业的LOGO图标水印加在视频右上角/右下角等位置上。
通过OVP防盗链技术实现指定网站播放,俗称域名黑白名单。设置网站A白名单,则只允许视频在A网站下播放;设置网站B黑名单,则禁止视频在B网站下播放,可有效防止用户原创视频资源被非法盗用。
HTTPS协议,采用了HTTPS协议,其提供网站身份验证与加密通讯方法,避免信息截韧“钓鱼”攻击,有效防止网页被篡改,保证企业及学员间的信息 安全;ATS标准,苹果操作系统遵循ATS标准,开启ATS安全特性后,网络传输自动通过HTTPS协议进行传输,保证视频播放安全。
播放器代码加密,防反编译、代码混淆等方式。
html5播放器禁止拖拽功能实例(常用于场景:企业培训、在线教学内容禁止学员拖动视频进行观看)。
如果你有更多关于视频加密、视频防录、视频版权保护方面的想法,欢迎在评论区留言与大家一起分享。
我的文章推荐: