|
@@ -1,18 +1,30 @@
|
|
|
<template>
|
|
|
- <video
|
|
|
+ <div
|
|
|
class="flv-media"
|
|
|
- ref="VideoMedia"
|
|
|
- muted
|
|
|
- @ended="destroyPlayer"
|
|
|
- ></video>
|
|
|
+ v-loading="loading"
|
|
|
+ element-loading-text="加载中"
|
|
|
+ element-loading-background="rgba(0, 0, 0, 0.8)"
|
|
|
+ >
|
|
|
+ <video ref="VideoMedia" muted @ended="destroyPlayer"></video>
|
|
|
+ <div v-if="result.error" class="media-error">
|
|
|
+ <div class="media-error-content">
|
|
|
+ <div>{{ result.message }}</div>
|
|
|
+ <el-button type="text" icon="el-icon-refresh-left" @click="reloadVideo"
|
|
|
+ >重新播放</el-button
|
|
|
+ >
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
</template>
|
|
|
|
|
|
<script>
|
|
|
import flvjs from "flv.js";
|
|
|
// doc: https://github.com/bilibili/flv.js/blob/42343088f22619cf014a057b3878fe3d320016a6/docs/api.md
|
|
|
+import timeMixin from "../../../mixins/timeMixin";
|
|
|
|
|
|
export default {
|
|
|
name: "flv-media",
|
|
|
+ mixins: [timeMixin],
|
|
|
props: {
|
|
|
liveUrl: {
|
|
|
type: String,
|
|
@@ -21,6 +33,13 @@ export default {
|
|
|
data() {
|
|
|
return {
|
|
|
flvPlayer: null,
|
|
|
+ retryCount: 0,
|
|
|
+ maxRetryCount: 3,
|
|
|
+ loading: true,
|
|
|
+ result: {
|
|
|
+ error: false,
|
|
|
+ message: "",
|
|
|
+ },
|
|
|
};
|
|
|
},
|
|
|
mounted() {
|
|
@@ -46,6 +65,47 @@ export default {
|
|
|
this.flvPlayer.attachMediaElement(this.$refs.VideoMedia);
|
|
|
this.flvPlayer.load();
|
|
|
this.flvPlayer.play();
|
|
|
+ this.flvPlayer.on(flvjs.Events.ERROR, this.playError);
|
|
|
+ this.flvPlayer.on(flvjs.Events.METADATA_ARRIVED, () => {
|
|
|
+ this.loading = false;
|
|
|
+ });
|
|
|
+ },
|
|
|
+ playError(errorType) {
|
|
|
+ switch (errorType) {
|
|
|
+ case flvjs.ErrorTypes.NETWORK_ERROR:
|
|
|
+ console.log("网络问题,准备重试!");
|
|
|
+ this.retryPlay();
|
|
|
+ break;
|
|
|
+ case flvjs.ErrorTypes.MEDIA_ERROR:
|
|
|
+ console.log("媒体问题,准备重试!");
|
|
|
+ this.retryPlay();
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ console.log("未知问题,无法播放!");
|
|
|
+ this.result = {
|
|
|
+ error: true,
|
|
|
+ message: "播放失败!",
|
|
|
+ };
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ },
|
|
|
+ retryPlay() {
|
|
|
+ if (this.retryCount >= this.maxRetryCount) {
|
|
|
+ console.log("已尝试最大次数重新播放!");
|
|
|
+ this.result = {
|
|
|
+ error: true,
|
|
|
+ message: "播放失败!",
|
|
|
+ };
|
|
|
+ this.retryCount = 0;
|
|
|
+ this.loading = false;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ this.addSetTime(() => {
|
|
|
+ this.reloadVideo();
|
|
|
+ this.retryCount++;
|
|
|
+ console.log("已重新播放");
|
|
|
+ }, 1000);
|
|
|
},
|
|
|
playPlayer() {
|
|
|
this.flvPlayer.play();
|
|
@@ -60,14 +120,23 @@ export default {
|
|
|
this.flvPlayer.detachMediaElement();
|
|
|
this.flvPlayer.destroy();
|
|
|
this.flvPlayer = null;
|
|
|
+ this.clearSetTs();
|
|
|
},
|
|
|
mutedPlayer(muted) {
|
|
|
if (!this.flvPlayer) return;
|
|
|
this.flvPlayer.muted = muted;
|
|
|
+ return true;
|
|
|
},
|
|
|
reloadVideo() {
|
|
|
- this.destroyPlayer();
|
|
|
- this.initVideo();
|
|
|
+ this.result = {
|
|
|
+ error: false,
|
|
|
+ message: "",
|
|
|
+ };
|
|
|
+ this.loading = true;
|
|
|
+ this.$nextTick(() => {
|
|
|
+ this.destroyPlayer();
|
|
|
+ this.initVideo();
|
|
|
+ });
|
|
|
},
|
|
|
},
|
|
|
beforeDestroy() {
|