濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > video結(jié)合canvas實(shí)現(xiàn)視頻在線截圖功能

video結(jié)合canvas實(shí)現(xiàn)視頻在線截圖功能

熱門標(biāo)簽:濟(jì)南辦理400電話 ai電銷機(jī)器人連接網(wǎng)關(guān) 鄭州電銷外呼系統(tǒng)違法嗎 農(nóng)村住宅地圖標(biāo)注 威海營(yíng)銷外呼系統(tǒng)招商 漳州人工外呼系統(tǒng)排名 中紳電銷智能機(jī)器人 跟電銷機(jī)器人做同事 鶴壁手機(jī)自動(dòng)外呼系統(tǒng)怎么安裝

給大家講解下我前幾天看到的一個(gè)有趣小demo:視頻在線截圖。以下是我修改和添加了新功能后的效果圖:

 

是不是很酷,其實(shí)挺簡(jiǎn)單的,下面就給大家講講怎么弄哈。

這里主要分為三大塊功能,首先是第一個(gè):

利用URL對(duì)象獲取視頻鏈接并展示:

js的URL對(duì)象有個(gè) createObjectURL 方法,它可以獲取一個(gè)文件(File對(duì)象)的url,然后插入到 video 元素的 src 特性中,這樣就可以實(shí)現(xiàn)視屏的展示了。當(dāng)然如何獲取File對(duì)象呢,方法有種,比如使用input元素,或者使用拖動(dòng)的方式。一個(gè)完整的代碼段:

<input type="file"/>
document.querySelector('input[type="file"]').addEventListener('change',function () {
    document.querySelector('video').src = window.URL.createObjectURL(this.files[0])
})

當(dāng)然源碼中我并不是這樣寫的,僅僅是為了給大家一個(gè)演示而已。關(guān)于URL更加具體的使用,大家可以看看這篇文章或者M(jìn)DN。

利用canvas實(shí)現(xiàn)視頻截圖:

接下來(lái)就是關(guān)鍵步驟了,但也很簡(jiǎn)單,那就是使用 canvas 的 drawImage 方法,大家如果翻到高程三的第15.2.6節(jié),就會(huì)發(fā)現(xiàn) drawImage 的方法的使用描述得非常詳細(xì),但漏講了一個(gè),那就是 video 元素也可傳入 drawImage 方法中,并且繪制圖形。具體代碼段:

var canvas = document.createElement("canvas");
var canvasCtx = canvas.getContext("2d");
var video=document.querySelector('video');
//坐原圖像的x,y軸坐標(biāo),大小,目標(biāo)圖像的x,y軸標(biāo),大小。
canvasCtx.drawImage(video, 0, 0, videoWidth, videoHeight, 0, 0, imgWidth, imgHeight);
//把圖標(biāo)base64編碼后變成一段url字符串
var dataUrl = canvas.toDataURL("image/png");
//插入圖片得src特性中
document.createElement('img').src=dataUrl;

繪制完成圖像后,再調(diào)用 canvas 的 toDataURl 方法把圖像變成 base64 編碼的url,就可插入到 img 元素中展示,一個(gè)縮略的圖的制作便完成了。關(guān)于圖片和base64的關(guān)系,具體的同學(xué)們可以看下這篇文章。

實(shí)現(xiàn)動(dòng)畫效果:

該動(dòng)畫實(shí)現(xiàn)的主要原理是:先在視頻原處創(chuàng)建一張大小和視頻一致的大圖片,設(shè)置為絕對(duì)布局( position:absolut ),在實(shí)際放置縮略圖處創(chuàng)建一張小圖片,設(shè)置為不可見(jiàn)( visibility:hidden ),然后大圖片通過(guò) left 和 top 實(shí)現(xiàn)位移, width 和 height 實(shí)現(xiàn)縮小,至實(shí)際放置縮略圖處,并形成動(dòng)畫效果。最后大圖片刪除,小圖片顯示即可。具體代碼段:

function getOffset(elem) {
    var pos = {x: elem.offsetLeft, y: elem.offsetTop};
    var offsetParent = elem.offsetParent;
    while (offsetParent) {
        pos.x += offsetParent.offsetLeft;
        pos.y += offsetParent.offsetTop;
        offsetParent = offsetParent.offsetParent;
    }
    return pos;
}

該函數(shù)是獲取小圖片距viewport(視口)的距離,并提供給大圖片作為位移參數(shù)的,高程三的12.2.3節(jié)有段幾乎一模一樣的代碼,并附有詳細(xì)說(shuō)明,以及替代方案 getBoundingClientRect 函數(shù)也有提到,具體的大家翻書看看哈。

下面的代碼便是創(chuàng)建大圖片和小圖片并實(shí)現(xiàn)動(dòng)畫效果了。為了方便易懂,我這兒使用了JQuery

var $imgBig = $("<img/>");
//設(shè)置大圖片的初始位置,就是原視頻處。
$imgBig.css({
    position: "absolute",
    left: video.offsetLeft,
    top: video.offsetTop,
    width: video.offsetWidth+ "px",
    height: video.offsetHeight+ "px"
}).attr("src", dataUrl);
var $img = $("<img/>");
$img.hide();
//獲取小圖片的距離參數(shù),實(shí)現(xiàn)大圖片的動(dòng)畫效果。
var offset = getOffset($img[0]);
//添加動(dòng)畫效果
$imgBig.animate({
    left: offset.x + "px",
    top: offset.y + "px",
    width: $img.width() + "px",
    height: $img.height() + "px"
}, 500, function () {
    $img.show();
    $imgBig.remove();
});

 

恩恩,主要的代碼部分到這就講完啦,當(dāng)然具體的實(shí)現(xiàn)還有很多細(xì)節(jié)上的問(wèn)題以及其他的功能可能沒(méi)有展示,我就不一一說(shuō)明了,具體的大家看完源碼后可以再提問(wèn)。

下面是我的源碼地址,大家可以試試哈:

在github上的demo

總結(jié)

以上所述是小編給大家介紹的video結(jié)合canvas實(shí)現(xiàn)視頻在線截圖功能,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

標(biāo)簽:咸陽(yáng) 營(yíng)口 甘南 紅河 惠州 蘇州 萍鄉(xiāng) 文山

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《video結(jié)合canvas實(shí)現(xiàn)視頻在線截圖功能》,本文關(guān)鍵詞  video,結(jié)合,canvas,實(shí)現(xiàn),視頻,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《video結(jié)合canvas實(shí)現(xiàn)視頻在線截圖功能》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于video結(jié)合canvas實(shí)現(xiàn)視頻在線截圖功能的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    浙江省| 三亚市| 陵川县| 岑溪市| 甘洛县| 鹤庆县| 枣阳市| 永吉县| 阜平县| 丽江市| 四子王旗| 永宁县| 太仓市| 客服| 赤峰市| 余干县| 封丘县| 图们市| 西平县| 邛崃市| 巴东县| 西峡县| 西华县| 龙海市| 资兴市| 广饶县| 大庆市| 桑植县| 阜城县| 屯门区| 邵阳县| 德化县| 米泉市| 澄迈县| 科技| 湖南省| 德钦县| 昌平区| 辽中县| 田阳县| 石渠县|