移動(dòng)端瀏覽器視頻自動(dòng)播放

在手機(jī)里做到視頻自動(dòng)播放

遇到的問題

1,video標(biāo)簽里有個(gè)autoplay的屬性。在pc端可以實(shí)現(xiàn)自動(dòng)播放。但是在移動(dòng)端,為了避免浪費(fèi)流量。自動(dòng)播放幾乎被禁止。需要用戶手動(dòng)觸發(fā)。

chrome官方:https://developers.google.com/web/updates/2017/09/autoplay-policy-changes

2,即使播放video視頻,也會(huì)出現(xiàn)很多問題。比如全屏播放、控制條無(wú)法隱藏。全屏影響交互,控制條很不美觀。

如何解決

方案一:canvas繪制video

用canvas繪制video,利用requestAnimationFrame,將視頻每一幀繪制成canvas。

以下為demo。(不屬于業(yè)務(wù)代碼和公司內(nèi)部文件,視頻選自w3cschool)可以模擬點(diǎn)擊進(jìn)行觸發(fā)。(假裝實(shí)現(xiàn)自動(dòng)播放。)

<!DOCTYPE html>

<html>

<head>

<title></title>

</head>

<body style="height:2000px">

<video id="video" controls loop width='300' autoplay webkit-playsinline="true" src='http://www.w3school.com.cn/example/html5/mov_bbb.mp4'></video>

<p>

? <button type="button" id='btn-play'>開始</button>

? <button type="button" id='btn-pause'>暫停</button>

</p>

</body>

<script type="text/javascript">

/*

* video視頻轉(zhuǎn)成canvas(兼容至IE8+)

* Author: shaojiancong@baidu.com

*

*? 使用方法:

*? ? ? var videoCanvas = new VideoToCanvas(videoDom);

*

*? 對(duì)象的屬性:

*? ? ? 暫無(wú)。

*

*? 對(duì)象的方法:

*? ? ? play? ? ? 播放視頻

*? ? ? pause? ? ? 暫停視頻

*? ? ? playPause? 播放或暫停視頻

*? ? ? change(src) 切換視頻。參數(shù)src為切換的視頻地址

*/

var VideoToCanvas = (function(window, document) {

? function VideoToCanvas(videoElement) {

? ? if(!videoElement) {return;}

? ? var canvas = document.createElement('canvas');

? ? canvas.width = videoElement.offsetWidth;

? ? canvas.height = videoElement.offsetHeight;

? ? ctx = canvas.getContext('2d');

? ? var newVideo = videoElement.cloneNode(false);

? ? var timer = null;

? ? var requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame ||

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? window.webkitRequestAnimationFrame || window.msRequestAnimationFrame;

? ? var cancelAnimationFrame = window.cancelAnimationFrame || window.mozCancelAnimationFrame;

? ? function drawCanvas() {

? ? ? ctx.drawImage(newVideo, 0, 0, canvas.width, canvas.height);

? ? ? timer = requestAnimationFrame(drawCanvas);

? ? }

? ? function stopDrawing() {

? ? ? cancelAnimationFrame(timer);

? ? }

? ? newVideo.addEventListener('play', function() {

? ? ? drawCanvas();

? ? },false);

? ? newVideo.addEventListener('pause', stopDrawing, false);

? ? newVideo.addEventListener('ended', stopDrawing, false);

? ? videoElement.parentNode.replaceChild(canvas, video);

? ? this.play = function() {

? ? ? newVideo.play();

? ? };

? ? this.pause = function() {

? ? ? newVideo.pause();

? ? };

? ? this.playPause = function() {

? ? ? if(newVideo.paused) {

? ? ? ? this.play();

? ? ? } else {

? ? ? ? this.pause();

? ? ? }

? ? };

? ? this.change = function(src) {

? ? ? if(!src) {return;}

? ? ? newVideo.src = src;

? ? };

? ? this.drawFrame = drawCanvas;

? }

? return VideoToCanvas;

})(window, document);

</script>

<script>

var video = document.getElementById('video');

var canvasVideo = new VideoToCanvas(video);

//模擬click事件

//獲取btn

var btn = document.querySelector("#btn-play");

//創(chuàng)建event

var event = document.createEvent("MouseEvents");

// //初始化event

event.initMouseEvent("click",true,true,document.defaultView,0,0,0,0,0,false,false,false,false,0,null);

//click事件綁定事件處理程序

btn.onclick = function () {

? ? canvasVideo.play();

}

//觸發(fā)事件,一定要延遲觸發(fā),等到視頻加載完成之后。

setTimeout(function(){

btn.dispatchEvent(event);

},2000)

//取消引用

btn.onclick = null;

document.querySelector('body').addEventListener('touchend',function(){

canvasVideo.play();

})

document.getElementById('btn-play').addEventListener('click', function() {

? canvasVideo.play();

}, false);

document.getElementById('btn-pause').addEventListener('click', function() {

? canvasVideo.pause();

},false)

</script>

</html>

方案二:將用戶上傳的video,轉(zhuǎn)化成gif,前端用gif圖展示動(dòng)態(tài)效果。

參考:https://jnordberg.github.io/gif.js/

這樣在移動(dòng)端瀏覽器展示的時(shí)候可以實(shí)現(xiàn)滾動(dòng)到某一位置,實(shí)現(xiàn)動(dòng)態(tài)播放。

還有一個(gè)問題,判斷網(wǎng)絡(luò)鏈接狀態(tài)

是wifi,還是蜂窩數(shù)據(jù)。

我看了一下官方文檔Network Information API,目前大部分瀏覽器還沒有實(shí)現(xiàn)。navigator.connection。

所以如果:

1,蜂窩數(shù)據(jù)下不播放,Wi-Fi下才播放:只能在客戶端才可以,通過(guò)jsbridge獲取網(wǎng)絡(luò)狀態(tài)。

2,如果網(wǎng)速ok就播放,網(wǎng)速慢不播放:采用下載一個(gè)指定圖片,檢測(cè)下載速度。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容