Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 成人午夜网站,一区二区在线看,亚洲免费观看网站

          整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          html5 視頻播放防下載的幾種方案盤點

          定義原生播放器控制器功能限制下載

          html5 播放器默認是可以下載視頻的,在默認的控制器(給 video 標簽添加 controls 屬性開啟)上會有下載菜單, 即使不使用默認提示的控制器,右鍵彈出的上下文菜單中也會有保存視頻的選項。



          通過 controlslist 屬性可以設置瀏覽器提供的控制器,不讓下載菜單顯示出來。controlslist 還可以設置不顯示全屏等功能同,但是瀏覽器 支持較差,尤其是移動端瀏覽器。

          <video src="test.mp4" playsinline autoplay="false" controls controlslist="nodownload"></video>

          將 controlslist 的值設置為 nodownload ,就不會出現下載菜單了,不過 PC 上點擊右鍵的上下文菜單的保存視頻選項仍然有用,還是很容易被下載。

          如果是通過自定義樣式來控制播放暫時等操作的控制條,還可以將 video 禁右鍵或者蒙上一層 div 來阻止彈出上下文菜單,防止下載。

          利用 Media Source Extensions (MSE) 實現加密防下載

          雖然通過 controlslist 可以防止下載,但是有些瀏覽器不支持,很多移動端的瀏覽器會直接接管播放器。 如果用戶懂一點技術,捕獲視頻文件的鏈接,就可以直接打開鏈接進行下載了。 我們可以利用 Media Source Extensions API 來給文件做加密,這套技術本來是用于擴展的,通過擴展可以兼容更多 的視頻格式,可以認為是前端的一套自定義轉碼的接口,將文件實時轉碼成瀏覽器支持的格式。

          服務器端做好視頻的加密,將原視頻文件通過對稱性加密生成一個加密新文件,客戶端將加密的新文件加載后進行解密, 然后將解密后的原文件內容通過 MediaSource 推送,完成視頻的播放。

          <canvas height="240" width="320" id="player" onclick="playOrPause()"></canvas>


          const video = document.getElementById('videoId')
          // 視頻編碼譯碼器,使用工具 mp4info 可以查看
          const mimeCodec = 'video/mp4; codecs="avc1.42E01E, mp4a.40.2"'
          
          const mediaSource = new MediaSource()
          video.src = URL.createObjectURL(mediaSource)
          mediaSource.addEventListener('sourceopen', e => {
            const sourceBuffer = mediaSource.addSourceBuffer(mimeCodec)
            // 請求加密文件,然后解密添加到 sourceBuffer,也可以將文件裁切成多個部分,分多次加載
            fetch('./chunk')
              .then(async resp => {
                const blob = await resp.blob()
                const buf = await blob.arrayBuffer()
                sourceBuffer.addEventListener('updateend', () => {
                  // 如果是多個文件塊,可以在判定已經添加完所有塊后結束(一般會搞個塊列表做比對的)
                  mediaSource.endOfStream()
                })
                // decode 是自定義的解碼函數,將請求到的加密文件 chunk 內容解密成為真正的 mp4 文件
                // ,要與前面的 mimeCodec 對應,否則會有錯誤
                // 這個示例省略了很多錯誤處理,要處理錯誤需要對 mediaSource 和 sourceBuffer 做 error 事件處理
                sourceBuffer.appendBuffer(decode(buf))
                console.log('appendBuffer after')
              })
              .catch(console.error)
          })

          這樣處理后,通過控制臺 network 查看到的是加密文件的請求地址,拿到后也不能播放,查看 video 標簽源地址是 生成的臨時地址,也無法直接打開。并且,通過 Media Source Extensions API 還可以實現視頻分塊做按需加載。 其實 video 標簽播放視頻也會自動按需請求內容(僅部分瀏覽器),需要服務器做好對 Range 消息頭的支持,根據參數來返回部分文件內容。 不過 Media Source Extensions API 的兼容性不是很好,ie 和 safari 都是不支持的, 新版本 mac 上的 safari 不知道是否能支持。經過測試,小部分移動端瀏覽器也不支持,無法顯示出視頻,大部分移動端瀏覽都可以支持的很好。 有些網站的播放器做了兼容,對于不支持 MSE 的瀏覽器仍然使用 video 標簽播放原 mp4 文件。

          基于 canvas 實現播放器

          基于 canvas 也是一種方案,好處是不會被瀏覽器識別成視頻,也就不會被接管。很多不太規范的移動端瀏覽器 都是直接接管視頻播放器,自定義的播放器樣式完全沒用,不會被顯示出來,使用 canvas 就可以解決這個問題。

          
          const canvas = document.getElementById('player')
          /** @type {CanvasRenderingContext2D} */
          const ctx = canvas.getContext('2d')
          
          const video = document.createElement('video')
          video.addEventListener('canplay', e => {
            // 渲染封面
            this.renderCover()
          })
          fetch('./test.mp4')
            .then(async resp => {
              const blob = await resp.blob()
              video.src = URL.createObjectURL(blob)
            })
            .catch(console.error)
          
          function playOrPause() {
            if (video.ended) {
              return
            }
            if (video.paused) {
              video.play()
              startRender()
            } else {
              video.pause()
            }
          }
          
          function startRender() {
            requestAnimationFrame(() => {
              renderVideo()
              if (!video.paused && !video.ended) {
                startRender()
              }
            })
          }
          
          function renderCover() {
            ctx.clearRect(0, 0, 320, 240)
            ctx.fillStyle = '#000000'
            ctx.fillRect(0, 0, 320, 240)
            ctx.font = '40px Arial'
            ctx.fillStyle = '#ffffff'
            const text = '點擊播放'
            const m = ctx.measureText(text)
            ctx.fillText(text, 320 / 2 - m.width / 2, 240 / 2 + 40 / 2)
          }
          
          function renderVideo() {
            ctx.clearRect(0, 0, 320, 240)
            ctx.drawImage(video, 0, 0, 320, 240)
            if (video.paused) {
              ctx.font = '40px Arial'
              ctx.fillStyle = '#ffffff'
              const text = '已暫停'
              const m = ctx.measureText(text)
              ctx.fillText(text, 320 / 2 - m.width / 2, 240 / 2 + 40 / 2)
            }
          }

          以上僅僅是非常簡單的 demo,這個方案真要完善工作量還是挺大的,除操作條和字幕功能外,視頻全屏還需要做一定的重新渲染處理, 有些瀏覽器還不支持全屏 API (requestFullscreen),導致沒有辦法將視頻全屏展示。 即便如此,也無法保證百分百不能被下載, 有些瀏覽器還有媒體嗅探功能,當請求了媒體文件后,就會被檢測到,提示用戶檢測到有媒體文件, 詢問用戶是否要下載。


          經過我對某個移動端瀏覽器的測試,改 content-type 和后綴名也不行,只要請求的是視頻文件就會被檢測到。 只有把文件加密,請求的是加密文件,不是真正的視頻文件,這樣就不能被檢測到了,然后客戶端解密后再播放。

          實測這個方案兼容性也不是很好,部分移動端瀏覽器會渲染不出來視頻內容,有些還會出現卡頓和圖像錯亂。不過微信內置 以及火狐等一些較為先進的移動端瀏覽器支持的都比較好。不過,使用了 canvas 方案就沒有一些原生功能的支持的,如 小窗播放(畫中畫模式)。

          總結

          經過我的測試,對 MSE 和 canvas 方案無法支持的瀏覽器,恰恰是一些以下載視頻為特色的移動端瀏覽器, 這些瀏覽器內核可能也比較舊,或者是因為修改內核導致的不兼容,不考慮這些瀏覽器 MSE 應該是最佳方案, 因為 MSE 可以實現按需漸近加載視頻。

          由于視頻本身就非常耗資源,即時加密對服務器要求高,最好是先加密好。 加密必須是對稱性的,能加密也能解密,通過破解前端代碼掌握解密方法,仍然有辦法解開視頻內容。 如果視頻是提前加密好再存儲的,也不好去搞動態密鑰。

          html5 視頻播放器想要下載并做好兼容是非常困難的,基本上不太可能。有些對版權保護比較嚴格的網站,采取了 只能使用客戶端看視頻的方案,體驗上就差一些了。比如 cctalk 這個平臺,視頻作者可以設置保護,對于需要保護的 視頻只能通過客戶端觀看,其它的視頻仍然可以網頁上直接播放。

          希望可以通過這篇文章,能夠給你得到幫助。(感謝一鍵三連)

          學習深入理解HTML5audiovideo

          HTML5視頻概述

          HTML5播放一個視頻,很簡單,只需要一行代碼:

          <video src="resources/dadaqianduan.mp4" autoplay></video>

          了解多媒體術語

          了解視頻文件格式:

          Audio Video InterLeaved .avi
          
          Flash Video .flv
          
          MPEG-4 .mp4
          
          Matroska .mkv
          
          Ogg .ogv

          音頻和視頻編解碼器

          編解碼器可以理解為一些算法代碼,用于處理視頻,音頻或者其元數據的編碼格式。對音頻或視頻文件進行編碼,可使得文件大大縮小,便于在因特網上傳輸。

          音頻編解碼器:

          MP3,使用ACC音頻

          Wav,使用Wav音頻

          Ogg,使用OggVorbis音頻

          視頻編解碼器:

          MP4,使用H.264視頻,AAC音頻

          WebM,使用VP8視頻,OggVorbis音頻

          Ogg,使用Theora視頻,OggVorbis音頻

          多媒體文件格式

          audio元素支持的音頻格式MP3,Wav,Oggvideo元素支持的格式MP4,WebM,Ogg

          • audio元素是專門用于在網頁中播放網絡音頻的
          • video元素是專門用于在網頁中播放視頻的

          HTML5audiovideo元素提供的接口包含了一系列的屬性,方法和事件,這些接口可以幫助開發完成對音頻和視頻的操作。

          那么如何在頁面中添加音頻和視頻呢?

          音頻

          <audio src="resources/audio.mp3">
          </audio>

          視頻

          <video src="resources/video.mp4" width="600" height="200">
          </video>

          使用source元素

          因為各種瀏覽器對音頻和視頻的編解碼器的支持不一樣,為了能夠在各種瀏覽器中正常使用,可以提供多個源文件。

          <audio src="resources/audio.mp3">
           <source src="song.ogg" type="audio/ogg">
           <source src="song.mp3" type="audio/mpeg">
          </audio>
          <video src="resources/video.mp4" width="600" height="200" controls>
           <source src="movie.ogg" type="video/ogg codes=`theora,vorbis` ">
           <source src="movie.mp4" type="video/mp4">
          </video>

          使用source元素替代了audiovideo的標簽屬性src

          1. src屬性用于指定媒體文件的url地址
          2. type屬性用于指定媒體文件的類型,屬性值為媒體文件的MIME類型,該屬性值還可以通過codes參數指定編碼格式

          audiovideo特性和屬性

          元素的標簽特性

          1. src,源文件特性,用于指定媒體文件的url地址
          2. autoplay,自動播放特性,表示媒體文件加載后自動播放。
          <video src="resources/video.mp4" autoplay></video>
          1. controls,控制條特性,表示為視頻或音頻添加自帶的播放控制條。
          <video src="resources/video.mp4" controls></video>
          1. loop,循環特性,表示音頻或視頻循環播放。
          <video src="resources/video.mp4" controls loop></video>
          1. preload,預加載特性,表示頁面加載完成后如何加載視頻數據。
          • none表示不進行預加載
          • metadata表示只加載媒體文件的元數據
          • auto表示加載全部視頻或音頻,默認值為auto
          <video src="resources/video.mp4" controls preload="auto"></video>
          1. postervideo元素獨有的特性,替代內容屬性,用于指定一副替代圖片的url地址,當視頻不可以用時,會顯示該替代圖片。
          <video src="resources/video.mp4" controls poster="images/none.jpg"</video>
          1. widthheightvideo元素獨有的特性,用于指定視頻的寬度和高度
          <video src="resources/video.mp4" width="600" height="200" controls></video>

          接口屬性

          1. currentSrc,只讀,獲取當前正在播放或已加載的媒體文件的url地址
          2. videoWidth,只讀,video元素特有屬性,獲取視頻原始的寬度
          3. videoHeight,只讀,video元素特有屬性,獲取視頻原始的高度
          4. currentTime,獲取或設置當前媒體播放位置的時間點
          5. startTime,只讀,獲取當前媒體播放的開始時間
          6. duration,只讀,獲取整個媒體文件的播放時長
          7. volume,獲取或設置媒體文件播放時的音量,取值范圍在0.00.1之間
          8. muted,獲取或設置媒體文件播放時是否靜音。true表示靜音,false表示消除靜音
          9. ended,只讀,如果媒體文件已經播放完畢則返回true,否則返回false
          10. error,只讀,讀取媒體文件的錯誤代碼
          11. played,只讀,獲取已播放媒體的TimesRanges對象,該對象內容包括已播放部分的開始時間和結束時間。
          12. paused,只讀,如果媒體文件當前是暫停或未播放則返回true,否則返回false
          13. seeking,只讀,獲取瀏覽器是否正在請求媒體數據
          14. seekable,只讀,獲取媒體資源已請求的TimesRanges對象,該對象內容包括已請求部分的開始時間和結束時間
          15. networkState,只讀,獲取媒體資源的加載狀態
          16. buffered,只讀,獲取本地緩存的媒體數據的TimesRanges對象
          17. readyState,只讀,獲取當前媒體播放的就緒狀態
          18. playbackRate,獲取或設置媒體當前的播放速率
          19. defaultPlaybackRate,獲取或設置媒體默認的播放速率

          視頻播放的快進

          <!DOCTYPEHTML>
          <html>
          <head>
          <meta charset="utf-8">
          <title>視頻播放時的快進</title>
          <script type="text/javascript">
          function Forward() {
           var el = document.getElementById("myPlayer");
           var time = el.currentTime;
           el.currentTime = time+300;
          }
          </script>
          </head>
          <body>
          <video id="myPlayer" src="resources/video.mp4" width="600" height="200" controls>
          </video>
          <br/>
          <input type="button" value="快進" onclick="Forward()"/>
          </body>
          </html>

          audiovideo接口方法

          接口方法

          1. load(),加載媒體文件,為播放做準備。
          2. play(),播放媒體文件。
          3. pause(),暫停播放媒體文件。
          4. canPlayType(),測試瀏覽器是否支持指定的媒體類型。

          代碼示例使用接口:

          <!DOCTYPEHTML>
          <html>
          <head>
          <meta charset="utf-8">
          <title>播放與暫停</title>
          <script type="text/javascript">
          var videoEl = null;
          function Play() {
           videoEl.play();
          }
          function Pause() {
           videoEl.pause();
          }
          window.onload = function(){
           videoEl = document..getElementById("myPlayer");
          }
          </script>
          </head>
          <body>
          <video id="myPlayer" width="600">
           <source src="resources/video.mp4" type="video/mp4">
          </video><br>
          <input type="button" value="播放" onclick="Play()"/>
          <input type="button" value="暫停" onclick="Pause()"/>
          </body>
          </html>

          audiovideo事件

          捕獲事件的方式

          捕獲事件有兩種方法:一種是添加事件句柄,一種是監聽。

          <video id="myPlayer" src="resources/video.mp4" width="500" onplay="video_playing()">
          </video>
          
          // 監聽方式
          var videoEl = document.getElementById("myPlayer");
          videoEl.addEventListener("play",video_playing);

          接口事件

          1. play,當執行方法play()時觸發
          2. playing,正在播放時觸發
          3. pause,當執行了方法pause()時觸發
          4. timeupdate,當播放位置被改變時觸發
          5. ended,當播放結束后停止播放時觸發
          6. waiting,在等待加載下一幀時觸發
          7. ratechange,在當前播放速率改變時觸發
          8. volumechange,在音量改變時觸發
          9. canplay,以當前播放速率需要緩沖時觸發
          10. canplaythrough,以當前播放速率不需要緩沖時觸發
          11. durationchange,當播放時長改變時觸發
          12. loadstart,當瀏覽器開始在網上尋找數據時觸發
          13. progress,當瀏覽器正在獲取媒體文件時觸發
          14. suspend,當瀏覽器暫停獲取媒體文件,且文件獲取并不是正常結束時觸發
          15. abort,當終止獲取媒體數據時觸發
          16. error,在獲取媒體過程中出錯時觸發
          17. emptied,當所在網絡變為初始化狀態時觸發
          18. stalled,在瀏覽器嘗試獲取媒體數據失敗時觸發
          19. seeking,在瀏覽器正在請求數據時觸發
          20. seeded,在瀏覽器停止請求數據時觸發

          定義全局的視頻對象

          代碼如下:

          <script type="text/javascript">
          // 定義全局視頻對象
          var videoEl = null;
          // 網頁加載完畢后,讀取視頻對象
          window.addEventListener("load", function() {
           videoEl = document.getElementById("myPlayer")
          });
          </script>

          添加進度顯示功能

          代碼如下:

          <script type="text/javascript">
          function Progress() {
           var el = document.getElementById("progress");
           el.style.width = (videoEl.currentTime/videoEl.duration)*720 + "px"
           document.getElementById("info").innerHTML = s2time(videoEl.currentTime) + "/" + s2time(videoEl.duration);
          }
          
          function s2time(s) {
           var m = parseFloat(s/60).toFixed(0);
           s = parseFloat(s%60).toFixed(0);
           return (m<10?"0"+m:m)+":"+(s<10?"0"+s:s);
          }
          window.addEventListener("load",function(){videoEl.addEventListener("timeupdate",Progress)});
          window.addEventListener("load",Progress)

          添加靜音和調節音量的功能

          消除靜音videoEl.muted=false;靜音效果videoEl.muted=truevideoEl.volume=e.value;修改音量的值。

          添加慢進和快進功能

          天小編將分享前端開發中必學的知識點,HTML5中關于音視頻處理

          視頻處理

          基本內容:目前國內的視頻網站 - Flash技術,HTML5的視頻處理首先替換Flash技術,支持的視頻格式有:

          1.MP4 - .mp4 目前比較主流的視頻格式。

          2.OGG - .ogv 手機端的視頻格式。

          3.WebM - 目前唯一一個支持超高清視頻格式,該視頻格式出自Goggle公司。

          問: 如何處理視頻?

          答:<video>元素 - 引入單個格式視頻文件,它由自己的屬性組成。 src屬性 - 指定視頻文件的地址, width屬性 - 設置視頻寬度, height屬性 - 設置視頻高度。語法規范:<video src="視頻文件路徑" width=“100px”>

          !!需要注意的是:視頻的寬高比不會改變, 在video元素內定義不支持的提示內容。

          如果要想在<video>元素引入多個格式視頻文件,那么就使用<source/>,使用這種方式能夠實現各個瀏覽器的兼容性,語法規范:

          <video>

          <source src="視頻文件路徑1"/>

          <source src="視頻文件路徑2"/>

          <source src="視頻文件路徑3"/>

          </video>

          • <video>元素的屬性

          autoplay屬性 - 自動播放

          controls屬性 - 提供控制面板

          loop屬性 - 循環播放

          poster屬性 - 播放之前顯示一張圖片

          preload屬性 - 預加載(視頻)

          none - 不加載

          auto - (默認值)自動(盡快加載完畢)

          metadata - 只加載除視頻之外的信息(寬和高)

          • video的高級用法 方法

          play() - 播放視頻

          pause() - 暫停視頻

          load() - 加載視頻

          canPlayType() - 判斷是否支持該格式

          • 事件

          play - 播放視頻時觸發

          pause - 暫停視頻時觸發

          ended - 結束播放時觸發

          error - 播放錯誤時觸發

          canplay - 可播放時觸發(不考慮整體)

          canplaythrough - 整體播放順利時觸發

          progress - 下載進度

          • 屬性

          paused - 判斷視頻當前是否暫停,如果暫停狀態,返回true

          ended - 判斷視頻當前是否結束播放,如果結束播放,返回true

          duration - 當前視頻的總時長

          currentTime - 獲取或設置當前視頻播放的位置

          音頻處理

          基本內容:目前HTML頁面實現音頻處理,將Windows Media Player播放器,內置頁面中,使用Flash技術實現音頻處理,HTML5實現音頻處理支持的音頻格式有:

          1.mp3 - 感謝百度(MP3)

          2.ogg

          3.wav

          問: 如何使用音頻?

          答: audio元素 - 引入一種音頻格式。

          • <audio>元素的屬性

          src屬性 - 引入音頻文件,作用 - 實現頁面背景音樂播放

          audio元素 - 引入多種音頻格式

          source元素

          autoplay - 自動播放

          controls - 提供控制面板

          loop - 循環播放

          preload - 預加載

          audio的高級用法

          • 事件

          play - 播放音頻時觸發

          • 方法

          play() - 播放音頻

          pause() - 暫停音頻

          • 屬性

          paused - true,表示暫停狀態

          !! 需要特別注意,IE 8及之前的版本都不支持


          主站蜘蛛池模板: 日韩在线不卡免费视频一区| 国产日韩一区二区三免费高清| 国内偷窥一区二区三区视频| 亚洲日本一区二区| 国产在线精品一区二区| 亚洲乱码一区二区三区在线观看| 国产成人无码精品一区不卡| 精品无人乱码一区二区三区| 日韩精品无码一区二区三区不卡| 日韩精品无码免费一区二区三区| 中文字幕精品一区影音先锋| 国产一区二区三区在线观看精品| 日本精品高清一区二区| 国产一区中文字幕在线观看| 中文激情在线一区二区| 精品国产一区二区三区久久影院| 国产色欲AV一区二区三区| 国产精品揄拍一区二区| 精品国产AV无码一区二区三区| 视频在线一区二区三区| 狠狠做深爱婷婷久久综合一区| 日韩十八禁一区二区久久| 国产福利电影一区二区三区久久老子无码午夜伦不 | 亚洲av色香蕉一区二区三区蜜桃| 91精品一区二区综合在线| 日韩精品无码一区二区三区免费| 人妻夜夜爽天天爽一区| 麻豆国产在线不卡一区二区| 一区二区三区在线免费观看视频| 亚洲一区二区三区AV无码| 一区二区三区国产| 日本高清不卡一区| 国产在线无码视频一区| 国产精品视频一区国模私拍| 国产伦精品一区三区视频| 中文无码AV一区二区三区| 亚洲乱码一区二区三区在线观看| 国产成人一区在线不卡| 日韩精品无码一区二区视频| 一区二区三区午夜视频| 亚洲av成人一区二区三区观看在线|