1、实现效果 - 查看源码

  • 实现视频可播放不能下载,禁止右键下载、F12源码打开链接下载
  • 实现只在当前窗口播放,切换窗口、窗口最小化、窗口被遮挡停止播放,恢复后继续播放

在线demo:缓存完再播放 、 边播放边缓存 、 IE 测试防止播放作弊

兼容情况:

2、Video 禁止鼠标右键下载

<!-- 添加 oncontextmenu="return false" -->
<video src="地址" controls preload="auto" oncontextmenu="return false"></video>

3、禁止源码打开链接下载

主要使用 MediaSource 和 createObjectURL 实现。参考源码

html:

<video id="videoDemo" controls preload="auto" oncontextmenu="return false" ></video>

js:

//video/webm;codecs = "vp8,vorbis"   表示webm视频容器中的vp8视频编解码器和vorbis音频编解码器3
//video/ogg;codecs = "theora,vorbis" 表示ogg视频容器中的theora视频编解码器和vorbis音频编解码器
//video/mp4;codecs = "avc1.42E01E,mp4a.40.2" 表示基本的MEPG-4视频容器中的H.264视频编解码器和ACC音频编解码器
//video/mp4;codecs = "avc1.64001E,mp4a.40.2" 表示高质量的MEPG-4视频容器中的H.264视频编解码器和ACC音频编解码器
var video = document.getElementById("videoDemo"); //mp4 格式 跟文件编码也有关
var assetURL = "demo.mp4";
var mimeCodec = 'video/mp4; codecs="avc1.42E01E, mp4a.40.2"'; //webm 格式
// var assetURL = "demo.webm";
// var mimeCodec = 'video/webm;codecs="vorbis,vp8"'; if ("MediaSource" in window && MediaSource.isTypeSupported(mimeCodec)) {
var mediaSource = new MediaSource();
video.src = URL.createObjectURL(mediaSource);
mediaSource.addEventListener("sourceopen", sourceOpen);
} else {
console.error("Unsupported MIME type or codec: ", mimeCodec);
} function sourceOpen() {
console.log(this); // open
var mediaSource = this;
var sourceBuffer = mediaSource.addSourceBuffer(mimeCodec);
fetchAB(assetURL, function(buf) {
console.log(buf);
console.log(sourceBuffer);
sourceBuffer.addEventListener("updateend", function() {
console.log(mediaSource);
mediaSource.endOfStream();
//video.play(); //这里会报错就去掉了
console.log(mediaSource.readyState); // ended
});
sourceBuffer.appendBuffer(buf);
});
}
function fetchAB(url, cb) {
console.log("fetchAB----",url);
var xhr = new XMLHttpRequest();
xhr.open("get", url);
xhr.responseType = "arraybuffer";
xhr.onload = function() {
console.log(xhr.response);
cb(xhr.response);
};
xhr.send();
}

不兼容:IE(提示 Unsupported MIME type or codec: video/mp4; codecs=”avc1.42E01E, mp4a.40.2”)

待解决: 发现network还是可以看到视频链接的并且右键还是可以打开并且下载
(Safari可以)

4、监听浏览器最小化 - document.visibilityState

document.hidden:表示页面是否隐藏的布尔值。页面隐藏包括 页面在后台标签页中 或者 浏览器最小化 (注意,页面被其他软件遮盖并不算隐藏,比如打开的 sublime 遮住了浏览器)。

document.visibilityState:表示下面 4 个可能状态的值
hidden:页面在后台标签页中或者浏览器最小化
visible:页面在前台标签页中
prerender:页面在屏幕外执行预渲染处理 document.hidden 的值为 true
unloaded:页面正在从内存中卸载

Visibilitychange事件:当文档从可见变为不可见或者从不可见变为可见时,会触发该事件。

这样,我们可以监听 Visibilitychange 事件,当该事件触发时,获取 document.hidden 的值,根据该值进行页面一些事件的处理。

var videoPausedStatus;
document.addEventListener('visibilitychange', function () {
var isHidden = document.hidden;
if (isHidden) {
videoPausedStatus = true;
if (!video.paused) {
videoPausedStatus = false;
video.pause();
}
} else {
if (!videoPausedStatus) {
video.play();
}
}
});
// //IE
// document.addEventListener('msvisibilitychange',function(){
// console.log(document.msVisibilityState);
// });
// //FF
// document.addEventListener('mozvisibilitychange',function(){
// console.log(document.mozVisibilityState);
// });
// //chrome
// document.addEventListener('webkitvisibilitychange',function(){
// console.log(document.webkitVisibilityState);
// });

5、判断当前页面是否被激活 - document.hasFocus()

解决不能监听页面被其他软件遮盖

setInterval(function () {
if (document.hasFocus() != pageFocus) {
pageFocus = document.hasFocus();
if (!pageFocus) {
if (!video.paused) {
videoPausedStatus = false;
video.pause();
}
} else {
if (!videoPausedStatus) {
video.play();
}
}
}
}, 1000);

原文:https://itguliang.github.io/post/1e5c2008.html

Video 视频播放防作弊和禁止下载的更多相关文章

  1. 去掉video视频播放器下的下载按钮

    去掉video视频播放器下的下载按钮: video::-internal-media-controls-download-button { display:none; } video::-webkit ...

  2. 移动端HTML5<video>视频播放优化实践

    遇到的挑战 移动端HTML5使用原生<video>标签播放视频,要做到两个基本原则,速度快和体验佳,先来分析一下这两个问题. 下载速度 以一个8s短视频为例,wifi环境下提供的高清视频达 ...

  3. 移动端HTML5<video>视频播放优化实践[转]

    http://blog.csdn.net/u010918416/article/details/52705732 http://www.xuanfengge.com/html5-video-play. ...

  4. 移动端 HTML5 <video> 视频播放优化实践

    遇到的挑战 移动端HTML5使用原生<video>标签播放视频,要做到两个基本原则,速度快和体验佳,先来分析一下这两个问题. 下载速度 以一个8s短视频为例,wifi环境下提供的高清视频达 ...

  5. [转]移动端HTML5<video>视频播放优化实践

    遇到的挑战 移动端HTML5使用原生<video>标签播放视频,要做到两个基本原则,速度快和体验佳,先来分析一下这两个问题. 下载速度 以一个8s短视频为例,wifi环境下提供的高清视频达 ...

  6. Chrome/Chromium HTML5 video 视频播放硬件加速

    Chromium站点上有个大致的框图.描写叙述了Chromium的video在各个平台 - 包含Android - 上是怎样使用硬件资源来做视频编解码加速的: 而依据Android Kitkat上的C ...

  7. HW Video Acceleration in Chrome/Chromium HTML5 video 视频播放硬件加速

    Introduction Video decode (e.g. YouTube playback) and encode (e.g. video chat applications) are some ...

  8. [转] MMO即时战斗:地图角色同步管理和防作弊实现

    一.前言 无论是端游.页游.手游如果是采用了MMO即时战斗游戏模式,基本都会遇到同屏多角色实时移动.释放技能.战斗等场景,于是自然也需要实现如何管理同屏内各种角色的信息同步:例如角色的位置.以及角色身 ...

  9. 【HTML5】video 标签禁用自带的下载按钮

    h5自带的 video标签 ,会有个下载按钮,有时候想避免,就可以利用样式的方法 <style type="text/css"> video::-internal-me ...

随机推荐

  1. linux通配符与基础正则

    1.特殊符号: ' '     单引号          单引号的内容     写什么就是什么,不会被当成特殊字符.       单引号实例:      [root@oldboyedu-sh01 ~] ...

  2. 算法训练 数字三角形(DP)

    问题描述 (图3.1-1)示出了一个数字三角形. 请编一个程序计算从顶至底的某处的一条路 径,使该路径所经过的数字的总和最大. ●每一步可沿左斜线向下或右斜线向下走: ●1<三角形行数≤100: ...

  3. 给label添加点击事件

    后台代码: lb1.Attributes.Add("onclick", "getSN('" + lb1.Text.Trim() + "')" ...

  4. 【转】c# 读取excel数据的两种方法

    源地址:http://www.cnblogs.com/icyJ/p/ReadExcel.html

  5. 洛谷P3178 [HAOI2015]树上操作(线段树)

    题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种:操作 1 :把某个节点 x 的点权增加 a .操作 2 :把某个节点 x 为根的子树中所有点的点权都增加 ...

  6. C#中抽象类与接口

    1抽象类 (1) 抽象方法只作声明,而不包含实现,可以看成是没有实现体的虚方法 (2) 抽象类不能被实例化 (3) 抽象类可以但不是必须有抽象属性和抽象方法,但是一旦有了抽象方法,就一定要把这个类声明 ...

  7. 云搜索服务在APP搜索场景的应用

    搜索无处不在,尤其是在移动互联的今天.无论是社交,电商,还是视频等APP中,搜索都已经在其中扮演了重要的角色.作为信息的入口,搜索能帮用户从海量信息中找到想要的信息.在APP搜索的典型场景如下: ●  ...

  8. MVC与三层的区别

    闲来无事,想了想MVC与三层的区别,根据自己的经验,上图 由此来看,其实这两种框架(结构)的分层方式其实没什么联系,也没有什么可比性,但他们的目的都一样的:解耦 --Ones

  9. 重装iTunes 错误代码42401 解决办法

    昨晚手贱点击从iTunes 11升级到iTunes12,之后发现iTunes 12各种卡,简直不能忍,然后直接拉iTunes 12到AppClear,然后安装iTunes 11,安装完成之后打开iTu ...

  10. CuteFTP文件列表按名称排序,有中文文件名时,软件死掉的解决办法

    看到很多人的解决办法是切换到一个没有中文的文件夹,点击排序后,再切换回来,这个的确是可以解决问题,但是有些繁琐! 直接一步到位的解决办法是: 依次点击菜单:工具->全局选项->导航-> ...