canvas與html5實現視訊截圖功能
這段時間一直在研究canvas,突發奇想想做一個可以截圖視訊的功能,然後把圖片拉去做表情包,哈哈哈哈哈哈~~
製作方法:
1.在頁面中載入視訊
在使用canvas製作這個截圖功能時,首先必須保證頁面上已經載入完成了這個視訊,這樣才能夠方便的對其操作。如果使用下面直接嵌入<video>標籤的方式:
1 2 3 4 5 |
<video
loop controls id= "testmp4" width= "500" height= "400" >
<source
src= "test.mp4" type= "video/mp4" >
<source
src= "test.webm" type= "video/webm" >
<source
src= "test.ogg" type= "video/ogg" >
</video>
|
在我的那篇《html5與視訊》中講到,瀏覽器對視訊的預載入progress以及load事件支援不同,會影響video的播放及其他事件的觸發。所以我們在這裡使用js構造video的方式來引入視訊。
這種方式引入視訊要注意,不能引入多個source,所以要先判斷瀏覽器對視訊格式的支援。
1.1使用video的canPlayType()方法判斷支援格式
canPlayType()方法需要傳入一個引數,這個引數就是video的格式,
常用值:video/ogg;
video/mp4;
video/webm;
或者包括編碼器:
video/ogg;codecs="theora,vorbis"
video/mp4;codecs="avc1.4D401E, mp4a.40.2"
video/webm;codesc="vp8.0, vorbis"
返回值:表示網頁的支援級別:"probably"-最有可能支援(輸入值帶編碼器的時候只返回這個);"maybe" - 可能支援;"" - (空字串)不支援;
1 2 3 4 5 |
function
videoType(video){ var
returnType= '' ;
if(video.canPlayType( 'video/mp4' )== 'probably' ||video.canPlayType( 'video/mp4' )== 'maybe' ){
returnType= 'mp4' ;
}else
if(video.canPlayType( 'video/ogg' )== 'probably' ||video.canPlayType( 'video/ogg' )== 'maybe' ){<br>
returnType= 'ogg' ;
<br> }else if(video.canPlayType( 'video/webm' )== 'probably' ||video.canPlayType( 'video/webm' )== 'maybe' ){<br>
returnType= 'webm' ;
<br> }<br> return returnType;
|
1 |
}
|
這個函式可以判斷瀏覽器對video支援的格式。
1.2使用js動態載入video標籤
這裡判斷了瀏覽器的支援格式後,由於我用的是chrome,所以我的瀏覽器支援mp4格式的視訊,然後我們動態建立一個video標籤。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
var
videoElem;
var
videoDiv;
function
createVideo(){
videoElem=document.createElement( "video" );//建立video
videoDiv=document.getElementById( "videopanel" );//獲取video的外層容器
videoDiv.appendChild(videoElem);
var
vtype=videoType(videoElem);//判斷瀏覽器支援的格式
if(vtype== "" ){
videoDiv.innerHtml( '不支援video' )
}else{
videoElem.setAttribute( 'src' , "text." +vtype);
}
}
|
由於這裡我們要製作截圖功能,單純的video不具備截圖的介面,所以我們要把它複製到canvas上,在canvas上播出這個視訊,所以這裡我們先把video給隱藏掉(display:none)。
2.使用canvas複製視訊
現在video已經在瀏覽器上播放了,接下來我們把它複製到canvas裡,首先建立canvas,然後得到畫布context,這些就不說了。如何把video畫在canvas上,這裡我們要使用一個函式。drawImage函式的用法
1.drawImage(img,x,y):在畫布的(x,y)這個位置畫一個img;
2.drawImage(img,x,y,width,height):在畫布的(x,y)這個位置畫一個width寬,height高的img;
3.drawImage(img,sx,sy,swidth,sheight,x,y,width,height):在畫布的(x,y)位置畫一個img的(sx,sy)位置的swidth寬,sheight高的一塊截圖,畫在畫布上要縮放到width寬和height高。
以上就是drawImage的用法了,這個函式非常的強大。
回到做截圖,我們現在已經在瀏覽器上建立好了畫布--contextVideo,接著我們在這裡把視訊畫出來:
contextVideo.drawImage(videoElem,0,0);
然後我們可以看到在canvas裡畫了一張圖,但是視訊是不斷變化的,所以我們需要使用setInterval函式不斷的吧video作為源來畫圖。
1 |
setInterval(function(){<br>
contextVideo,drawImage(videoElem, 0 , 0 );<br>}, 100 )
|
這裡時間間隔的大小會影響到視訊播放是否會卡。
到這裡我們就把video搬到canvas上展示了。接下來製作截圖。
3.製作截圖展示canvas面板
這裡我們需要再在頁面上畫一個canvas畫布--contextImg,然後再次利用drawImage方法,截圖。
1 |
contextImg.drawImage(canvasVideo, 0 , 0 ,canvasVideo.width,canvasVideo.height);
|
這段程式碼將第一個canvas畫到了第二