Vue實現(xiàn)視頻播放vue-video-player、dplayer方式
更新時間:2025年04月18日 11:09:28 作者:熬夜胡蘿北
這篇文章主要介紹了Vue實現(xiàn)視頻播放vue-video-player、dplayer方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
一、vue-video-player
1、安裝及引入
// 安裝 npm install vue-video-player@5.0.1 --save
// 在main.js中全局引入 import VideoPlayer from 'vue-video-player/src'; import 'vue-video-player/src/custom-theme.css' import 'video.js/dist/video-js.css' Vue.use(VideoPlayer)
2、一些常見的屬性、方法和事件
屬性:
videoWidth:返回音頻/視頻源文件本身的寬度。videoHeight:返回音頻/視頻源文件本身的高度。audioTracks:返回表示可用音頻軌道的 AudioTrackList 對象。autoplay:設(shè)置或返回是否在加載完成后隨即播放音頻/視頻。buffered:返回表示音頻/視頻已緩沖部分的 TimeRanges 對象。controller:返回表示音頻/視頻當前媒體控制器的 MediaController 對象。controls:設(shè)置或返回音頻/視頻是否顯示控件(比如播放/暫停等)。crossOrigin:設(shè)置或返回音頻/視頻的 CORS 設(shè)置。currentSrc:返回當前音頻/視頻的URL。currentTime:設(shè)置或返回音頻/視頻中的當前播放位置(以秒計)。defaultMuted:設(shè)置或返回音頻/視頻默認是否靜音。defaultPlaybackRate:設(shè)置或返回音頻/視頻的默認播放速度。duration:返回當前音頻/視頻的長度(以秒計)。ended:返回音頻/視頻的播放是否已結(jié)束。error:返回表示音頻/視頻錯誤狀態(tài)的 MediaError 對象。loop:設(shè)置或返回音頻/視頻是否應(yīng)在結(jié)束時重新播放。mediaGroup:設(shè)置或返回音頻/視頻所屬的組合(用于連接多個音頻/視頻元素)。muted:設(shè)置或返回音頻/視頻是否靜音。networkState:返回音頻/視頻的當前網(wǎng)絡(luò)狀態(tài)。paused:設(shè)置或返回音頻/視頻是否暫停。playbackRate:設(shè)置或返回音頻/視頻播放的速度。played:返回表示音頻/視頻已播放部分的 TimeRanges 對象。preload:設(shè)置或返回音頻/視頻是否應(yīng)該在頁面加載后進行加載。readyState:返回音頻/視頻當前的就緒狀態(tài)。seekable:返回表示音頻/視頻可尋址部分的 TimeRanges 對象。seeking:返回用戶是否正在音頻/視頻中進行查找。src:設(shè)置或返回音頻/視頻元素的當前來源。startDate:返回表示當前時間偏移的 Date 對象。textTracks:返回表示可用文本軌道的 TextTrackList對象。videoTracks:返回表示可用視頻軌道的 VideoTrackList 對象。volume:設(shè)置或返回音頻/視頻的音量。
方法
addTextTrack():向音頻/視頻添加新的文本軌道。canPlayType():檢測瀏覽器是否能播放指定的音頻/視頻類型。load():重新加載音頻/視頻元素。play():開始播放音頻/視頻。pause():暫停當前播放的音頻/視頻。
事件
abort:當音頻/視頻的加載已放棄時觸發(fā)。canplay:當瀏覽器可以開始播放音頻/視頻時觸發(fā)。canplaythrough:當瀏覽器可在不因緩沖而停頓的情況下進行播放時觸發(fā)。durationchange:當音頻/視頻的時長已更改時觸發(fā)。emptied:當目前的播放列表為空時觸發(fā)。ended:當目前的播放列表已結(jié)束時觸發(fā)。error:當在音頻/視頻加載期間發(fā)生錯誤時觸發(fā)。loadeddata:當瀏覽器已加載音頻/視頻的當前幀時觸發(fā)。loadedmetadata:當瀏覽器已加載音頻/視頻的元數(shù)據(jù)時觸發(fā)。loadstart:當瀏覽器開始查找音頻/視頻時觸發(fā)。pause:當音頻/視頻已暫停時觸發(fā)。play:當音頻/視頻已開始或不再暫停時觸發(fā)。playing:當音頻/視頻在因緩沖而暫?;蛲V购笠丫途w時觸發(fā)。progress:當瀏覽器正在下載音頻/視頻時觸發(fā)。ratechange:當音頻/視頻的播放速度已更改時觸發(fā)。seeked:當用戶已移動/跳躍到音頻/視頻中的新位置時觸發(fā)。seeking:當用戶開始移動/跳躍到音頻/視頻中的新位置時觸發(fā)。stalled:當瀏覽器嘗試獲取媒體數(shù)據(jù),但數(shù)據(jù)不可用時觸發(fā)。suspend:當瀏覽器刻意不獲取媒體數(shù)據(jù)時觸發(fā)。timeupdate:當目前的播放位置已更改時觸發(fā)。volumechange:當音量已更改時觸發(fā)。waiting:當視頻由于需要緩沖下一幀而停止時觸發(fā)。
3、關(guān)于不可快進、定位到上次播放位置的基本使用
完整代碼如下:
<template>
<div class="player">
<video-player
ref="videoPlayer"
class="player-video"
:playsinline="false"
:options="playOptions"
@ready="onPlayerReady"
@play="onPlayerPlay($event)"
@pause="onPlayerPause($event)"
@ended="onPlayerEnd($event)"
@waiting="onPlayerWaiting($event)"
@playing="onPlayerPlaying($event)"
@loadeddata="onPlayerLoadeddata($event)"
@timeupdate="onPlayerTimeupdate($event)"
@statechanged="playerStateChanged($event)"
/>
</div>
</template>
<script>
export default {
props: {
path: { // 傳入的地址
type: String,
default: "",
},
lastTime: { // 傳入的上次播放位置
type: Number,
default: 0,
},
},
components: {},
data() {
return {
playedTime: this.lastTime,
currentTime: 0,
maxTime: 0,
playOptions: {
height: "200px",
width: "100%",
playbackRates: [1.0], // 可選的播放速度
autoplay: true, // 如果為true,瀏覽器準備好時開始回放
muted: false, // 默認情況下靜音播放
loop: false, // 是否視頻一結(jié)束就重新開始
preload: "auto", // 建議瀏覽器在<video>加載元素后是否應(yīng)該開始下載視頻數(shù)據(jù),auto瀏覽器選擇最佳行為,立即開始加載視頻(如果瀏覽器支持)
language: "zh-CN",
aspectRatio: "16:9", // 將播放器置于流暢模式,并在計算播放器的動態(tài)大小時使用該值,值應(yīng)該代表一個比例 - 用冒號分隔的兩個數(shù)字(例如"16:9"或"4:3")
fluid: true, // 當true時,Video.js player將擁有流體大小,換句話說,它將按比例縮放以適應(yīng)其容器
sources: [
{
type: "video/mp4", // 類型
src: require("./1.mp4"), // url地址,在使用本地的資源時,需要用require()引入,否則控制臺會報錯
},
],
poster: "./gcy-logo-200.png", // 設(shè)置封面地址
notSupportedMessage: "此視頻暫無法播放,請稍后再試", // 允許覆蓋Video.js無法播放媒體源時顯示的默認信息
controlBar: {
currentTimeDisplay: true,
progressControl: true, // 是否顯示進度條
playbackRateMenuButton: true, // 是否顯示調(diào)整播放倍速按鈕
timeDivider: true, // 當前時間和持續(xù)時間的分隔符
durationDisplay: true, // 顯示持續(xù)時間
remainingTimeDisplay: true, // 是否顯示剩余時間功能
fullscreenToggle: true, // 是否顯示全屏按鈕
},
},
};
},
computed: {
},
mounted() {
this.getData() // 調(diào)用獲取地址的接口,然后修改播放器配置中的src屬性
},
methods: {
// 準備好了
onPlayerReady() {
console.log("準備好了");
},
// 視頻播放
onPlayerPlay(player) {
console.log('播放了');
console.log(player);
let playTime = 0;
if (
Number(Math.floor(this.playedTime)) ===
Number(Math.floor(player.duration()))
) {
this.playedTime = 0;
playTime = 0;
} else if (
Number(Math.floor(player.currentTime())) !==
Number(Math.floor(this.playedTime))
) {
playTime = this.playedTime;
player.currentTime(playTime)
}
},
// 視頻暫停的
onPlayerPause(player) {
console.log('暫停中');
console.log(player);
this.playedTime = player.currentTime();
},
// 視頻播放完
onPlayerEnd(player) {
console.log('播放結(jié)束了');
console.log(player);
},
// DOM元素上的readyState更改導(dǎo)致播放停止
onPlayerWaiting(player) {
console.log("播放停止中");
console.log(player);
},
// 視頻已開始播放
onPlayerPlaying(player) {
console.log("開始播放了");
console.log(player);
},
// 當播放器在當前播放位置下載數(shù)據(jù)時觸發(fā)
onPlayerLoadeddata(player) {
console.log("開始下載數(shù)據(jù)");
console.log(player);
},
// 當前播放位置發(fā)生變化時觸發(fā)
onPlayerTimeupdate(player) {
console.log("播放位置變化了");
console.log(player);
let timeDisplay = player.currentTime();
if (timeDisplay - this.currentTime > 1) {
player.currentTime(this.currentTime > this.maxTime ? this.currentTime : this.maxTime);
}
this.currentTime = player.currentTime();
this.maxTime = this.currentTime > this.maxTime ? this.currentTime : this.maxTime;
},
//播放狀態(tài)改變
playerStateChanged(playerCurrentState) {
console.log("播放狀態(tài)變化了");
console.log(playerCurrentState);
},
// 手動暫停視頻的播放
pause() {
// 視頻播放器的方法調(diào)用,要使用this.$refs.videoPlayer.player這個對象去調(diào)用
this.$refs.videoPlayer.player.pause()
}
},
};
</script>
<style lang="scss" scoped>
</style>注意:
vue-video-player 是基于 video.js 實現(xiàn)的,所以 api 地址:Video.js API docs
調(diào)用的時候使用這個對象進行操作:this.$refs.videoPlayer.player
二、dplayer
1、安裝
// 安裝 npm install dplayer --save
2、關(guān)于不可快進、定位到上次播放位置的基本使用
完整代碼如下:
// 直接在組件中引入
// dplayer.vue
<template>
<div :id="flag"></div>
</template>
<script>
import DPlayer from "dplayer";
export default {
props: {
flag: { // 每個dplayer的id不可以重復(fù)
type: String,
default: "",
},
lastTime: { // 上次播放到的時間
type: Number,
default: 0,
},
},
data() {
return {
dp: null,
playedTime: this.lastTime,
};
},
mounted() {},
methods: {
async init(id) {
let currentTime = 0;
let maxTime = 0;
let res = await api(); // 調(diào)用獲取視頻的地址
let src = res.data.path;
this.dp = new DPlayer({
container: document.getElementById(this.flag), // 播放器容器元素
hotkey: true, // 開啟熱鍵,支持快進、快退、音量控制、播放暫停,默認是true
lang: "zh-cn", // 可選值:'en'、'zh-cn'、'zh-tw'
screenshot: false, // 開啟截圖,如果開啟,視頻和視頻封面需要允許跨域
playbackSpeed: [0.75, 1, 1.25, 1.5, 2, 3], // 可選的視頻播放倍速,可以設(shè)置自定義的數(shù)組
video: { // 視頻信息,更多可以參考官網(wǎng):https://dplayer.diygod.dev/zh/guide.html
url: src, // 視頻地址
},
});
// 監(jiān)聽視頻開始播放
this.dp.on("play", () => {
let playTime = 0;
if (
Number(Math.floor(this.playedTime)) ===
Number(Math.floor(this.dp.video.duration))
) {
this.playedTime = 0;
playTime = 0;
} else if (
Number(Math.floor(this.dp.video.currentTime)) !==
Number(Math.floor(this.playedTime))
) {
playTime = this.playedTime;
this.dp.seek(playTime);
}
});
// 監(jiān)聽視頻暫停
this.dp.on("pause", () => {
this.playedTime = this.dp.video.currentTime;
});
// 設(shè)置不可以快進(timeupdate:當前播放位置更改時觸發(fā))
this.dp.on("timeupdate", () => {
let timeDisplay = this.dp.video.currentTime;
if (timeDisplay - currentTime > 1) {
this.dp.video.currentTime =
currentTime > maxTime ? currentTime : maxTime;
this.dp.notice("禁止快進", 2000);
}
currentTime = this.dp.video.currentTime;
maxTime = currentTime > maxTime ? currentTime : maxTime;
});
// 快進的提示,在禁止快進的提醒存在時不顯示
this.dp.on("notice_show", function (e) {
var text = e.innerHTML;
if (
"禁止快進" != text &&
(text.indexOf("快進") > -1 || text.indexOf("快退") > -1)
) {
e.style.display = "none";
}
});
},
},
};
</script>
<style lang="scss" scoped>
</style>想要了解更多的功能可以參考dplayer的官網(wǎng):DPlayer
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue子元素綁定的事件, 阻止觸發(fā)父級上的事件處理方式
這篇文章主要介紹了vue子元素綁定的事件, 阻止觸發(fā)父級上的事件處理方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11
vue + typescript + 極驗登錄驗證的實現(xiàn)方法
這篇文章主要介紹了vue + typescript + 極驗 登錄驗證的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06
vue + element-ui實現(xiàn)簡潔的導(dǎo)入導(dǎo)出功能
Element-UI是餓了么前端團隊推出的一款基于Vue.js 2.0 的桌面端UI框架,手機端有對應(yīng)框架是 Mint UI,下面這篇文章主要給大家介紹了關(guān)于利用vue + element-ui如何實現(xiàn)簡潔的導(dǎo)入導(dǎo)出功能的相關(guān)資料,需要的朋友可以參考下。2017-12-12
Ant Design Upload 文件上傳功能的實現(xiàn)
這篇文章主要介紹了Ant Design Upload 文件上傳功能的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-04-04

