ckplayer-plus 1.1.7 → 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 +84 -51
- package/dist/ckplayer.min.js +2 -2
- package/dist/index.cjs +63 -43
- package/dist/index.js +63 -43
- package/dist/react.cjs +63 -43
- package/dist/react.js +63 -43
- package/dist/vue.cjs +63 -43
- package/dist/vue.js +63 -43
- package/package.json +1 -1
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.
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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{
|
|
@@ -1090,9 +1094,10 @@
|
|
|
1090
1094
|
if(!resumeAt){
|
|
1091
1095
|
resumeAt=parseResumeSeekFromVars();
|
|
1092
1096
|
}
|
|
1093
|
-
//
|
|
1094
|
-
//
|
|
1097
|
+
// 断点续播:关闭 autoStartLoad,清单解析后从目标前一片 startLoad,缓冲就绪再定位。
|
|
1098
|
+
// 与拖动路径分离(拖动只改 currentTime,不手动 startLoad)。
|
|
1095
1099
|
if(resumeAt && resumeAt>0 && (isUndefined(vars['live']) || !vars['live'])){
|
|
1100
|
+
hlsConf.autoStartLoad=false;
|
|
1096
1101
|
maxSeeTime=Math.max(maxSeeTime,resumeAt);
|
|
1097
1102
|
if(firstSeekTime<0){
|
|
1098
1103
|
firstSeekTime=resumeAt;
|
|
@@ -1101,6 +1106,7 @@
|
|
|
1101
1106
|
hlsResumeTarget=resumeAt;
|
|
1102
1107
|
hlsResumeSettling=true;
|
|
1103
1108
|
hlsResumeWarmup=false;
|
|
1109
|
+
autoplayPending=false;
|
|
1104
1110
|
}
|
|
1105
1111
|
hls = new Hls(hlsConf);
|
|
1106
1112
|
hls.loadSource(url);
|
|
@@ -1108,31 +1114,19 @@
|
|
|
1108
1114
|
hls.on(Hls.Events.MANIFEST_PARSED, function(){
|
|
1109
1115
|
if(seekTime>0 && hlsResumeSettling){
|
|
1110
1116
|
hlsStartPositionUsed=true;
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
return;
|
|
1117
|
-
}
|
|
1118
|
-
seekRetryCount++;
|
|
1119
|
-
if(seekRetryCount<=25){
|
|
1120
|
-
if(seekRetryTimer){
|
|
1121
|
-
clearTimeout(seekRetryTimer);
|
|
1122
|
-
}
|
|
1123
|
-
seekRetryTimer=setTimeout(tryResume,120);
|
|
1124
|
-
}
|
|
1125
|
-
else{
|
|
1126
|
-
finishResumeSeek(t);
|
|
1127
|
-
}
|
|
1128
|
-
};
|
|
1129
|
-
tryResume();
|
|
1130
|
-
// 超时兜底:避免永久转圈
|
|
1117
|
+
hlsSeekTo(seekTime,true);
|
|
1118
|
+
if(C['buffer']){
|
|
1119
|
+
C['buffer'].show();
|
|
1120
|
+
}
|
|
1121
|
+
// 超时兜底:若 10s 后续播仍未完成,强制定位到片起点避免永久转圈
|
|
1131
1122
|
setTimeout(function(){
|
|
1132
|
-
if(hlsResumeSettling
|
|
1133
|
-
|
|
1123
|
+
if(hlsResumeSettling){
|
|
1124
|
+
var t=seekTime>0?seekTime:hlsResumeTarget;
|
|
1125
|
+
if(t>0){
|
|
1126
|
+
finishResumeSeek(t);
|
|
1127
|
+
}
|
|
1134
1128
|
}
|
|
1135
|
-
},
|
|
1129
|
+
},10000);
|
|
1136
1130
|
return;
|
|
1137
1131
|
}
|
|
1138
1132
|
if(!hlsStartPositionUsed){
|
|
@@ -1140,7 +1134,9 @@
|
|
|
1140
1134
|
}
|
|
1141
1135
|
});
|
|
1142
1136
|
hls.on(Hls.Events.FRAG_BUFFERED, function(event, data){
|
|
1143
|
-
if(hlsResumeSettling && seekTime>0){
|
|
1137
|
+
if(hlsResumeSettling && (seekTime>0 || hlsResumeTarget>0)){
|
|
1138
|
+
var resumeT=seekTime>0?seekTime:hlsResumeTarget;
|
|
1139
|
+
tryCompleteResumeSeek(resumeT);
|
|
1144
1140
|
return;
|
|
1145
1141
|
}
|
|
1146
1142
|
if(hlsResumeTarget<=0 || !data || !data.frag){
|
|
@@ -2078,8 +2074,8 @@
|
|
|
2078
2074
|
},
|
|
2079
2075
|
/*
|
|
2080
2076
|
* hlsCanSafelySeekTo
|
|
2081
|
-
*
|
|
2082
|
-
*
|
|
2077
|
+
* 功能:目标点已进入 MSE buffered 后才允许 currentTime
|
|
2078
|
+
* 解码失败时 recoverDecodeError 仍会回退前一片建立解码管线
|
|
2083
2079
|
*/
|
|
2084
2080
|
hlsCanSafelySeekTo=function(t){
|
|
2085
2081
|
if(!video || isUndefined(video.buffered) || isNaN(t) || t<0){
|
|
@@ -2088,24 +2084,25 @@
|
|
|
2088
2084
|
if(!timeInBuffered(t)){
|
|
2089
2085
|
return false;
|
|
2090
2086
|
}
|
|
2091
|
-
|
|
2092
|
-
|
|
2093
|
-
|
|
2094
|
-
|
|
2095
|
-
|
|
2096
|
-
|
|
2097
|
-
|
|
2098
|
-
|
|
2099
|
-
|
|
2100
|
-
|
|
2101
|
-
|
|
2102
|
-
|
|
2087
|
+
return true;
|
|
2088
|
+
},
|
|
2089
|
+
/*
|
|
2090
|
+
* tryCompleteResumeSeek
|
|
2091
|
+
* 功能:续播预热完成后,缓冲已覆盖前片→目标时再定位
|
|
2092
|
+
*/
|
|
2093
|
+
tryCompleteResumeSeek=function(t){
|
|
2094
|
+
if(!hlsResumeSettling || isNaN(t) || t<=0 || !video){
|
|
2095
|
+
return false;
|
|
2096
|
+
}
|
|
2097
|
+
if(hlsCanSafelySeekTo(t)){
|
|
2098
|
+
finishResumeSeek(t);
|
|
2099
|
+
return true;
|
|
2100
|
+
}
|
|
2103
2101
|
return false;
|
|
2104
2102
|
},
|
|
2105
2103
|
/*
|
|
2106
2104
|
* finishResumeSeek
|
|
2107
2105
|
* 功能:完成续播定位。只 seek、不自动 play(由用户点击中央按钮/播放键)
|
|
2108
|
-
* ZW 模型:直接 currentTime,不依赖前片预热完成态
|
|
2109
2106
|
*/
|
|
2110
2107
|
finishResumeSeek=function(t){
|
|
2111
2108
|
hlsResumeWarmup=false;
|
|
@@ -2173,7 +2170,7 @@
|
|
|
2173
2170
|
/*
|
|
2174
2171
|
* applyPendingSeek
|
|
2175
2172
|
* 功能:在媒体就绪后应用挂起的 seekTime
|
|
2176
|
-
* HLS
|
|
2173
|
+
* HLS 续播:startLoad 预热 + 缓冲就绪后 finishResumeSeek(与拖动 currentTime 路径分离)
|
|
2177
2174
|
*/
|
|
2178
2175
|
applyPendingSeek=function(force){
|
|
2179
2176
|
if(!seekTime || !video || seekApplyLock){
|
|
@@ -2199,9 +2196,22 @@
|
|
|
2199
2196
|
firstSeekTime=t;
|
|
2200
2197
|
}
|
|
2201
2198
|
}
|
|
2202
|
-
// HLS:媒体元数据就绪即可定位(由 hls.js 响应 seeking 拉片)
|
|
2203
2199
|
if(hls){
|
|
2204
2200
|
hlsResumeSettling=true;
|
|
2201
|
+
hlsResumeTarget=t;
|
|
2202
|
+
autoplayPending=false;
|
|
2203
|
+
if(hlsResumeWarmup){
|
|
2204
|
+
return;
|
|
2205
|
+
}
|
|
2206
|
+
if(tryCompleteResumeSeek(t)){
|
|
2207
|
+
return;
|
|
2208
|
+
}
|
|
2209
|
+
if(hlsSeekTo(t,force)){
|
|
2210
|
+
if(C['buffer']){
|
|
2211
|
+
C['buffer'].show();
|
|
2212
|
+
}
|
|
2213
|
+
return;
|
|
2214
|
+
}
|
|
2205
2215
|
if(!force && (!isUndefined(video.readyState) && video.readyState<1) && !(dur && isFinite(dur) && dur>0)){
|
|
2206
2216
|
seekRetryCount++;
|
|
2207
2217
|
if(seekRetryCount<=40){
|
|
@@ -2541,10 +2551,33 @@
|
|
|
2541
2551
|
seekApplyLock=false;
|
|
2542
2552
|
decodeRecoverCount=0;
|
|
2543
2553
|
hlsScrubbing=false;
|
|
2544
|
-
|
|
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
|
+
}
|
|
2545
2576
|
startPendingAutoplay();
|
|
2546
2577
|
pSliderMouseDown=false;
|
|
2547
|
-
|
|
2578
|
+
if(!resumePending){
|
|
2579
|
+
hidePlaybackBuffer();
|
|
2580
|
+
}
|
|
2548
2581
|
// 用户拖动后恢复播放(标准 video + hls.js 行为)
|
|
2549
2582
|
if(hlsScrubResumePlay){
|
|
2550
2583
|
hlsScrubResumePlay=false;
|
|
@@ -7463,7 +7496,7 @@
|
|
|
7463
7496
|
if(!isRetry && (!vars || vars['cdnFallback']!==false)){
|
|
7464
7497
|
var cdn=(typeof window!=='undefined' && window.ckplayerPlusCdn) ? window.ckplayerPlusCdn : ckplayerPlusDefaultCdn;
|
|
7465
7498
|
var m=String(file).match(/\/(hls\.js|flv\.js|mpegts\.js|language)\/([^/?#]+)(?:[?#].*)?$/i);
|
|
7466
|
-
if(cdn && cdn.indexOf('1.1.
|
|
7499
|
+
if(cdn && cdn.indexOf('1.1.9')===-1 && m){
|
|
7467
7500
|
if(cdn.slice(-1)!=='/'){
|
|
7468
7501
|
cdn+='/';
|
|
7469
7502
|
}
|