vue需求,視頻截取第幾幀做為視頻封面

最近公司的公眾號(hào)H5頁(yè)面出了一個(gè)需求,因?yàn)榭梢栽诠芾砗笈_(tái)去動(dòng)態(tài)添加一些圖片視頻文字的,要在這個(gè)H5頁(yè)面顯示出來(lái),其中涉及到了視頻封面,說(shuō)截取第一幀,變成圖片去做視頻封面.下面我們來(lái)看一看

  • 做需求前,我們先理清一下思路,首先是H5頁(yè)面,可以去使用video標(biāo)簽,因?yàn)槲业捻?xiàng)目是后臺(tái)返回一串視頻的鏈接地址,所以是視頻地址,然后可以使用canvas標(biāo)簽去繪畫我們的第一幀.

下面我寫了一個(gè)小demo

<template>
    <div>
        <video ref="myvideo" :poster="imgUrl" controls :src="videoUrl"></video>
        <img ref="myimg" :src="imgUrl" alt="" style="width: 640px;height: 368px;">
    </div>
</template>

video里的poster是視頻封面的屬性,因?yàn)槲业氖莿?dòng)態(tài)的,視頻是直接從后天去獲取的,所以不固定,使用了v-bind,
img我是用來(lái)測(cè)試視頻封面的
接下來(lái)是JavaScript代碼

<script>
export default {
    data () {
        return {
            videoUrl: 'https://xxx/178e29bd-f544-4a9e-8dcf-136a91fccd2e.mp4',
            imgUrl: ''
        }
    },
    created() {
        this.getVideoBase64(this.videoUrl);
    },
    methods: {
        getVideoBase64(url) {
            let dataURL = '';
            let video = document.createElement("video");
            video.setAttribute('crossOrigin', 'anonymous');//處理跨域
            video.setAttribute('src', url);
            video.setAttribute('width', 400);
            video.setAttribute('height', 240);
            video.currentTime = 200; // 這里是截取第幾幀,因?yàn)槲业牡谝粠呛谏?所以截取了第200幀
            video.addEventListener('loadeddata', function () {
                let canvas = document.createElement("canvas"),
                let width = video.width, //canvas的尺寸和圖片一樣
                let height = video.height;
                canvas.width = width;
                canvas.height = height;
                canvas.getContext("2d").drawImage(video, 0, 0, width, height); //繪制canvas
                dataURL = canvas.toDataURL('image/jpeg'); //轉(zhuǎn)換為base64
                this.imgUrl = dataURL;
                console.log(this.imgUrl);
            });
        }
    }
};
</script>

視頻鏈接https://xxx/4a9e-8dcf-136a91fccd2e.mp4這個(gè)你們可以用自己的,

仔細(xì)看上面的代碼,恭喜你! 出錯(cuò)了...


image.png
image.png

image.png

可以看到,我canvas是畫出來(lái)了,鏈接也生成了,但是img標(biāo)簽不顯示,img標(biāo)簽的src屬性顯示unknown,
關(guān)于這個(gè)問(wèn)題,我上網(wǎng)查了,說(shuō)使用this.$refs或者使用require(),但是這個(gè)經(jīng)過(guò)我三個(gè)小時(shí)的麒麟臂,找到了問(wèn)題,基本上出現(xiàn)這個(gè)問(wèn)題都是,你動(dòng)態(tài)綁定的src屬性的值是空,所以加個(gè)延時(shí)器就好了,或者是把addEventListenerfunction改成箭頭函數(shù)

延時(shí)器
        getVideoBase64(url) {
            let dataURL = '';
            let video = document.createElement("video");
            video.setAttribute('crossOrigin', 'anonymous');//處理跨域
            video.setAttribute('src', url);
            video.setAttribute('width', 640);
            video.setAttribute('height', 368);
            video.currentTime = 200;
            video.addEventListener('loadeddata', function () {
                let canvas = document.createElement("canvas"),
                let width = video.width, //canvas的尺寸和圖片一樣
                let height = video.height;
                canvas.width = width;
                canvas.height = height;
                canvas.getContext("2d").drawImage(video, 0, 0, width, height); //繪制canvas
                dataURL = canvas.toDataURL('image/jpeg'); //轉(zhuǎn)換為base64
                // console.log(dataURL)
                this.imgUrl = dataURL;
                // console.log(this.imgUrl)
            });
            setTimeout(() => {
                this.$refs.myimg.src = dataURL;
                this.$refs.myvideo.poster = dataURL;
            }, 3000)
        }
下面是完整代碼(使用箭頭函數(shù))
<template>
    <div>
        <video ref="myvideo" :poster="imgUrl" controls :src="videoUrl"></video>
        <img ref="myimg" :src="imgUrl" alt="" style="width: 640px;height: 368px;">
    </div>
</template>

<script>
export default {
    data () {
        return {
            videoUrl: 'https://xxx/178e29bd-f544-4a9e-8dcf-136a91fccd2e.mp4',
            imgUrl: ''
        }
    },
    created() {
        this.getVideoBase64(this.videoUrl);
    },
    methods: {
        getVideoBase64(url) {
            let dataURL = '';
            let video = document.createElement("video");
            video.setAttribute('crossOrigin', 'anonymous');//處理跨域
            video.setAttribute('src', url);
            video.setAttribute('width', 640);
            video.setAttribute('height', 368);
            video.currentTime = 200;
            video.addEventListener('loadeddata', () => {
                let canvas = document.createElement("canvas"),
                let width = video.width, //canvas的尺寸和圖片一樣
                let height = video.height;
                canvas.width = width;
                canvas.height = height;
                canvas.getContext("2d").drawImage(video, 0, 0, width, height); //繪制canvas
                dataURL = canvas.toDataURL('image/jpeg'); //轉(zhuǎn)換為base64
                this.imgUrl = dataURL;
                // 使用箭頭函數(shù)就沒(méi)必要使用this.$refs
                // this.$refs.myimg.src = dataURL;
                // this.$refs.myvideo.poster = dataURL;
            });
        }
    }
};
</script>

效果圖


image.png

好了,今天的就到這里了,如果有幫助到你,請(qǐng)動(dòng)動(dòng)你的小指頭,按一下鼠標(biāo),給我點(diǎn)個(gè)贊吧,謝謝ε=ε=ε=(#>д<)?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末谍失,一起剝皮案震驚了整個(gè)濱河市锉矢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌陆赋,老刑警劉巖烦衣,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異币砂,居然都是意外死亡建峭,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門决摧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)亿蒸,“玉大人,你說(shuō)我怎么就攤上這事掌桩”咚” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵波岛,是天一觀的道長(zhǎng)茅坛。 經(jīng)常有香客問(wèn)我则拷,道長(zhǎng)贡蓖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任煌茬,我火速辦了婚禮斥铺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘坛善。我一直安慰自己晾蜘,他們只是感情好邻眷,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著剔交,像睡著了一般肆饶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上岖常,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天驯镊,我揣著相機(jī)與錄音,去河邊找鬼腥椒。 笑死阿宅,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的笼蛛。 我是一名探鬼主播洒放,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼滨砍!你這毒婦竟也來(lái)了往湿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤惋戏,失蹤者是張志新(化名)和其女友劉穎领追,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體响逢,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绒窑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了舔亭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片些膨。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖钦铺,靈堂內(nèi)的尸體忽然破棺而出订雾,到底是詐尸還是另有隱情,我是刑警寧澤矛洞,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布洼哎,位于F島的核電站,受9級(jí)特大地震影響沼本,放射性物質(zhì)發(fā)生泄漏噩峦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一抽兆、第九天 我趴在偏房一處隱蔽的房頂上張望壕探。 院中可真熱鬧,春花似錦郊丛、人聲如沸李请。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)导盅。三九已至,卻和暖如春揍瑟,著一層夾襖步出監(jiān)牢的瞬間白翻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工绢片, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留滤馍,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓底循,卻偏偏與公主長(zhǎng)得像巢株,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子熙涤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容