fiv.js實(shí)現(xiàn)flv文件blob流實(shí)時(shí)播放的項(xiàng)目實(shí)踐
一、前言
最近遇到個(gè)需求,有個(gè)監(jiān)控視頻需要在網(wǎng)頁實(shí)時(shí)播放,后臺(tái)提供了flv流、m3u8流和rtmp流。
我一聽,這不是小事一樁,前兩年才做過的需求,就隨口應(yīng)了下來。
二、 過程
1、開端
說到實(shí)時(shí)播放,一般都是想到rtmp流,隨便一搜帖子(忘記看帖子時(shí)間了),就能看到以下兩個(gè)插件。
cnpm install video-js -S cnpm install videojs-flash -S
跟我印象中之前用的一模一樣。
簡(jiǎn)單瀏覽了下帖子的使用過程,我就打算動(dòng)手敲了。
2、出師不利
video-js還是能正常下載的,但到了video-js-flash就一直下載失敗了。
這時(shí)我突然想起2020年12月,谷歌就不再支持flash插件了,這導(dǎo)致許多基于flash實(shí)現(xiàn)的視頻流播放插件都失效,vue-video-player和vue-flash首當(dāng)其沖。
3、峰回路轉(zhuǎn)--參考舊項(xiàng)目
由于項(xiàng)目后臺(tái)給我們提供了三種視頻流,所以我們的選擇也比較多。
同時(shí)因?yàn)槭莏sp舊項(xiàng)目改造成vue項(xiàng)目,我就想看看之前用的是什么插件,原來是flv.js。
這不就是小破站用的技術(shù)嗎,純js開發(fā),沒用到flash,這兼容性肯定更好吧。
4、flv.js
確定了所用插件,接下來的步驟就比較簡(jiǎn)單了,無非就是下載,引入,看例子寫法照著抄就可以了。
cnpm i flv.js
下面提供一下demo,demo里是多個(gè)flv流多窗口播放的方式,如果只有一個(gè)flv需求播放,就簡(jiǎn)化一下就可以了,其他大家隨便看看吧。
<template>
<div>
<div id="video-container">
<div class="video-box" v-for="(video,index) in videoList" :key="index">
<video :id="'video'+index" ref="videoElement" controls autoplay muted ></video>
</div>
</div>
</div>
</template>
<script>
import flvjs from 'flv.js'
export default {
data() {
return {
videoPlayer: null,
videoList: [
{
src: 'flv視頻流地址'
}
]
};
},
mounted() {
this.playVideo()
},
methods: {
playVideo(){
this.vloading = true;
this.videoList.forEach((item,index) => {
if (flvjs.isSupported()) {
let player = null;
let videoElement = document.getElementById("video" + index);
player = flvjs.createPlayer({
type: "flv", //=> 媒體類型 flv 或 mp4
isLive: true, //=> 是否為直播流
hasAudio: false, //=> 是否開啟聲音
url: item.src, //=> 視頻流地址
});
player.attachMediaElement(videoElement); //=> 綁DOM
player.load();
player.play();
} else {
this.$message.error('不支持flv格式視頻')
}
this.vloading = false;
})
},
},
};
</script>
<style lang="scss" scoped>
#video-container {
}
</style>5、hls.js
業(yè)務(wù)是完成了,后續(xù)我也看了一下m3u8視頻流的播放。
1.M3U8文件是指UTF-8編碼格式的M3U文件。M3U文件是記錄了一個(gè)索引純文本文件,打開它時(shí)播放軟件并不是播放 它,而是根據(jù)它的索引找到對(duì)應(yīng)的音視頻文件的網(wǎng)絡(luò)地址進(jìn)行在線播放。
2.HLS 與 M3U8 HLS(全稱:Http Live Streaming)是由Apple公司定義的用于實(shí)時(shí)流傳輸?shù)膮f(xié)議
3.vue項(xiàng)目可采用的hls.js插件+video標(biāo)簽的形式。
原生video標(biāo)簽播放不了,但是我們可以借助hls.js的幫助,實(shí)現(xiàn)這個(gè)功能。
cnpm i -s hls.js
過程也是比較簡(jiǎn)單的,video標(biāo)簽提供一個(gè)ref,可供綁定選擇元素就可以了,其他無所謂,hls.js會(huì)出手。
下面是源碼,挑著用就行了
<template>
<section>
<video class="full-height full-width" ref="video" controls></video>
</section>
</template>
<script>
let Hls = require('hls.js');
export default {
data() {
return {
hls: '',
src: 'm3u8視頻流地址'
};
},
mounted() {
this.getStream(src)
},
methods: {
videoPause() {
if (this.hls) {
this.$refs.video.pause();
this.hls.destroy();
this.hls = null;
}
},
getStream(source) {
if (Hls.isSupported()) {
this.hls = new Hls();
this.hls.loadSource(source);
this.hls.attachMedia(this.$refs.video);
this.hls.on(Hls.Events.MANIFEST_PARSED, () => {
console.log('加載成功');
this.$refs.video.play();
});
this.hls.on(Hls.Events.ERROR, (event, data) => {
// console.log(event, data);
// 監(jiān)聽出錯(cuò)事件
console.log('加載失敗');
});
}
},
beforeDestroy() {
this.videoPause();
}
}
};
</script>6、rtmp流
基本上rtmp流都是需要flash環(huán)境才能播放了,目前市面上的插件可能有部分插件還支持,但是一般都是需要指定瀏覽器,兼容性極差。
也有一種方案是自行搭建服務(wù)器,服務(wù)器轉(zhuǎn)碼變成圖片,一幀一幀傳給網(wǎng)頁端,缺點(diǎn)是沒有聲音。
可能還有其他方案吧,暫時(shí)沒太深究就不得而知了,歡迎討論。
最后
到此這篇關(guān)于fiv.js實(shí)現(xiàn)flv文件blob流實(shí)時(shí)播放的項(xiàng)目實(shí)踐的文章就介紹到這了,更多相關(guān)flv文件blob流實(shí)時(shí)播放內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
js一般方法改寫成面向?qū)ο蠓椒ǖ臒o限級(jí)折疊菜單示例代碼
本例是應(yīng)用別人的例子,原來那位老兄是用一般方法寫成的無限級(jí)折疊菜單,通過了一些簡(jiǎn)化修改,將原來的例子改成了面向?qū)ο蟮姆绞?/div> 2013-07-07
JavaScript移除數(shù)組元素減少長(zhǎng)度的方法
數(shù)組想必大家對(duì)它并不陌生吧,有些新手朋友們都不知道如何移除數(shù)組元素,下面為大家介紹個(gè)示例,喜歡的朋友可以了解下2013-09-09
JS 驗(yàn)證碼功能的三種實(shí)現(xiàn)方式
這篇文章主要介紹了驗(yàn)證碼功能的三種實(shí)現(xiàn)方式,分為數(shù)字短信驗(yàn)證碼,圖形驗(yàn)證碼,滑動(dòng)驗(yàn)證碼,本文通過示例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-11-11
javascript搜索自動(dòng)提示功能的實(shí)現(xiàn)
使用 jQuery(Ajax)/PHP/MySQL實(shí)現(xiàn)自動(dòng)完成功我覺得我有必要寫這個(gè)教程,因?yàn)樵?jīng)見到的大部分關(guān)于自動(dòng)完成的應(yīng)用程序都只是給你一個(gè)程序源碼包,然后告訴你怎么使用,而不是告訴你它是如何工作的以及為什么這樣做。2008-06-06
JS實(shí)現(xiàn)給數(shù)組對(duì)象排序的方法分析
這篇文章主要介紹了JS實(shí)現(xiàn)給數(shù)組對(duì)象排序的方法,結(jié)合實(shí)例形式分析了javascript數(shù)組對(duì)象排序相關(guān)實(shí)現(xiàn)方法與操作注意事項(xiàng),需要的朋友可以參考下2019-06-06最新評(píng)論

