@linker-design-plus/mpegtsplayer 1.0.1 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";const o=require("vue"),u=require("mpegts.js"),O=Symbol("ArcoConfigProvider"),I="arco",N="$arco",x=e=>{var n,t,s;const c=o.getCurrentInstance(),d=o.inject(O,void 0),i=(s=(t=d==null?void 0:d.prefixCls)!=null?t:(n=c==null?void 0:c.appContext.config.globalProperties[N])==null?void 0:n.classPrefix)!=null?s:I;return e?`${i}-${e}`:i},z=Object.prototype.toString;function D(e){return z.call(e)==="[object Number]"&&e===e}var F=(e,n)=>{for(const[t,s]of n)e[t]=s;return e};const j=o.defineComponent({name:"IconLoading",props:{size:{type:[Number,String]},strokeWidth:{type:Number,default:4},strokeLinecap:{type:String,default:"butt",validator:e=>["butt","round","square"].includes(e)},strokeLinejoin:{type:String,default:"miter",validator:e=>["arcs","bevel","miter","miter-clip","round"].includes(e)},rotate:Number,spin:Boolean},emits:{click:e=>!0},setup(e,{emit:n}){const t=x("icon"),s=o.computed(()=>[t,`${t}-loading`,{[`${t}-spin`]:e.spin}]),c=o.computed(()=>{const i={};return e.size&&(i.fontSize=D(e.size)?`${e.size}px`:e.size),e.rotate&&(i.transform=`rotate(${e.rotate}deg)`),i});return{cls:s,innerStyle:c,onClick:i=>{n("click",i)}}}}),A=["stroke-width","stroke-linecap","stroke-linejoin"],V=o.createElementVNode("path",{d:"M42 24c0 9.941-8.059 18-18 18S6 33.941 6 24 14.059 6 24 6"},null,-1),U=[V];function G(e,n,t,s,c,d){return o.openBlock(),o.createElementBlock("svg",{viewBox:"0 0 48 48",fill:"none",xmlns:"http://www.w3.org/2000/svg",stroke:"currentColor",class:o.normalizeClass(e.cls),style:o.normalizeStyle(e.innerStyle),"stroke-width":e.strokeWidth,"stroke-linecap":e.strokeLinecap,"stroke-linejoin":e.strokeLinejoin,onClick:n[0]||(n[0]=(...i)=>e.onClick&&e.onClick(...i))},U,14,A)}var y=F(j,[["render",G]]);const W=Object.assign(y,{install:(e,n)=>{var t;const s=(t=n==null?void 0:n.iconPrefix)!=null?t:"";e.component(s+y.name,y)}});const g=o.defineComponent({name:"MpegtsPlayer",props:{videoUrl:{type:String,default:""},closeVisibilityChangeListener:{type:Boolean,default:!1},autoVisibilityChangeRefresh:{type:Boolean,default:!1},autoReload:{type:Boolean,default:!1},isLive:{type:Boolean,default:!0},controls:{type:Boolean,default:!1},currentTime:{type:Number,default:0},stallTimeout:{type:Number,default:5e3}},emits:["loadError","playSuccess","loadComplete","visibilitychange","timeupdate","playEnded","playLoading"],setup(e,{emit:n}){const t=o.ref(null),s=o.ref(null),c=o.ref(!0),d=o.ref(!1),i=o.ref(0);let p=0,m=Date.now();const h=()=>{const a=s.value;t.value=u.createPlayer({type:"flv",isLive:e.isLive,hasAudio:!1,cors:!0,url:e.videoUrl},{enableWorker:!1,enableWorkerForMSE:!1,enableStashBuffer:!e.isLive,stashInitialSize:128,lazyLoad:!1,lazyLoadMaxDuration:.2,deferLoadAfterSourceOpen:!1,liveBufferLatencyChasing:!!e.isLive,liveBufferLatencyMaxLatency:1,liveBufferLatencyMinRemain:.5,autoCleanupSourceBuffer:!0,autoCleanupMinBackwardDuration:30,autoCleanupMaxBackwardDuration:60}),t.value.attachMediaElement(a),c.value=!0,k(),S()},k=async()=>{try{t.value.load()}catch(a){console.log(a),n("loadError",a)}},S=()=>{t.value.on(u.Events.ERROR,C),t.value.on(u.Events.LOADING_COMPLETE,L),t.value.on(u.Events.STATISTICS_INFO,P)},C=(a,l,r)=>{console.log(`类型:${JSON.stringify(a)}`,`报错内容${l}`,"报错信息",r),n("loadError",l)},L=(a,l,r)=>{console.log(`类型:${JSON.stringify(a)}`,`报错内容${l}`,"报错信息",r),console.log("直播已结束"),n("loadComplete"),e.autoReload&&M()},P=a=>{const l=a.decodedFrames,r=Date.now();l===p&&l!==0?r-m>e.stallTimeout&&(console.log(`解码帧数超过 ${e.stallTimeout/1e3} 秒没有更新,可能卡顿了`),n("playLoading")):(p=l,m=r)},M=()=>{console.log("自动加载",i.value),i.value++,i.value<=2?v():i.value=0},v=()=>{t.value!=null&&f(),h()},$=()=>t.value.play(),R=()=>t.value.pause(),f=()=>{var a,l,r,E;t.value&&(t.value.off(u.Events.ERROR,C),t.value.off(u.Events.LOADING_COMPLETE,L),(a=t.value)==null||a.pause(),(l=t.value)==null||l.unload(),(r=t.value)==null||r.detachMediaElement(),(E=t.value)==null||E.destroy(),t.value=null)},B=async a=>{var l;if(!(!((l=a.target)!=null&&l.paused)||!c.value)){c.value=!1,console.log("handleCanplay",a.target.paused),i.value=0,d.value=!1;try{await t.value.play(),console.log(t.value),n("playSuccess")}catch(r){console.log("play error",r),n("loadError",r)}}},T=()=>{d.value=!0},_=a=>{var l;n("timeupdate",((l=a==null?void 0:a.target)==null?void 0:l.currentTime)??0)},w=()=>{n("playEnded")},b=()=>{document.visibilityState==="visible"?(n("visibilitychange",document.visibilityState),e.autoVisibilityChangeRefresh&&v()):f()};return o.watch(()=>e.videoUrl,a=>{a&&o.nextTick(()=>{t.value!=null&&f(),console.log(`isSupported: ${u.isSupported()}`),console.log(`是否支持点播视频:${u.getFeatureList().msePlayback}`),console.log(`是否支持httpflv直播流:${u.getFeatureList().mseLivePlayback}`),h()})},{immediate:!0}),o.onMounted(()=>{e.closeVisibilityChangeListener||document.addEventListener("visibilitychange",b)}),o.onUnmounted(()=>{f(),e.closeVisibilityChangeListener||document.removeEventListener("visibilitychange",b)}),{flvPlayer:t,videoContainerRef:s,loadMetaData:d,start:$,pause:R,destroy:f,reload:v,handleCanplay:B,handleLoadedmetadata:T,handleTimeupdate:_,handlePlayEnded:w}},render(){return React.createElement("div",{class:"mainContainer"},React.createElement("video",{class:"video-container",ref:"videoContainerRef",muted:!0,controls:this.controls,onClick:e=>e.preventDefault(),onCanplay:this.handleCanplay,onLoadedmetadata:this.handleLoadedmetadata,onTimeupdate:this.handleTimeupdate,onEnded:this.handlePlayEnded},"Your browser is too old which doesn't support HTML5 video."),this.loadMetaData&&React.createElement(W,{class:"meta-data-loading"}))}}),q=Object.assign(g,{install:e=>{e.component(g.name,g)}});module.exports=q;
1
+ "use strict";const n=require("vue"),u=require("mpegts.js"),O=Symbol("ArcoConfigProvider"),R="arco",I="$arco",x=e=>{var a,t,s;const c=n.getCurrentInstance(),d=n.inject(O,void 0),i=(s=(t=d==null?void 0:d.prefixCls)!=null?t:(a=c==null?void 0:c.appContext.config.globalProperties[I])==null?void 0:a.classPrefix)!=null?s:R;return e?`${i}-${e}`:i},z=Object.prototype.toString;function D(e){return z.call(e)==="[object Number]"&&e===e}var V=(e,a)=>{for(const[t,s]of a)e[t]=s;return e};const F=n.defineComponent({name:"IconLoading",props:{size:{type:[Number,String]},strokeWidth:{type:Number,default:4},strokeLinecap:{type:String,default:"butt",validator:e=>["butt","round","square"].includes(e)},strokeLinejoin:{type:String,default:"miter",validator:e=>["arcs","bevel","miter","miter-clip","round"].includes(e)},rotate:Number,spin:Boolean},emits:{click:e=>!0},setup(e,{emit:a}){const t=x("icon"),s=n.computed(()=>[t,`${t}-loading`,{[`${t}-spin`]:e.spin}]),c=n.computed(()=>{const i={};return e.size&&(i.fontSize=D(e.size)?`${e.size}px`:e.size),e.rotate&&(i.transform=`rotate(${e.rotate}deg)`),i});return{cls:s,innerStyle:c,onClick:i=>{a("click",i)}}}}),j=["stroke-width","stroke-linecap","stroke-linejoin"],A=n.createElementVNode("path",{d:"M42 24c0 9.941-8.059 18-18 18S6 33.941 6 24 14.059 6 24 6"},null,-1),U=[A];function G(e,a,t,s,c,d){return n.openBlock(),n.createElementBlock("svg",{viewBox:"0 0 48 48",fill:"none",xmlns:"http://www.w3.org/2000/svg",stroke:"currentColor",class:n.normalizeClass(e.cls),style:n.normalizeStyle(e.innerStyle),"stroke-width":e.strokeWidth,"stroke-linecap":e.strokeLinecap,"stroke-linejoin":e.strokeLinejoin,onClick:a[0]||(a[0]=(...i)=>e.onClick&&e.onClick(...i))},U,14,j)}var y=V(F,[["render",G]]);const W=Object.assign(y,{install:(e,a)=>{var t;const s=(t=a==null?void 0:a.iconPrefix)!=null?t:"";e.component(s+y.name,y)}});const g=n.defineComponent({name:"MpegtsPlayer",props:{videoUrl:{type:String,default:""},closeVisibilityChangeListener:{type:Boolean,default:!1},autoVisibilityChangeRefresh:{type:Boolean,default:!1},autoReload:{type:Boolean,default:!1},isLive:{type:Boolean,default:!0},controls:{type:Boolean,default:!1},currentTime:{type:Number,default:0},stallTimeout:{type:Number,default:5e3}},emits:["loadError","playSuccess","loadComplete","visibilitychange","timeupdate","playEnded","playLoading"],setup(e,{emit:a}){const t=n.ref(null),s=n.ref(null),c=n.ref(!0),d=n.ref(!1),i=n.ref(0);let p=0,m=Date.now();const h=()=>{const o=s.value;t.value=u.createPlayer({type:"flv",isLive:e.isLive,hasAudio:!1,cors:!0,url:e.videoUrl},{enableWorker:!1,enableWorkerForMSE:!1,enableStashBuffer:!e.isLive,stashInitialSize:128,lazyLoad:!1,lazyLoadMaxDuration:.2,deferLoadAfterSourceOpen:!1,liveBufferLatencyChasing:!!e.isLive,liveBufferLatencyMaxLatency:1,liveBufferLatencyMinRemain:.5,autoCleanupSourceBuffer:!0,autoCleanupMinBackwardDuration:30,autoCleanupMaxBackwardDuration:60}),t.value.attachMediaElement(o),c.value=!0,E(),S()},E=async()=>{try{t.value.load()}catch(o){console.log(o),a("loadError",o)}},S=()=>{t.value.on(u.Events.ERROR,C),t.value.on(u.Events.LOADING_COMPLETE,L),t.value.on(u.Events.STATISTICS_INFO,P)},C=(o,l,r)=>{console.log(`类型:${JSON.stringify(o)}`,`报错内容${l}`,"报错信息",r),a("loadError",l)},L=(o,l,r)=>{console.log(`类型:${JSON.stringify(o)}`,`报错内容${l}`,"报错信息",r),console.log("直播已结束"),a("loadComplete"),e.autoReload&&M()},P=o=>{const l=o.decodedFrames,r=Date.now();l===p&&l!==0?r-m>e.stallTimeout&&(console.log(`解码帧数超过 ${e.stallTimeout/1e3} 秒没有更新,可能卡顿了`),a("playLoading")):(p=l,m=r)},M=()=>{console.log("自动加载",i.value),i.value++,i.value<=2?v():i.value=0},v=()=>{t.value!=null&&f(),h()},$=()=>t.value.play(),N=()=>t.value.pause(),f=()=>{var o,l,r,k;t.value&&(t.value.off(u.Events.ERROR,C),t.value.off(u.Events.LOADING_COMPLETE,L),(o=t.value)==null||o.pause(),(l=t.value)==null||l.unload(),(r=t.value)==null||r.detachMediaElement(),(k=t.value)==null||k.destroy(),t.value=null)},T=async o=>{var l;if(!(!((l=o.target)!=null&&l.paused)||!c.value)){c.value=!1,console.log("handleCanplay",o.target.paused),i.value=0,d.value=!1;try{await t.value.play(),console.log(t.value),a("playSuccess")}catch(r){console.log("play error",r),a("loadError",r)}}},B=()=>{d.value=!0},_=o=>{var l;a("timeupdate",((l=o==null?void 0:o.target)==null?void 0:l.currentTime)??0)},w=()=>{a("playEnded")},b=()=>{document.visibilityState==="visible"?(a("visibilitychange",document.visibilityState),e.autoVisibilityChangeRefresh&&v()):f()};return n.watch(()=>e.videoUrl,o=>{o&&n.nextTick(()=>{t.value!=null&&f(),console.log(`isSupported: ${u.isSupported()}`),console.log(`是否支持点播视频:${u.getFeatureList().msePlayback}`),console.log(`是否支持httpflv直播流:${u.getFeatureList().mseLivePlayback}`),h()})},{immediate:!0}),n.onMounted(()=>{e.closeVisibilityChangeListener||document.addEventListener("visibilitychange",b)}),n.onUnmounted(()=>{f(),e.closeVisibilityChangeListener||document.removeEventListener("visibilitychange",b)}),{flvPlayer:t,videoContainerRef:s,loadMetaData:d,start:$,pause:N,destroy:f,reload:v,handleCanplay:T,handleLoadedmetadata:B,handleTimeupdate:_,handlePlayEnded:w}},render(){return n.createVNode("div",{class:"mainContainer"},[n.createVNode("video",{class:"video-container",ref:"videoContainerRef",muted:!0,controls:this.controls,onClick:e=>e.preventDefault(),onCanplay:this.handleCanplay,onLoadedmetadata:this.handleLoadedmetadata,onTimeupdate:this.handleTimeupdate,onEnded:this.handlePlayEnded},[n.createTextVNode("Your browser is too old which doesn't support HTML5 video.")]),this.loadMetaData&&n.createVNode(W,{class:"meta-data-loading"},null)])}}),q=Object.assign(g,{install:e=>{e.component(g.name,g)}});module.exports=q;
package/dist/index.mjs CHANGED
@@ -1,19 +1,19 @@
1
- import { getCurrentInstance as N, inject as x, defineComponent as S, computed as k, openBlock as z, createElementBlock as D, normalizeClass as F, normalizeStyle as j, createElementVNode as A, ref as f, watch as V, nextTick as U, onMounted as G, onUnmounted as W } from "vue";
1
+ import { getCurrentInstance as x, inject as z, defineComponent as P, computed as S, openBlock as D, createElementBlock as F, normalizeClass as j, normalizeStyle as A, createElementVNode as V, ref as f, watch as U, nextTick as G, onMounted as W, onUnmounted as J, createVNode as y, createTextVNode as q } from "vue";
2
2
  import c from "mpegts.js";
3
- const J = Symbol("ArcoConfigProvider"), q = "arco", H = "$arco", K = (e) => {
3
+ const H = Symbol("ArcoConfigProvider"), K = "arco", X = "$arco", Y = (e) => {
4
4
  var a, t, i;
5
- const r = N(), u = x(J, void 0), l = (i = (t = u == null ? void 0 : u.prefixCls) != null ? t : (a = r == null ? void 0 : r.appContext.config.globalProperties[H]) == null ? void 0 : a.classPrefix) != null ? i : q;
5
+ const r = x(), u = z(H, void 0), l = (i = (t = u == null ? void 0 : u.prefixCls) != null ? t : (a = r == null ? void 0 : r.appContext.config.globalProperties[X]) == null ? void 0 : a.classPrefix) != null ? i : K;
6
6
  return e ? `${l}-${e}` : l;
7
- }, X = Object.prototype.toString;
8
- function Y(e) {
9
- return X.call(e) === "[object Number]" && e === e;
7
+ }, Q = Object.prototype.toString;
8
+ function Z(e) {
9
+ return Q.call(e) === "[object Number]" && e === e;
10
10
  }
11
- var Q = (e, a) => {
11
+ var ee = (e, a) => {
12
12
  for (const [t, i] of a)
13
13
  e[t] = i;
14
14
  return e;
15
15
  };
16
- const Z = S({
16
+ const te = P({
17
17
  name: "IconLoading",
18
18
  props: {
19
19
  size: {
@@ -40,9 +40,9 @@ const Z = S({
40
40
  click: (e) => !0
41
41
  },
42
42
  setup(e, { emit: a }) {
43
- const t = K("icon"), i = k(() => [t, `${t}-loading`, { [`${t}-spin`]: e.spin }]), r = k(() => {
43
+ const t = Y("icon"), i = S(() => [t, `${t}-loading`, { [`${t}-spin`]: e.spin }]), r = S(() => {
44
44
  const l = {};
45
- return e.size && (l.fontSize = Y(e.size) ? `${e.size}px` : e.size), e.rotate && (l.transform = `rotate(${e.rotate}deg)`), l;
45
+ return e.size && (l.fontSize = Z(e.size) ? `${e.size}px` : e.size), e.rotate && (l.transform = `rotate(${e.rotate}deg)`), l;
46
46
  });
47
47
  return {
48
48
  cls: i,
@@ -52,32 +52,32 @@ const Z = S({
52
52
  }
53
53
  };
54
54
  }
55
- }), ee = ["stroke-width", "stroke-linecap", "stroke-linejoin"], te = /* @__PURE__ */ A("path", { d: "M42 24c0 9.941-8.059 18-18 18S6 33.941 6 24 14.059 6 24 6" }, null, -1), ae = [
56
- te
55
+ }), ae = ["stroke-width", "stroke-linecap", "stroke-linejoin"], ne = /* @__PURE__ */ V("path", { d: "M42 24c0 9.941-8.059 18-18 18S6 33.941 6 24 14.059 6 24 6" }, null, -1), oe = [
56
+ ne
57
57
  ];
58
- function ne(e, a, t, i, r, u) {
59
- return z(), D("svg", {
58
+ function le(e, a, t, i, r, u) {
59
+ return D(), F("svg", {
60
60
  viewBox: "0 0 48 48",
61
61
  fill: "none",
62
62
  xmlns: "http://www.w3.org/2000/svg",
63
63
  stroke: "currentColor",
64
- class: F(e.cls),
65
- style: j(e.innerStyle),
64
+ class: j(e.cls),
65
+ style: A(e.innerStyle),
66
66
  "stroke-width": e.strokeWidth,
67
67
  "stroke-linecap": e.strokeLinecap,
68
68
  "stroke-linejoin": e.strokeLinejoin,
69
69
  onClick: a[0] || (a[0] = (...l) => e.onClick && e.onClick(...l))
70
- }, ae, 14, ee);
70
+ }, oe, 14, ae);
71
71
  }
72
- var y = /* @__PURE__ */ Q(Z, [["render", ne]]);
73
- const oe = Object.assign(y, {
72
+ var g = /* @__PURE__ */ ee(te, [["render", le]]);
73
+ const ie = Object.assign(g, {
74
74
  install: (e, a) => {
75
75
  var t;
76
76
  const i = (t = a == null ? void 0 : a.iconPrefix) != null ? t : "";
77
- e.component(i + y.name, y);
77
+ e.component(i + g.name, g);
78
78
  }
79
79
  });
80
- const m = S({
80
+ const p = /* @__PURE__ */ P({
81
81
  name: "MpegtsPlayer",
82
82
  props: {
83
83
  videoUrl: {
@@ -113,95 +113,76 @@ const m = S({
113
113
  default: 5e3
114
114
  }
115
115
  },
116
- emits: [
117
- "loadError",
118
- "playSuccess",
119
- "loadComplete",
120
- "visibilitychange",
121
- "timeupdate",
122
- "playEnded",
123
- "playLoading"
124
- ],
125
- setup(e, { emit: a }) {
116
+ emits: ["loadError", "playSuccess", "loadComplete", "visibilitychange", "timeupdate", "playEnded", "playLoading"],
117
+ setup(e, {
118
+ emit: a
119
+ }) {
126
120
  const t = f(null), i = f(null), r = f(!0), u = f(!1), l = f(0);
127
- let g = 0, p = Date.now();
128
- const h = () => {
121
+ let m = 0, h = Date.now();
122
+ const L = () => {
129
123
  const n = i.value;
130
- t.value = c.createPlayer(
131
- {
132
- type: "flv",
133
- // 指定视频类型
134
- isLive: e.isLive,
135
- // 开启直播
136
- hasAudio: !1,
137
- // 关闭声音
138
- cors: !0,
139
- // 开启跨域访问
140
- url: e.videoUrl
141
- // 指定流链接
142
- },
143
- {
144
- enableWorker: !1,
145
- // 启用分离的线程进行转换(如果不想看到控制台频繁报错把它设置为false,官方的回答是这个属性还不稳定,所以要测试实时视频流的话设置为true控制台经常报错)
146
- // @ts-ignore
147
- enableWorkerForMSE: !1,
148
- enableStashBuffer: !e.isLive,
149
- // 关闭IO隐藏缓冲区(如果需要最小延迟,则设置为false,此项设置针对直播视频流)
150
- stashInitialSize: 128,
151
- // 减少首帧等待时长(针对实时视频流)
152
- lazyLoad: !1,
153
- // 关闭懒加载模式(针对实时视频流)
154
- lazyLoadMaxDuration: 0.2,
155
- // 懒加载的最大时长。单位:秒。建议针对直播:调整为200毫秒
156
- deferLoadAfterSourceOpen: !1,
157
- // 在MediaSource sourceopen事件触发后加载。在Chrome上,在后台打开的标签页可能不会触发sourceopen事件,除非切换到该标签页。
158
- liveBufferLatencyChasing: !!e.isLive,
159
- // 追踪内部缓冲区导致的实时流延迟
160
- liveBufferLatencyMaxLatency: 1,
161
- // HTMLMediaElement 中可接受的最大缓冲区延迟(以秒为单位)之前使用flv.js发现延时严重,还有延时累加的问题,而mpegts.js对此做了优化,不需要我们自己设置快进追帧了
162
- liveBufferLatencyMinRemain: 0.5,
163
- // HTMLMediaElement 中可接受的最小缓冲区延迟(以秒为单位)
164
- autoCleanupSourceBuffer: !0,
165
- // 自动清理SourceBuffer,防止缓冲区溢出。
166
- autoCleanupMinBackwardDuration: 30,
167
- // 自动清理时保留的最小回溯时长。
168
- autoCleanupMaxBackwardDuration: 60
169
- // 自动清理时的最大回溯时长。
170
- }
171
- ), t.value.attachMediaElement(n), r.value = !0, P(), M();
172
- }, P = async () => {
124
+ t.value = c.createPlayer({
125
+ type: "flv",
126
+ // 指定视频类型
127
+ isLive: e.isLive,
128
+ // 开启直播
129
+ hasAudio: !1,
130
+ // 关闭声音
131
+ cors: !0,
132
+ // 开启跨域访问
133
+ url: e.videoUrl
134
+ // 指定流链接
135
+ }, {
136
+ enableWorker: !1,
137
+ // 启用分离的线程进行转换(如果不想看到控制台频繁报错把它设置为false,官方的回答是这个属性还不稳定,所以要测试实时视频流的话设置为true控制台经常报错)
138
+ // @ts-ignore
139
+ enableWorkerForMSE: !1,
140
+ enableStashBuffer: !e.isLive,
141
+ // 关闭IO隐藏缓冲区(如果需要最小延迟,则设置为false,此项设置针对直播视频流)
142
+ stashInitialSize: 128,
143
+ // 减少首帧等待时长(针对实时视频流)
144
+ lazyLoad: !1,
145
+ // 关闭懒加载模式(针对实时视频流)
146
+ lazyLoadMaxDuration: 0.2,
147
+ // 懒加载的最大时长。单位:秒。建议针对直播:调整为200毫秒
148
+ deferLoadAfterSourceOpen: !1,
149
+ // 在MediaSource sourceopen事件触发后加载。在Chrome上,在后台打开的标签页可能不会触发sourceopen事件,除非切换到该标签页。
150
+ liveBufferLatencyChasing: !!e.isLive,
151
+ // 追踪内部缓冲区导致的实时流延迟
152
+ liveBufferLatencyMaxLatency: 1,
153
+ // HTMLMediaElement 中可接受的最大缓冲区延迟(以秒为单位)之前使用flv.js发现延时严重,还有延时累加的问题,而mpegts.js对此做了优化,不需要我们自己设置快进追帧了
154
+ liveBufferLatencyMinRemain: 0.5,
155
+ // HTMLMediaElement 中可接受的最小缓冲区延迟(以秒为单位)
156
+ autoCleanupSourceBuffer: !0,
157
+ // 自动清理SourceBuffer,防止缓冲区溢出。
158
+ autoCleanupMinBackwardDuration: 30,
159
+ // 自动清理时保留的最小回溯时长。
160
+ autoCleanupMaxBackwardDuration: 60
161
+ // 自动清理时的最大回溯时长。
162
+ }), t.value.attachMediaElement(n), r.value = !0, M(), $();
163
+ }, M = async () => {
173
164
  try {
174
165
  t.value.load();
175
166
  } catch (n) {
176
167
  console.log(n), a("loadError", n);
177
168
  }
178
- }, M = () => {
179
- t.value.on(c.Events.ERROR, L), t.value.on(c.Events.LOADING_COMPLETE, C), t.value.on(c.Events.STATISTICS_INFO, $);
180
- }, L = (n, o, s) => {
181
- console.log(
182
- `类型:${JSON.stringify(n)}`,
183
- `报错内容${o}`,
184
- "报错信息",
185
- s
186
- ), a("loadError", o);
169
+ }, $ = () => {
170
+ t.value.on(c.Events.ERROR, C), t.value.on(c.Events.LOADING_COMPLETE, b), t.value.on(c.Events.STATISTICS_INFO, T);
187
171
  }, C = (n, o, s) => {
188
- console.log(
189
- `类型:${JSON.stringify(n)}`,
190
- `报错内容${o}`,
191
- "报错信息",
192
- s
193
- ), console.log("直播已结束"), a("loadComplete"), e.autoReload && R();
194
- }, $ = (n) => {
172
+ console.log(`类型:${JSON.stringify(n)}`, `报错内容${o}`, "报错信息", s), a("loadError", o);
173
+ }, b = (n, o, s) => {
174
+ console.log(`类型:${JSON.stringify(n)}`, `报错内容${o}`, "报错信息", s), console.log("直播已结束"), a("loadComplete"), e.autoReload && B();
175
+ }, T = (n) => {
195
176
  const o = n.decodedFrames, s = Date.now();
196
- o === g && o !== 0 ? s - p > e.stallTimeout && (console.log(`解码帧数超过 ${e.stallTimeout / 1e3} 秒没有更新,可能卡顿了`), a("playLoading")) : (g = o, p = s);
197
- }, R = () => {
177
+ o === m && o !== 0 ? s - h > e.stallTimeout && (console.log(`解码帧数超过 ${e.stallTimeout / 1e3} 秒没有更新,可能卡顿了`), a("playLoading")) : (m = o, h = s);
178
+ }, B = () => {
198
179
  console.log("自动加载", l.value), l.value++, l.value <= 2 ? v() : l.value = 0;
199
180
  }, v = () => {
200
- t.value != null && d(), h();
201
- }, B = () => t.value.play(), T = () => t.value.pause(), d = () => {
181
+ t.value != null && d(), L();
182
+ }, N = () => t.value.play(), _ = () => t.value.pause(), d = () => {
202
183
  var n, o, s, E;
203
- t.value && (t.value.off(c.Events.ERROR, L), t.value.off(c.Events.LOADING_COMPLETE, C), (n = t.value) == null || n.pause(), (o = t.value) == null || o.unload(), (s = t.value) == null || s.detachMediaElement(), (E = t.value) == null || E.destroy(), t.value = null);
204
- }, _ = async (n) => {
184
+ t.value && (t.value.off(c.Events.ERROR, C), t.value.off(c.Events.LOADING_COMPLETE, b), (n = t.value) == null || n.pause(), (o = t.value) == null || o.unload(), (s = t.value) == null || s.detachMediaElement(), (E = t.value) == null || E.destroy(), t.value = null);
185
+ }, w = async (n) => {
205
186
  var o;
206
187
  if (!(!((o = n.target) != null && o.paused) || !r.value)) {
207
188
  r.value = !1, console.log("handleCanplay", n.target.paused), l.value = 0, u.value = !1;
@@ -211,64 +192,62 @@ const m = S({
211
192
  console.log("play error", s), a("loadError", s);
212
193
  }
213
194
  }
214
- }, w = () => {
195
+ }, O = () => {
215
196
  u.value = !0;
216
- }, O = (n) => {
197
+ }, R = (n) => {
217
198
  var o;
218
199
  a("timeupdate", ((o = n == null ? void 0 : n.target) == null ? void 0 : o.currentTime) ?? 0);
219
200
  }, I = () => {
220
201
  a("playEnded");
221
- }, b = () => {
202
+ }, k = () => {
222
203
  document.visibilityState === "visible" ? (a("visibilitychange", document.visibilityState), e.autoVisibilityChangeRefresh && v()) : d();
223
204
  };
224
- return V(
225
- () => e.videoUrl,
226
- (n) => {
227
- n && U(() => {
228
- t.value != null && d(), console.log(`isSupported: ${c.isSupported()}`), console.log(`是否支持点播视频:${c.getFeatureList().msePlayback}`), console.log(`是否支持httpflv直播流:${c.getFeatureList().mseLivePlayback}`), h();
229
- });
230
- },
231
- { immediate: !0 }
232
- ), G(() => {
233
- e.closeVisibilityChangeListener || document.addEventListener("visibilitychange", b);
205
+ return U(() => e.videoUrl, (n) => {
206
+ n && G(() => {
207
+ t.value != null && d(), console.log(`isSupported: ${c.isSupported()}`), console.log(`是否支持点播视频:${c.getFeatureList().msePlayback}`), console.log(`是否支持httpflv直播流:${c.getFeatureList().mseLivePlayback}`), L();
208
+ });
209
+ }, {
210
+ immediate: !0
234
211
  }), W(() => {
235
- d(), e.closeVisibilityChangeListener || document.removeEventListener("visibilitychange", b);
212
+ e.closeVisibilityChangeListener || document.addEventListener("visibilitychange", k);
213
+ }), J(() => {
214
+ d(), e.closeVisibilityChangeListener || document.removeEventListener("visibilitychange", k);
236
215
  }), {
237
216
  flvPlayer: t,
238
217
  videoContainerRef: i,
239
218
  loadMetaData: u,
240
- start: B,
241
- pause: T,
219
+ start: N,
220
+ pause: _,
242
221
  destroy: d,
243
222
  reload: v,
244
- handleCanplay: _,
245
- handleLoadedmetadata: w,
246
- handleTimeupdate: O,
223
+ handleCanplay: w,
224
+ handleLoadedmetadata: O,
225
+ handleTimeupdate: R,
247
226
  handlePlayEnded: I
248
227
  };
249
228
  },
250
229
  render() {
251
- return /* @__PURE__ */ React.createElement("div", { class: "mainContainer" }, /* @__PURE__ */ React.createElement(
252
- "video",
253
- {
254
- class: "video-container",
255
- ref: "videoContainerRef",
256
- muted: !0,
257
- controls: this.controls,
258
- onClick: (e) => e.preventDefault(),
259
- onCanplay: this.handleCanplay,
260
- onLoadedmetadata: this.handleLoadedmetadata,
261
- onTimeupdate: this.handleTimeupdate,
262
- onEnded: this.handlePlayEnded
263
- },
264
- "Your browser is too old which doesn't support HTML5 video."
265
- ), this.loadMetaData && /* @__PURE__ */ React.createElement(oe, { class: "meta-data-loading" }));
230
+ return y("div", {
231
+ class: "mainContainer"
232
+ }, [y("video", {
233
+ class: "video-container",
234
+ ref: "videoContainerRef",
235
+ muted: !0,
236
+ controls: this.controls,
237
+ onClick: (e) => e.preventDefault(),
238
+ onCanplay: this.handleCanplay,
239
+ onLoadedmetadata: this.handleLoadedmetadata,
240
+ onTimeupdate: this.handleTimeupdate,
241
+ onEnded: this.handlePlayEnded
242
+ }, [q("Your browser is too old which doesn't support HTML5 video.")]), this.loadMetaData && y(ie, {
243
+ class: "meta-data-loading"
244
+ }, null)]);
266
245
  }
267
- }), se = Object.assign(m, {
246
+ }), ce = Object.assign(p, {
268
247
  install: (e) => {
269
- e.component(m.name, m);
248
+ e.component(p.name, p);
270
249
  }
271
250
  });
272
251
  export {
273
- se as default
252
+ ce as default
274
253
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@linker-design-plus/mpegtsplayer",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "description": "A player base on mpegts.js",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -43,6 +43,8 @@
43
43
  "@types/node": "^18.0.0",
44
44
  "rimraf": "^5.0.0",
45
45
  "typescript": "^5.0.0",
46
- "vite": "^4.0.0"
46
+ "vite": "^4.0.0",
47
+ "@vitejs/plugin-vue": "^4.0.0",
48
+ "@vitejs/plugin-vue-jsx": "^3.0.0"
47
49
  }
48
- }
50
+ }