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 播放器默認是可以下載視頻的,在默認的控制器(給 video 標簽添加 controls 屬性開啟)上會有下載菜單, 即使不使用默認提示的控制器,右鍵彈出的上下文菜單中也會有保存視頻的選項。
通過 controlslist 屬性可以設置瀏覽器提供的控制器,不讓下載菜單顯示出來。controlslist 還可以設置不顯示全屏等功能同,但是瀏覽器 支持較差,尤其是移動端瀏覽器。
<video src="test.mp4" playsinline autoplay="false" controls controlslist="nodownload"></video>
將 controlslist 的值設置為 nodownload ,就不會出現下載菜單了,不過 PC 上點擊右鍵的上下文菜單的保存視頻選項仍然有用,還是很容易被下載。
如果是通過自定義樣式來控制播放暫時等操作的控制條,還可以將 video 禁右鍵或者蒙上一層 div 來阻止彈出上下文菜單,防止下載。
雖然通過 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 就可以解決這個問題。
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 這個平臺,視頻作者可以設置保護,對于需要保護的 視頻只能通過客戶端觀看,其它的視頻仍然可以網頁上直接播放。
希望可以通過這篇文章,能夠給你得到幫助。(感謝一鍵三連)
學習深入理解HTML5的audio和video。
在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,Ogg;video元素支持的格式MP4,WebM,Ogg。
在HTML5中audio和video元素提供的接口包含了一系列的屬性,方法和事件,這些接口可以幫助開發完成對音頻和視頻的操作。
那么如何在頁面中添加音頻和視頻呢?
音頻
<audio src="resources/audio.mp3">
</audio>
視頻
<video src="resources/video.mp4" width="600" height="200">
</video>
因為各種瀏覽器對音頻和視頻的編解碼器的支持不一樣,為了能夠在各種瀏覽器中正常使用,可以提供多個源文件。
<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元素替代了audio或video的標簽屬性src。
元素的標簽特性
<video src="resources/video.mp4" autoplay></video>
<video src="resources/video.mp4" controls></video>
<video src="resources/video.mp4" controls loop></video>
<video src="resources/video.mp4" controls preload="auto"></video>
<video src="resources/video.mp4" controls poster="images/none.jpg"</video>
<video src="resources/video.mp4" width="600" height="200" controls></video>
接口屬性
<!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>
接口方法
代碼示例使用接口:
<!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>
捕獲事件的方式
捕獲事件有兩種方法:一種是添加事件句柄,一種是監聽。
<video id="myPlayer" src="resources/video.mp4" width="500" onplay="video_playing()">
</video>
// 監聽方式
var videoEl = document.getElementById("myPlayer");
videoEl.addEventListener("play",video_playing);
接口事件
定義全局的視頻對象
代碼如下:
<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=true;videoEl.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及之前的版本都不支持
*請認真填寫需求信息,我們會在24小時內與您取得聯系。