使用vue-video-player實(shí)現(xiàn)直播的方式
課前準(zhǔn)備:直播流協(xié)議https://www.cnblogs.com/yangchin9/p/14930874.html
摘要:在H5頁面實(shí)現(xiàn)觀看直播+視頻回放;在開發(fā)期間使用過video.js、mui-player等插件,發(fā)現(xiàn)這些video插件對(duì)移動(dòng)端的兼容性都不友好,最后發(fā)現(xiàn)一個(gè)在移動(dòng)端兼容不錯(cuò)的插件——vue-video-player
場(chǎng)景:
移動(dòng)端H5頁面,項(xiàng)目是vue搭建的,使用的是HLS協(xié)議以m3u8結(jié)尾的直播流
一、安裝vue-video-player
播放HLS視頻流需要安裝 videojs-contrib-hls插件,播放RTMP視頻流則安裝 videojs-flash插件,hls插件與flash插件同時(shí)使用時(shí)flash插件需要在hls插件之前引入;(資料上講安裝vue-video-player時(shí)會(huì)自動(dòng)安裝hls插件,實(shí)際操作中并沒有,還是自己手動(dòng)安裝吧?。?/p>
安裝方式1:
CDN方式,直接在html文件頭部引入文件: <link rel="stylesheet" href="path/to/video.js/dist/video-js.css"/> <script type="text/javascript" src="path/to/video.min.js"></script> <script type="text/javascript" src="path/to/vue.min.js"></script> <script type="text/javascript" src="path/to/dist/vue-video-player.js"> </script> <script type="text/javascript"> Vue.use(window.VueVideoPlayer) </script>
安裝方式2:
點(diǎn)擊查看代碼
NMP安裝插件:
npm install vue-video-player --save
npm install videojs-contrib-hls --save
main.js中引入基礎(chǔ)樣式文件:
// 引入videoPlayer樣式
import 'video.js/dist/video-js.css'
按需引入:
import 'videojs-contrib-hls'
import { videoPlayer } from 'vue-video-player'
components: {
videoPlayer
},
全局引入:
import Vue from 'vue'
import VueVideoPlayer from 'vue-video-player'
// 自定義樣式引入,在<video-player>添加對(duì)應(yīng)類名,例如video-player-custom
// import 'vue-video-player/src/custom-theme.css'
Vue.use(VueVideoPlayer, /* {
options: 全局默認(rèn)配置,
events: 全局videojs事件
}*/)二、使用 vue-video-player
<template>
<!-- playsinline:設(shè)置播放器在移動(dòng)設(shè)備上不全屏[ Boolean, default: false ] -->
<!-- customEventName:自定義狀態(tài)變更時(shí)的事件名[ String, default: 'statechanged' ] -->
<video-player
class="video-player-custom"
ref="videoPlayer"
:options="playerOptions"
:playsinline="true"
customEventName="customstatechangedeventname"
@play="onPlayerPlay"
@pause="onPlayerPause"
@ended="onPlayerEnded"
@ready="playerReadied"
@statechanged="playerStateChanged"
@playing="onPlayerPlaying"
@waiting="onPlayerWaiting"
@loadeddata="onPlayerLoadeddata"
@timeupdate="timeupdate"
@canplay="onPlayerCanplay"
@canplaythrough="onPlayerCanplaythrough">
</video-player>
</template>
<script>
import 'videojs-contrib-hls'
import { videoPlayer } from 'vue-video-player'
export default {
components: {
videoPlayer
},
data() {
return {
playerOptions: {
// 是否靜音
muted: true,
// 默認(rèn)為英語,設(shè)置為中文
language: 'zh-CN',
// 播放速度,指定后Video.js將顯示一個(gè)控件(vjs-playback-rate類的控件),允許用戶選擇播放速度
playbackRates: [0.5, 1.0, 1.5, 2.0],
// 將播放器置于流暢模式,并在計(jì)算播放器的動(dòng)態(tài)大小時(shí)使用該值,表示長(zhǎng)寬比例
aspectRatio: '4:3',
// 兼容順序,默認(rèn)值是['html5'],其他已注冊(cè)的技術(shù)將按其注冊(cè)的順序在該技術(shù)之后添加。
techOrder: ['html5'],
// 等同于原生<video>標(biāo)簽中的一組<source>子標(biāo)簽,可實(shí)現(xiàn)優(yōu)雅降級(jí);type 屬性規(guī)定媒體資源的 MIME 類型
sources: [
//{
//type: "video/mp4",
//src: ""
//},
//{
//type: "rtmp/flv",
//src: ""
//},
{
type: "application/x-mpegURL",
src: "https://live.cgtn.com/1000/prog_index.m3u8"
},
],
// 視頻封面
poster: require('./icon/cover.jpg'),
}
}
},
computed: {
//插件節(jié)點(diǎn) 用于添加自定義按鈕事件
player() {
return this.$refs.videoPlayer.player
}
},
mounted() {},
methods: {
// 播放回調(diào)
onPlayerPlay(player) {
},
// 暫?;卣{(diào)
onPlayerPause(player) {
//console.log(player)
},
// 視頻播放結(jié)束回調(diào)
onPlayerEnded(player) {
//console.log(player)
},
// DOM元素上的readyState更改導(dǎo)致播放停止
onPlayerWaiting(player) {
//console.log(player)
},
// 已開始播放回調(diào)
onPlayerPlaying(player) {
//console.log(player)
},
// 當(dāng)播放器在當(dāng)前播放位置下載數(shù)據(jù)時(shí)觸發(fā)
onPlayerLoadeddata($event) {
//console.log($event)
},
// 當(dāng)前播放位置發(fā)生變化時(shí)觸發(fā)。
onPlayerTimeupdate($event) {
//console.log($event)
},
//媒體的readyState為HAVE_FUTURE_DATA或更高
onPlayerCanplay($event) {
//console.log($event)
},
//媒體的readyState為HAVE_ENOUGH_DATA或更高。這意味著可以在不緩沖的情況下播放整個(gè)媒體文件。
onPlayerCanplaythrough($event) {
//console.log($event)
},
//播放狀態(tài)改變回調(diào)
playerStateChanged($event) {
//console.log($event)
},
//將偵聽器綁定到組件的就緒狀態(tài)。與事件監(jiān)聽器的不同之處在于,如果ready事件已經(jīng)發(fā)生,它將立即觸發(fā)該函數(shù)。。
playerReadied($event) {
//console.log($event)
},
}
}
</script>
<style lang="scss" scoped>
.video-player-custom{
width: 100%;
height: 180px;
// vidoeUI重寫
/deep/ .video-js{
width: 100%;
height: 100%;
padding: 0;
overflow: hidden;
// 播放器
.vjs-tech{
object-fit: cover;
}
// 播放按鈕
.vjs-big-play-button {
position: absolute;
top: 50%;
left: 50%;
width: 2em;
height: 2em;
margin-top: -1em;
margin-left: -1em;
font-size: 2em;
line-height: 2em;
border-radius: 50%;
background-color: rgba(0,0,0,0.45);
outline: none;
}
// 封面
.vjs-poster{
width: 100%;
height: 100%;
background-size: cover;
}
}
}
</style>到此這篇關(guān)于使用vue-video-player實(shí)現(xiàn)直播的文章就介紹到這了,更多相關(guān)vue-video-player直播內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue Router中的冗余導(dǎo)航錯(cuò)誤及解決方案
在現(xiàn)代前端開發(fā)中,單頁應(yīng)用(SPA)已經(jīng)成為主流,而 Vue.js 作為一款流行的前端框架,其官方路由庫 Vue Router 則是構(gòu)建 SPA 的核心工具之一,在使用 Vue Router 的過程中,開發(fā)者可能會(huì)遇到一些常見的錯(cuò)誤,本文將深入探討這一錯(cuò)誤的原因、影響以及解決方案2025-01-01
基于Element-Ui封裝公共表格組件的詳細(xì)圖文步驟
在平時(shí)開發(fā)的時(shí)候很多情況都會(huì)使用到表格和分頁功能,下面這篇文章主要給大家介紹了關(guān)于如何基于Element-Ui封裝公共表格組件的詳細(xì)圖文步驟,需要的朋友可以參考下2022-09-09
詳解Vue路由鉤子及應(yīng)用場(chǎng)景(小結(jié))
本篇文章主要介紹了詳解Vue路由鉤子及應(yīng)用場(chǎng)景(小結(jié)),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-11-11
vue項(xiàng)目中訪問本地json數(shù)據(jù)
這篇文章主要介紹了vue項(xiàng)目中訪問本地json數(shù)據(jù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
詳細(xì)聊聊前端如何實(shí)現(xiàn)token無感刷新(refresh_token)
實(shí)現(xiàn)token無感刷新對(duì)于前端來說是一項(xiàng)非常常用的技術(shù),其本質(zhì)是為了優(yōu)化用戶體驗(yàn),下面這篇文章主要給大家介紹了關(guān)于前端如何實(shí)現(xiàn)token無感刷新(refresh_token)的相關(guān)資料,需要的朋友可以參考下2022-11-11
Vue.js每天必學(xué)之內(nèi)部響應(yīng)式原理探究
Vue.js每天必學(xué)之內(nèi)部響應(yīng)式原理探究,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09

