ckplayer-plus 1.1.4 → 1.1.6

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/ckplayer.js CHANGED
@@ -141,7 +141,7 @@
141
141
  cdnFallback:true// getPath 失败时是否回退到 jsDelivr(内网可设 false,并配置 pluginPath)
142
142
  };
143
143
  // 打包时替换为真实版本;用于 bundler 下 getPath 失效时的 CDN 回退
144
- var ckplayerPlusDefaultCdn='https://cdn.jsdelivr.net/npm/ckplayer-plus@1.1.4/dist/';
144
+ var ckplayerPlusDefaultCdn='https://cdn.jsdelivr.net/npm/ckplayer-plus@1.1.6/dist/';
145
145
  function ckplayerEmbed(videoObj){
146
146
  /*
147
147
  * rightMenu
@@ -181,6 +181,7 @@
181
181
  var hlsResumeWarmup=false;//HLS 续播先预热首个可解码分片,再定位目标时间
182
182
  var hlsLoadAt=-1;//最近一次 hls.startLoad 目标
183
183
  var hlsLoadTs=0;//最近一次 hls.startLoad 时间戳
184
+ var hlsScrubResumePlay=false;//用户拖动后是否需要在 seeked 时恢复播放
184
185
  var oldTime=0,playTime=0,firstSeekTime=-1,maxSeeTime=0;//oldTime=记录上次播放时间,playTime=当前播放时间,firstSeekTime=记录第一次拖动的时间,maxSeeTime=看过的最大时间
185
186
  var isChangeDef=true;//是否需要重置清晰度
186
187
  var playType='';//播放类别,默认='',是通过api接口播放,='button'则判定是通过点击按钮播放
@@ -446,7 +447,7 @@
446
447
  }
447
448
  var allowCdn=!vars || vars['cdnFallback']!==false;
448
449
  var cdn=(typeof window!=='undefined' && window.ckplayerPlusCdn) ? window.ckplayerPlusCdn : ckplayerPlusDefaultCdn;
449
- if(!allowCdn || !cdn || cdn.indexOf('1.1.4')>-1){
450
+ if(!allowCdn || !cdn || cdn.indexOf('1.1.6')>-1){
450
451
  // 避免占位版本或显式关闭 CDN 时请求坏地址;交给相对路径或业务 pluginPath
451
452
  return folder+'/'+file;
452
453
  }
@@ -818,6 +819,41 @@
818
819
  }
819
820
  return true;
820
821
  },
822
+ /*
823
+ * hlsInteractiveSeek
824
+ * 功能:用户拖动/点击进度条时的 HLS 跳转
825
+ * 对齐 EZ/标准 hls.js 做法:只改 video.currentTime,由 hls.js 内部响应 seeking 拉片。
826
+ * 禁止再手动 startLoad,否则会与内部加载竞态、取消 .ts 并永久转圈。
827
+ */
828
+ hlsInteractiveSeek=function(target){
829
+ if(!hls || !video){
830
+ return false;
831
+ }
832
+ if(isNaN(target) || target<0){
833
+ target=0;
834
+ }
835
+ var dur=duration || video.duration || 0;
836
+ if(dur && isFinite(dur) && dur>0 && target>=dur){
837
+ target=Math.max(0,dur-0.3);
838
+ }
839
+ hlsScrubResumePlay=!paused;
840
+ clearSeekRetry();
841
+ hlsResumeWarmup=false;
842
+ hlsResumeTarget=-1;
843
+ seekTime=0;
844
+ seekApplyLock=true;
845
+ try{
846
+ video.currentTime=target;
847
+ }catch(event){
848
+ seekApplyLock=false;
849
+ return false;
850
+ }
851
+ // 短暂锁避免 seeking 钩子里抢先 play 打断分片;seeked 后再恢复
852
+ setTimeout(function(){
853
+ seekApplyLock=false;
854
+ },120);
855
+ return true;
856
+ },
821
857
  /*
822
858
  * destroyStreamPlayers
823
859
  * 功能:切换地址前销毁 hls/flv/mpegts 实例
@@ -830,6 +866,7 @@
830
866
  hlsResumeWarmup=false;
831
867
  hlsLoadAt=-1;
832
868
  hlsLoadTs=0;
869
+ hlsScrubResumePlay=false;
833
870
  decodeRecoverCount=0;
834
871
  if(hls){
835
872
  try{
@@ -995,9 +1032,12 @@
995
1032
  hls=null;
996
1033
  }
997
1034
  var hlsConf={
998
- // 10s 分片流在续播点附近需要略大缓冲,减少卡住转圈
1035
+ // 对齐常见在线 M3U8 播放器:更大前向/后向缓冲,拖动更易命中已缓存区间
1036
+ enableWorker:false,
999
1037
  maxBufferLength:30,
1000
- maxMaxBufferLength:60
1038
+ maxMaxBufferLength:600,
1039
+ maxBufferSize:60*1000*1000,
1040
+ backBufferLength:90
1001
1041
  };
1002
1042
  var resumeAt=seekTime;
1003
1043
  if(!resumeAt){
@@ -2133,7 +2173,10 @@
2133
2173
  seekRetryTimer=setTimeout(function(){
2134
2174
  applyPendingSeek(false);
2135
2175
  },200);
2176
+ return;
2136
2177
  }
2178
+ // 重试耗尽:落到目标片起点,避免永久转圈
2179
+ finishResumeSeek(hlsFragStartTime(t) || loadAt || t);
2137
2180
  return;
2138
2181
  }
2139
2182
  }
@@ -2462,6 +2505,17 @@
2462
2505
  decodeRecoverCount=0;
2463
2506
  startPendingAutoplay();
2464
2507
  pSliderMouseDown=false;
2508
+ waited=true;
2509
+ if(C['buffer']){
2510
+ C['buffer'].hide();
2511
+ }
2512
+ // 用户拖动后恢复播放(标准 video + hls.js 行为)
2513
+ if(hlsScrubResumePlay){
2514
+ hlsScrubResumePlay=false;
2515
+ try{
2516
+ player.play();
2517
+ }catch(event){}
2518
+ }
2465
2519
  eventTarget('seek',{time:this.currentTime,state:'seeked'});
2466
2520
  eventTarget('seeked');
2467
2521
  },
@@ -3528,20 +3582,15 @@
3528
3582
  applyPendingSeek(false);
3529
3583
  return player;
3530
3584
  }
3531
- // HLS:缓冲已覆盖则只定位;否则按对齐点预热,seekTime 保留至 finishResumeSeek
3585
+ // HLS:用户拖动/点击进度 交互跳转(立即定位,不走续播预热强制暂停)
3532
3586
  if(hls){
3533
- seekTime=target;
3534
- hlsResumeTarget=target;
3535
- if(target>1 && hlsCanSafelySeekTo(target)){
3536
- finishResumeSeek(target);
3537
- return player;
3538
- }
3539
- if(target>1){
3540
- hlsResumeWarmup=true;
3541
- hlsSeekTo(target, false);
3542
- applyPendingSeek(false);
3587
+ if(target>0.5 && timeInBuffered(target) && Math.abs((video.currentTime||0)-target)<0.35){
3588
+ seekTime=0;
3589
+ hlsResumeWarmup=false;
3543
3590
  return player;
3544
3591
  }
3592
+ hlsInteractiveSeek(target);
3593
+ return player;
3545
3594
  }
3546
3595
  try{
3547
3596
  video.currentTime=target;
@@ -7361,7 +7410,7 @@
7361
7410
  if(!isRetry && (!vars || vars['cdnFallback']!==false)){
7362
7411
  var cdn=(typeof window!=='undefined' && window.ckplayerPlusCdn) ? window.ckplayerPlusCdn : ckplayerPlusDefaultCdn;
7363
7412
  var m=String(file).match(/\/(hls\.js|flv\.js|mpegts\.js|language)\/([^/?#]+)(?:[?#].*)?$/i);
7364
- if(cdn && cdn.indexOf('1.1.4')===-1 && m){
7413
+ if(cdn && cdn.indexOf('1.1.6')===-1 && m){
7365
7414
  if(cdn.slice(-1)!=='/'){
7366
7415
  cdn+='/';
7367
7416
  }