最近公司作一個視頻活動的HTML5頁面,頁面並不複雜,可是要求視頻播放的時候不全屏。在網上看到好論壇相似的基本問題,之前有申請白名單的,在白名單的視頻連接或者騰訊旗下的視頻連接是原生播放,不然安卓會被劫持成騰訊家的播放器播放而且默認全屏,目前經過白名單的方法是解決不了的。還好終於找到了解決辦法,下面好好整理一下。
<video id="videos" playsinline="true" poster="img/1.jpg" webkit-playsinline="true" x-webkit-airplay="true" x5-video-player-type="h5" x5-video-player-fullscreen="true"> <source src="img/output.mp4" type="video/mp4" /> </video>
也就是所謂的開啓同層播放器html
x5-video-player-type="h5" /*讓video開啓同層H5播放器*/ x5-video-player-fullscreen="true" /*設置爲 true 是防止橫屏*/ playsinline="true" 和 webkit-playsinline="true" /*這個屬性是ios中設置可讓視頻在小窗內播放*/
上面的方法試了,在ios中能夠不全屏,可是在安卓的微信中打開依然是全屏的。。。ios
視頻解碼最好用FFmpeg轉碼,能夠轉mp四、mpeg、mkv....,還能夠提取視頻中的音樂。git
mp4轉MP4github
ffmpeg -i D:\Projects\cat.mp4 -vcodec libx264 -pass 1 -coder 0 -bf 0 -flags -loop -wpredp 0 out.mp4
mkv轉MP4web
ffmpeg -i D:\Projects\cat.mkv -c:v copy -c:a copy cat.mp4
提取音樂canvas
ffmpeg -i D:\Projects\cat.mp4 -f mp3 -vn apple.mp3
mp4轉mpeg,視頻的寬度必須是2的倍數數組
ffmpeg -i D:\Projects\cat.mp4 -f mpeg1video -vf "crop=iw-mod(iw\,2):ih-mod(ih\,2)" -b 0 cat.mpg
其餘使用方法能夠到官網中查找,這裏就很少介紹了。微信
Broadway是從其餘語言翻譯而成,這個解碼器支持 mp4 後綴的視頻文件,有時候即便是手機拍攝的mp4格式的視頻也沒什麼用,最好仍是用ffmpeg再轉一下格式。視頻的地址最好是在線的地址,本地測試的時候本地視頻在iphone上播放不了。app
document.querySelector('body').addEventListener('click', function() { var player = new MP4Player(new Stream('img/cat.mp4'), false, '', 'auto'); player.play(); document.querySelector('#containerMP4').innerHTML = ''; document.querySelector('#containerMP4').appendChild(player.canvas); });
jsmpeg是一個 MPEG1 解碼器,我的以爲代碼比較輕量。iphone
var canvas = document.getElementById('canvas2'),off1 = true; var audio = document.getElementById("bgMusic"); $('#canvas2').on("click",function(e){ e.preventDefault(); if(off1){ off1 = false; document.querySelector('#loadWrap2').style.display = 'block'; var player = new jsmpeg('img/cat.mpg', { canvas: canvas, onload : function(){ document.querySelector('#loadWrap2').style.display = 'none'; player.play(); }, onfinished : function(){ off1 = true; } }); } })
以上兩種方法均可以實現視頻的不全屏播放,終於解決了一個大問題,可是對於專門作視頻開發的不知道適不適用了。
另外還有一種方法,就是將圖片轉成一個個幀了,我的以爲有點麻煩,可是對於短視頻來說也能夠採用。麻煩的就是用工具將視頻轉成圖片了。
var imgArr = [],source = {},now2 = 0,imgNum = 0,timer=null; var canvas2 = document.querySelector('#canvas2'); var videoBox = document.querySelector('.videoBox'); var view = {w : videoBox.offsetWidth,h : videoBox.offsetHeight}; canvas2.width = view.w; canvas2.height = view.h; var ctx = canvas2.getContext("2d"); ctx.clearRect(0,0,canvas2.width,canvas2.height); var audio = document.getElementById("bgMusic"); //添加圖片進數組 function pushImgArr (num) { document.querySelector('#loadWrap2').style.display = 'block'; //播放(繼續播放) audio.play(); imgArr = []; for( var i = 0;i < num;i++ ) { imgArr.push('videoImg/'+i+'.jpg'); }; imgLoad (); }; //圖片加載 function imgLoad(){ document.querySelector('#btn-play').style.display = 'none'; source['src'+now2] = new Image(); source['src'+now2].src = imgArr[now2]; source['src'+now2].onload = function(){ now2 ++ ; if( now2 > imgArr.length-1 ){ //加載成功 document.querySelector('#loadWrap2').style.display = 'none'; //執行canvas渲染 movieInit() }else{ //遞歸加載 imgLoad(); }; }; }; //canvas圖片渲染 function movieInit (){ clearInterval(timer); timer = setInterval(function(){ if( imgNum == imgArr.length ){ clearInterval(timer); //中止 audio.pause(); audio.currentTime = 0; }else{ ctx.clearRect(0,0,canvas2.width,canvas2.height); ctx.drawImage(source['src'+imgNum],0,0,view.w,view.h); imgNum++; }; },60); }; //按鈕點擊開始播放 document.querySelector('.playBtn2').onclick = function(){ pushImgArr(30); };