视频网页前端禁止截屏代码实现js

有言在先

原理是采用商业级DRM实现,DRM 许可证费用目前没有免费服务商,腾讯云价格是0.0056元/次。

另外此功能不兼容安卓,安卓系统无法正常播放视频!

先展示效果

可以看到截屏时刻出现黑屏,录屏也能保证全黑状态。

DRM介绍

商业级DRM能够实现媒体内容加密保护、防抓包和破解工具破解、防浏览器插件破解、防浏览器插件截录屏。

类似于M3U8,它也是提供一个索引文件,之后根据索引文件去找每一个小节视频,播放器自动连贯播放每一小节,看起来是完整的一个视频,所以在一定程度上能够防止抓包。

数字版权管理(英语:Digital rights management,缩写为DRM)是一系列访问控制技术,通常用于控制数字内容和设备在被销售之后的使用过程。

DRM有时也称为拷贝保护、复制控制、技术保护措施等,但这些称呼存在争议。许多数字出版社和软件厂商都使用了DRM,例如亚马逊、AT&T、AOL、Apple Inc.、Netflix、Google、BBC、微软、Sony、Valve Corporation(以及其旗下的Steam)等。

商业级DRM目前常见的解决方案有两种,分别是 FairPlay(苹果系平台) 和 Widevine(谷歌系平台)。其中,Widevine 支持 L1 和 L3 两种级别,L1 级别的解密需要专门的硬件 TEE 环境,对播放端的要求更高。如果设备本身不支持 L1,则会自动尝试以 L3 级别播放。

因为我们是出售一个使用教学,本身必须使用电脑操作,兼容苹果系统已经意义不大。所以我们文章以Widevine为例,苹果的FairPlay只需要修改选项,其他内容完全一致。

腾讯云操作

在腾讯云搜索云点播服务,开通后付费(量大可以买资源包划算点)

视频上传可以掉接口也可以手动上传,这里直接参考官方文档吧

之后选择转码,依旧是支持调用,我们这里手动转换下:

 在选项里面带Widevine就是谷歌内核浏览器才能播放,其他苹果手机和安卓手机浏览器全无法播放的。FairPlay就是苹果才能播放的。我们这里选Widevine

攒代码实现网页播放器

转换好之后我们开始攒播放器代码,这段代码放在播放页面最前面。

腾讯云播放使用的是一个类似于token的临时令牌,支持限制一个令牌最多多少IP播放,我们为了更加安全让每次浏览都新生成一个令牌,一个令牌只能播放一次

虽然是Java程序员,还是会写点PHP的,虽然写的不太优雅...

注意https网站必须设置Scheme为HTTPS,http必须为http,否则无法播放

$head = '你自己的应用头秘钥.';
$time = time();
//链接5小时内有效
$maxTime = 18000;
$str = base64UrlEncode('{"appId":1315****,"fileId":"'.$video_id.'","currentTimeStamp":'.$time.',
"contentInfo":{"audioVideoType":"ProtectedAdaptive","drmAdaptiveInfo":{"widevineDefinition":13},
"imageSpriteDefinition":10},"expireTimeStamp":'.($time + 18000).',"urlAccessInfo":{"t":"'.dechex($time + 18000).'","rlimit":1,"us":"user1",
"domain":"1315****.vod2.myqcloud.com","scheme":"HTTPS"},"drmLicenseInfo":{"expireTimeStamp":'.($time + 18000).'}}');
$hash = signature($head.$str, '自己的播放秘钥');
$sign = $head.$str.'.'.$hash;

之后HTML代码:

<video id="player-container-id" height="600px" preload="auto">

在此页面添加如下JS,进行播放:

    var player = TCPlayer('player-container-id', {
        fileID: '<?php echo $video_id ?>',
        appID: '1315*****',
        psign:'<?php echo $sign?>',
        plugins:{
            DynamicWatermark: {
                type: 'text',
                speed: 0.5,
                content: '漂浮水印文本',
                opacity: 0.5,
                fontSize: '12px',
                color: '#bdbdbd',
            }
        }
    });

上面的漂浮水印文本一般是用户名或者本次播放的uuid,大家可以自己设置

特殊浏览器处理

虽然说是谷歌内核通用,实际上部分国内开发的不是特别好和开发的特别好的双核浏览器都存在问题。

360浏览器、火狐浏览器:用户能够正常录屏

双某浏览器、小某浏览器....等:无法播放

请提示用户使用谷歌浏览器或者Edge浏览器播放!我们接下来禁止用户使用360浏览器和火狐播放,避免视频被录屏。

禁止火狐浏览器

直接PHP通过UA判断,如果是火狐就标记一个变量,同时火狐的话不需要生成播放令牌

将上面PHP最后一行换成这个

$hash = signature($head.$str, '********');
if (!$isFireFox) {
    $sign = $head.$str.'.'.$hash;
} else {
    echo '火狐';
    $sign = '';
}

禁止360浏览器

360浏览器UA无法区分,只能使用JS代码,所以我们采用,如果是360就隐藏播放窗口,并且生成个假的窗口,看起来无法播放,引导更换浏览器。

    <script>
        function checkIeForNum() {
            return ((navigator.msPointerEnabled == undefined ? true : navigator.msPointerEnabled)
                && (navigator.msDoNotTrack == 1 || window.doNotTrack == 1)
                && ((Number(window.screenX) ? (window.screenLeft - window.screenX != 8) : false)
                    || ((navigator.userAgent.indexOf('MSIE 7.0') != -1 || navigator.userAgent.indexOf('MSIE 8.0') != -1) && console.count == undefined)));
        }
        function checkChromeForNum() {
            var uas = navigator.userAgent.split(' '),
                result = false;
            if (uas[uas.length - 1].indexOf('Safari') == -1) {
                return result;
            }
            for (var key in navigator.plugins) {
                if (navigator.plugins[key].filename == 'np-mswmp.dll') {
                    return !result;
                }
            }
            return result;
        }
        $(document).ready(function () {
            if (navigator.userAgent.indexOf('Safari') != -1) {
                if (checkChromeForNum()) {
                    $(".ke-player").html("")
                    $(".down-tip").css("display", "block")
                }
            } else {
                if(checkIeForNum()) {
                    $(".ke-player").html("")
                    $(".down-tip").css("display", "block")
                }
            }
        })
    </script>

如果是是360或者火狐就会显示 down-tip 其他浏览器会显示 ke-player 

<div class="down-tip" <?php if ($isFireFox) echo 'style="display:block"';?>>
 <p>您的浏览器不支持DRM视频解密组件!</p>
 <p>请下载 <a href="https://www.google.com/intl/zh-CN/chrome/" target="_blank">Google Chrome浏览器</a> 或 <a href="https://www.microsoft.com/zh-cn/edge?form=MA13FJ" target="_blank">Microsoft Edge浏览器</a> 观看视频吧~</p>
</div>
<div class="ke-player" <?php if ($isFireFox) echo 'style="display:none"';?>>
 <video id="player-container-id" height="600px" preload="auto">
 </video>
</div>

撒花

这样就实现了前端禁止视频截屏的功能。

苹果电脑的谷歌浏览器也能够正常播放哦!

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/29034.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

搭建Freekan私人影视电影网站,cpolar内网穿透发布上线

文章目录 1.前言2.本地网页搭建2.1 环境使用2.2 支持组件和环境设置2.3 支持组件选和环境设置2.4 网页安装2.5 测试和使用2.6 问题解决 3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 转发自CSDNprobezy的文章&#xff1a;使用Cpolarfreekan源码…

驱动开发:内核RIP劫持实现DLL注入

本章将探索内核级DLL模块注入实现原理&#xff0c;DLL模块注入在应用层中通常会使用CreateRemoteThread直接开启远程线程执行即可&#xff0c;驱动级别的注入有多种实现原理&#xff0c;而其中最简单的一种实现方式则是通过劫持EIP的方式实现&#xff0c;其实现原理可总结为&am…

Spring Security --- 自定义登录逻辑

目录 UserDetailsService详解 返回值 方法参数 异常 PasswordEncoder密码解析器详解 接口介绍 内置解析器介绍 BCryptPasswordEncoder简介 代码演示 自定义登录逻辑 编写配置类 自定义逻辑 UserDetailsService详解 当什么也没有配置的时候&#xff0c;账号和密码是…

基于51单片机设计的呼吸灯

一、项目介绍 呼吸灯是一种常见的LED灯光效果,它可以模拟人类呼吸的变化,使灯光看起来更加柔和和自然。51单片机是一种广泛使用的微控制器,具有体积小、功耗低、成本低等优点,非常适合用于控制LED呼吸灯。本项目的呼吸灯将使用PWM(脉冲宽度调制)技术控制LED亮度,从而实…

ES6学习笔记

作用域 1.4垃圾回收机制 内存的生命周期 JS环境中分配的内存&#xff0c;一般有如下生命周期 内存分配:当我们声明变量、函数、对象的时候&#xff0c;系统会自动为他们分配内存1.2.内存使用:即读写内存&#xff0c;也就是使用变量、函数等内存回收: 使用完毕&#xff0c;由…

BRC20赛道的刚需基础设施,BrccSwap如何延续新的造富神话?

引言 BRC20代币和去中心化交易所的背景 BRC20代币赛道的刚需SWAP BrccSwap如何延续新的造富神话 结语 引言 随着加密货币市场的不断发展&#xff0c;BRC20代币和去中心化交易所成为了越来越受欢迎的概念。BRC20代币是建立在比特币区块链上的代币&#xff0c;具有高级别的…

Dalamud 插件开发白皮书 P1 - Getting started

文章目录 从哪里开始 How do I get started?Dalamud 插件例子Dalamud 底层探究XIVLauncher 启动器 在哪里寻找帮助 Where do I ask for help?如何热重载插件 How do I hot-reload my plugin?如何调试插件&#xff0c;甚至游戏&#xff1f;如何在编码过程中使用 How do I use…

浅谈微前端

本文呢是我梳理的一个扫盲文&#xff0c;由于最近团队准备使用微前端对项目进行改造&#xff0c;所以我呢就先浅了解一下&#xff1a; 微前端到底是什么&#xff1f; 为什么要使用微前端&#xff1f; 都有哪些微前端方案&#xff1f; 微前端有什么不好的地方吗&#xff1f; 通过…

手动渲染农场和自助云渲染农场的区别

手动渲染农场和自助云渲染农场是两种常见的渲染方式&#xff0c;它们各有优缺点。手动渲染农场指的是在本地使用自己的硬件设备进行渲染&#xff0c;而自助云渲染农场则是利用云服务商提供的计算资源进行渲染。对于需要渲染大规模项目的设计师或工作室来说&#xff0c;选择一种…

C++11学习笔记(3)——通用工具(上)(包含重要特性智能指针Smart pointer)

1.Pair 在C11中&#xff0c;std::pair是一个模板类&#xff0c;用于将两个值组合成一个单元。它可以将两个不同的类型的值配对在一起&#xff0c;并且提供了对这对值的访问和操作。 std::pair的定义 template<class T1, class T2> struct pair{T1 first;T2 second; };…

【JAVA开发环境配置】 卸载JDK很简单, 一分钟帮你搞定!

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;web开发者、设计师、技术分享博主 &#x1f40b; 希望大家多多支持一下, 我们一起进步&#xff01;&#x1f604; &#x1f3c5; 如果文章对你有帮助的话&#xff0c;欢迎评论 &#x1f4ac;点赞&#x1…

Context Prior for Scene Segmentation--CVPR, 2020

Context Prior for Scene Segmentation–CVPR, 2020 文章目录 Context Prior for Scene Segmentation--CVPR, 2020一、背景介绍二、方法介绍1.A的生成2.Affinity Loss3.如何从 X X X获取P4.Y操作 一、背景介绍 问题&#xff1a;现阶段&#xff0c;不少语义分割方法所限于卷积结…

Android12之如何查看hidl服务(一百五十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

软件项目管理需要具备哪些能力?

作为一名软件项目管理者&#xff0c;在处理许多事情时需要不断提高个人在数据分析处理、项目业务流程管理等各个领域的能力。当然作为过来人&#xff0c;我也很清楚很多软件项目管理新人也较为疑惑如何提高自己的能力和专业水平&#xff0c;以便提高工作效率。那我也想与大家唠…

开源反分裂与数字大同世界

这是一篇报告的读后感&#xff0c;这篇报告是由Linux基金会研究部门发布的&#xff0c;名为《助力全球协作——开源代码的领导者如何面对分裂的挑战》。 这份报告的主要内容包括&#xff1a; - 开源代码开发中的分裂及其利弊- 开源的国际化&#xff0c;以及项目领导者如何克服参…

Python3数据分析与挖掘建模(16)特征降维与特征衍生

1. 特征降维&#xff08;PCA&#xff09; 回顾知识点&#xff1a; 特征降维是指将高维特征空间的数据映射到低维空间的过程&#xff0c;以减少特征的数量并保留数据的主要信息。下面是特征降维的一般步骤&#xff1a; &#xff08;1&#xff09;求特征协方差矩阵&#xff1a…

可调电源LM317 的内部原理 - 特殊的电压跟随器

之前一直没想过这类LDO 内部是怎么整的&#xff0c;它似乎是用一个分压电路采集它输出的电压作为参考&#xff0c;然后却能把输出电压稳定下来&#xff0c;颇有种左脚踩右脚上天的意思。典型的LM317 电路如下&#xff1a; 如果是个普通的电压跟随器&#xff0c;无论是基于三极管…

牛客小白月赛56

今天无聊vp了一下 A.省略 B.最优肯定是全部都是1 C.直接统计每个余数下可以填多少个数&#xff0c;然后排序从小到大的排序输出即可 #include <iostream> #include <cstring> #include <algorithm> #include <vector> #include <queue> #inc…

【八大排序(六)】快排终极篇-快速排序非递归版

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:八大排序专栏⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习排序知识   &#x1f51d;&#x1f51d; 快排非递归版 1. 前情回顾2. 快排非递归基…

windows10家庭版禁用Device/Credential Guard解决方案

文章目录 背景&#xff08;禁用的原因&#xff09;解决的方式方式一&#xff1a;通过Windows本身的功能设置禁用 ( 非家庭版的使用)1. 禁用Device Guard或Credential Guard&#xff1a;2. 关闭Hyper-V选项3. 重启电脑 方式二&#xff1a;通过命令关闭Hyper-V ( Windows 10家庭版…