ckplayer-plus 1.1.8 → 1.1.9

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.8/dist/';
144
+ var ckplayerPlusDefaultCdn='https://cdn.jsdelivr.net/npm/ckplayer-plus@1.1.9/dist/';
145
145
  function ckplayerEmbed(videoObj){
146
146
  /*
147
147
  * rightMenu
@@ -449,7 +449,7 @@
449
449
  }
450
450
  var allowCdn=!vars || vars['cdnFallback']!==false;
451
451
  var cdn=(typeof window!=='undefined' && window.ckplayerPlusCdn) ? window.ckplayerPlusCdn : ckplayerPlusDefaultCdn;
452
- if(!allowCdn || !cdn || cdn.indexOf('1.1.8')>-1){
452
+ if(!allowCdn || !cdn || cdn.indexOf('1.1.9')>-1){
453
453
  // 避免占位版本或显式关闭 CDN 时请求坏地址;交给相对路径或业务 pluginPath
454
454
  return folder+'/'+file;
455
455
  }
@@ -804,7 +804,9 @@
804
804
  }
805
805
  // 目标已在缓冲但缺少前片连续区 → 继续按对齐点预热,勿 noop
806
806
  }
807
- var loadAt=hlsPriorLoadTime(target);
807
+ // 首次续播直接加载包含目标时间的分片。暂停状态下 hls.js 通常只预载一片,
808
+ // 若从前一片开始会停在前片末尾,目标时间永远无法进入 buffered。
809
+ var loadAt=hlsFragStartTime(target);
808
810
  if(!force){
809
811
  // 短时间内已对同一对齐点发起加载 → 跳过(防止 onReady 再 seek 取消分片)
810
812
  if(hlsLoadAt>=0 && Math.abs(hlsLoadAt-loadAt)<1.5 && (Date.now()-hlsLoadTs)<4000){
@@ -982,7 +984,9 @@
982
984
  return;
983
985
  }
984
986
  else{
985
- if(vars['plug'] && !canPlay(vstr)){
987
+ // preferBuiltinPlug=true 时强制走指定流媒体内核。
988
+ // 新版 Chromium 可能宣称原生支持 HLS,但部分 TS 流在 seek 后只连续下载、不写入 buffer。
989
+ if(vars['plug'] && (vars['preferBuiltinPlug'] || !canPlay(vstr))){
986
990
  plugPlayer(vstr);
987
991
  }
988
992
  else{
@@ -996,7 +1000,7 @@
996
1000
  else if(valType(vstr)=='array'){
997
1001
  for(i=0;i<vstr.length;i++){
998
1002
  if(valType(vstr[i])=='array'){
999
- if(vars['plug'] && !canPlay(vstr[i][0])){
1003
+ if(vars['plug'] && (vars['preferBuiltinPlug'] || !canPlay(vstr[i][0]))){
1000
1004
  plugPlayer(vstr[i][0]);
1001
1005
  }
1002
1006
  else{
@@ -1114,15 +1118,15 @@
1114
1118
  if(C['buffer']){
1115
1119
  C['buffer'].show();
1116
1120
  }
1121
+ // 超时兜底:若 10s 后续播仍未完成,强制定位到片起点避免永久转圈
1117
1122
  setTimeout(function(){
1118
- if(!hlsResumeSettling){
1119
- return;
1120
- }
1121
- var t=seekTime>0?seekTime:hlsResumeTarget;
1122
- if(t>0 && !tryCompleteResumeSeek(t) && hlsResumeSettling){
1123
- finishResumeSeek(t);
1123
+ if(hlsResumeSettling){
1124
+ var t=seekTime>0?seekTime:hlsResumeTarget;
1125
+ if(t>0){
1126
+ finishResumeSeek(t);
1127
+ }
1124
1128
  }
1125
- },8000);
1129
+ },10000);
1126
1130
  return;
1127
1131
  }
1128
1132
  if(!hlsStartPositionUsed){
@@ -2070,8 +2074,8 @@
2070
2074
  },
2071
2075
  /*
2072
2076
  * hlsCanSafelySeekTo
2073
- * 功能:从预热加载起点(目标前一片)到目标点已连续缓冲,才允许 currentTime
2074
- * 避免分片未完整进入 MSE 时中途 seek 触发 PIPELINE_ERROR_DECODE / 永久 loading
2077
+ * 功能:目标点已进入 MSE buffered 后才允许 currentTime
2078
+ * 解码失败时 recoverDecodeError 仍会回退前一片建立解码管线
2075
2079
  */
2076
2080
  hlsCanSafelySeekTo=function(t){
2077
2081
  if(!video || isUndefined(video.buffered) || isNaN(t) || t<0){
@@ -2080,19 +2084,7 @@
2080
2084
  if(!timeInBuffered(t)){
2081
2085
  return false;
2082
2086
  }
2083
- var loadStart=hlsPriorLoadTime(t);
2084
- // 同一连续区间需覆盖预热起点→目标
2085
- try{
2086
- var buf=video.buffered;
2087
- for(var i=0;i<buf.length;i++){
2088
- var start=buf.start(i);
2089
- var end=buf.end(i);
2090
- if(loadStart>=start-0.35 && t<=end+0.15){
2091
- return true;
2092
- }
2093
- }
2094
- }catch(event){}
2095
- return false;
2087
+ return true;
2096
2088
  },
2097
2089
  /*
2098
2090
  * tryCompleteResumeSeek
@@ -2559,10 +2551,33 @@
2559
2551
  seekApplyLock=false;
2560
2552
  decodeRecoverCount=0;
2561
2553
  hlsScrubbing=false;
2562
- hlsResumeSettling=false;
2554
+ // MSE 首次追加非零时间轴分片时,浏览器会自动把 currentTime 推到该片起点并触发 seeked。
2555
+ // 这不是续播完成,不能清除 settling;等待目标点真正进入 buffered。
2556
+ var resumePending=false;
2557
+ if(hlsResumeSettling && hlsResumeTarget>0){
2558
+ if(!timeInBuffered(hlsResumeTarget)){
2559
+ resumePending=true;
2560
+ }
2561
+ else if(Math.abs(this.currentTime-hlsResumeTarget)>0.5){
2562
+ // FRAG_BUFFERED 可能先把目标设为 120,随后 MSE 又自动回拨到首个 buffered 起点。
2563
+ // 等本轮 seeked 结束后再次应用目标,下一次 seeked 才是真正完成。
2564
+ resumePending=true;
2565
+ var resumeTarget=hlsResumeTarget;
2566
+ setTimeout(function(){
2567
+ if(hlsResumeSettling && timeInBuffered(resumeTarget)){
2568
+ finishResumeSeek(resumeTarget);
2569
+ }
2570
+ },0);
2571
+ }
2572
+ }
2573
+ if(!resumePending){
2574
+ hlsResumeSettling=false;
2575
+ }
2563
2576
  startPendingAutoplay();
2564
2577
  pSliderMouseDown=false;
2565
- hidePlaybackBuffer();
2578
+ if(!resumePending){
2579
+ hidePlaybackBuffer();
2580
+ }
2566
2581
  // 用户拖动后恢复播放(标准 video + hls.js 行为)
2567
2582
  if(hlsScrubResumePlay){
2568
2583
  hlsScrubResumePlay=false;
@@ -7481,7 +7496,7 @@
7481
7496
  if(!isRetry && (!vars || vars['cdnFallback']!==false)){
7482
7497
  var cdn=(typeof window!=='undefined' && window.ckplayerPlusCdn) ? window.ckplayerPlusCdn : ckplayerPlusDefaultCdn;
7483
7498
  var m=String(file).match(/\/(hls\.js|flv\.js|mpegts\.js|language)\/([^/?#]+)(?:[?#].*)?$/i);
7484
- if(cdn && cdn.indexOf('1.1.8')===-1 && m){
7499
+ if(cdn && cdn.indexOf('1.1.9')===-1 && m){
7485
7500
  if(cdn.slice(-1)!=='/'){
7486
7501
  cdn+='/';
7487
7502
  }