這段時間一直在研究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畫到了第二個canvas上。
4.制作截圖按鈕
制作一個按鈕,然后綁定click事件,點擊后就調用上一步的函數,這樣就可以制作一個截圖了。
當圖截好后可以將圖右鍵保存下來,然后倒入ps制作表情包了。
5.demo及一些表情包。
視頻截圖:Demo;(打開之前請調小音量,點擊坐上click即可截圖)
表情包: