Video 視頻播放防做弊和禁止下載

一、實現效果 - 查看源碼

  • 實現視頻可播放不能下載,禁止右鍵下載、F12源碼打開連接下載
  • 實現只在當前窗口播放,切換窗口、窗口最小化、窗口被遮擋中止播放,恢復後繼續播放

在線demo:緩存完再播放 、 邊播放邊緩存 、 IE 測試防止播放做弊html

兼容狀況:
git

二、Video 禁止鼠標右鍵下載

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

三、禁止源碼打開連接下載

主要使用 MediaSource 和 createObjectURL 實現。參考源碼github

html:web

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

js: chrome

//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能夠)緩存

四、監聽瀏覽器最小化 - document.visibilityState

document.hidden:表示頁面是否隱藏的布爾值。頁面隱藏包括 頁面在後臺標籤頁中 或者 瀏覽器最小化 (注意,頁面被其餘軟件遮蓋並不算隱藏,好比打開的 sublime 遮住了瀏覽器)。app

document.visibilityState:表示下面 4 個可能狀態的值
hidden:頁面在後臺標籤頁中或者瀏覽器最小化
visible:頁面在前臺標籤頁中
prerender:頁面在屏幕外執行預渲染處理 document.hidden 的值爲 true
unloaded:頁面正在從內存中卸載ide

Visibilitychange事件:當文檔從可見變爲不可見或者從不可見變爲可見時,會觸發該事件。post

這樣,咱們能夠監聽 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);
// });

五、判斷當前頁面是否被激活 - 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

相關文章
相關標籤/搜索