ckplayer-plus 1.1.8 → 1.1.10
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 +73 -39
- package/dist/ckplayer.min.js +2 -2
- package/dist/index.cjs +46 -33
- package/dist/index.js +46 -33
- package/dist/react.cjs +46 -33
- package/dist/react.js +46 -33
- package/dist/vue.cjs +46 -33
- package/dist/vue.js +46 -33
- 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.10/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.10')>-1){
|
|
453
453
|
// 避免占位版本或显式关闭 CDN 时请求坏地址;交给相对路径或业务 pluginPath
|
|
454
454
|
return folder+'/'+file;
|
|
455
455
|
}
|
|
@@ -804,6 +804,8 @@
|
|
|
804
804
|
}
|
|
805
805
|
// 目标已在缓冲但缺少前片连续区 → 继续按对齐点预热,勿 noop
|
|
806
806
|
}
|
|
807
|
+
// 续播加载起点:前一片(确保解码管线有关键帧),hls.js 会自动向前加载覆盖目标。
|
|
808
|
+
// finishResumeSeek 会调 startLoad(-1) 恢复正常加载,此处无需担心只加载一片。
|
|
807
809
|
var loadAt=hlsPriorLoadTime(target);
|
|
808
810
|
if(!force){
|
|
809
811
|
// 短时间内已对同一对齐点发起加载 → 跳过(防止 onReady 再 seek 取消分片)
|
|
@@ -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,10 +1094,12 @@
|
|
|
1090
1094
|
if(!resumeAt){
|
|
1091
1095
|
resumeAt=parseResumeSeekFromVars();
|
|
1092
1096
|
}
|
|
1093
|
-
//
|
|
1094
|
-
//
|
|
1097
|
+
// 断点续播:保持 hls.js 默认加载(autoStartLoad=true / 自身 startLoad(-1))。
|
|
1098
|
+
// 不可用 autoStartLoad=false + startLoad(target) 或 config.startPosition 从中段起播:
|
|
1099
|
+
// 该路径会让 stream-controller 在首片后卡死在 PARSED,分片能下载却不再 append 进
|
|
1100
|
+
// SourceBuffer(表现为黑屏、拖动转圈)。定位统一走 currentTime,由 hls.js 的
|
|
1101
|
+
// seeking 路径拉片,代价仅为起播时多拉 1~2 片片头。
|
|
1095
1102
|
if(resumeAt && resumeAt>0 && (isUndefined(vars['live']) || !vars['live'])){
|
|
1096
|
-
hlsConf.autoStartLoad=false;
|
|
1097
1103
|
maxSeeTime=Math.max(maxSeeTime,resumeAt);
|
|
1098
1104
|
if(firstSeekTime<0){
|
|
1099
1105
|
firstSeekTime=resumeAt;
|
|
@@ -1110,19 +1116,34 @@
|
|
|
1110
1116
|
hls.on(Hls.Events.MANIFEST_PARSED, function(){
|
|
1111
1117
|
if(seekTime>0 && hlsResumeSettling){
|
|
1112
1118
|
hlsStartPositionUsed=true;
|
|
1113
|
-
hlsSeekTo(seekTime,true);
|
|
1114
1119
|
if(C['buffer']){
|
|
1115
1120
|
C['buffer'].show();
|
|
1116
1121
|
}
|
|
1117
|
-
|
|
1118
|
-
|
|
1122
|
+
// 尽早把 currentTime 推到目标:MediaSource 的 duration 一就绪即可 seek,
|
|
1123
|
+
// 越早越少拉片头分片。之后由 hls.js 的 seeking 路径接管拉片。
|
|
1124
|
+
var doResumeSeek=function(){
|
|
1125
|
+
if(!hlsResumeSettling || !seekTime){return;}
|
|
1126
|
+
var t=seekTime;
|
|
1127
|
+
if(video && video.seekable && video.seekable.length>0 && video.seekable.end(0)>=t){
|
|
1128
|
+
finishResumeSeek(t);
|
|
1119
1129
|
return;
|
|
1120
1130
|
}
|
|
1121
|
-
|
|
1122
|
-
if(
|
|
1131
|
+
seekRetryCount++;
|
|
1132
|
+
if(seekRetryCount<=100){
|
|
1133
|
+
if(seekRetryTimer){clearTimeout(seekRetryTimer);}
|
|
1134
|
+
seekRetryTimer=setTimeout(doResumeSeek,50);
|
|
1135
|
+
}
|
|
1136
|
+
else{
|
|
1123
1137
|
finishResumeSeek(t);
|
|
1124
1138
|
}
|
|
1125
|
-
}
|
|
1139
|
+
};
|
|
1140
|
+
doResumeSeek();
|
|
1141
|
+
// 超时兜底
|
|
1142
|
+
setTimeout(function(){
|
|
1143
|
+
if(hlsResumeSettling && seekTime>0){
|
|
1144
|
+
finishResumeSeek(seekTime);
|
|
1145
|
+
}
|
|
1146
|
+
},10000);
|
|
1126
1147
|
return;
|
|
1127
1148
|
}
|
|
1128
1149
|
if(!hlsStartPositionUsed){
|
|
@@ -1185,9 +1206,12 @@
|
|
|
1185
1206
|
}catch(errRecover){}
|
|
1186
1207
|
}
|
|
1187
1208
|
}
|
|
1188
|
-
|
|
1189
|
-
|
|
1209
|
+
// 只有致命错误才向业务抛 error 事件并显示错误覆盖。
|
|
1210
|
+
// bufferStalledError / fragParsingError 等非致命错误由 hls.js 内部恢复,
|
|
1211
|
+
// 不应导致 UI 报 "加载失败" 遮挡正常播放。
|
|
1190
1212
|
if(fatal){
|
|
1213
|
+
CT.error={code:code,message:message};
|
|
1214
|
+
eventTarget('error',CT.error);
|
|
1191
1215
|
showError();
|
|
1192
1216
|
}
|
|
1193
1217
|
});
|
|
@@ -2070,8 +2094,8 @@
|
|
|
2070
2094
|
},
|
|
2071
2095
|
/*
|
|
2072
2096
|
* hlsCanSafelySeekTo
|
|
2073
|
-
*
|
|
2074
|
-
*
|
|
2097
|
+
* 功能:目标点已进入 MSE buffered 后才允许 currentTime
|
|
2098
|
+
* 解码失败时 recoverDecodeError 仍会回退前一片建立解码管线
|
|
2075
2099
|
*/
|
|
2076
2100
|
hlsCanSafelySeekTo=function(t){
|
|
2077
2101
|
if(!video || isUndefined(video.buffered) || isNaN(t) || t<0){
|
|
@@ -2080,33 +2104,22 @@
|
|
|
2080
2104
|
if(!timeInBuffered(t)){
|
|
2081
2105
|
return false;
|
|
2082
2106
|
}
|
|
2083
|
-
|
|
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;
|
|
2107
|
+
return true;
|
|
2096
2108
|
},
|
|
2097
2109
|
/*
|
|
2098
2110
|
* tryCompleteResumeSeek
|
|
2099
|
-
*
|
|
2111
|
+
* 功能:续播预热完成后,目标时间已在 buffered 则定位;否则定位到片起点(保证有画面)
|
|
2100
2112
|
*/
|
|
2101
2113
|
tryCompleteResumeSeek=function(t){
|
|
2102
2114
|
if(!hlsResumeSettling || isNaN(t) || t<=0 || !video){
|
|
2103
2115
|
return false;
|
|
2104
2116
|
}
|
|
2105
|
-
|
|
2106
|
-
|
|
2107
|
-
return
|
|
2117
|
+
// 严格检查:目标时间必须在 buffered 区间内部(不含边缘)才算就绪
|
|
2118
|
+
if(!timeInBuffered(t)){
|
|
2119
|
+
return false;
|
|
2108
2120
|
}
|
|
2109
|
-
|
|
2121
|
+
finishResumeSeek(t);
|
|
2122
|
+
return true;
|
|
2110
2123
|
},
|
|
2111
2124
|
/*
|
|
2112
2125
|
* finishResumeSeek
|
|
@@ -2115,8 +2128,10 @@
|
|
|
2115
2128
|
finishResumeSeek=function(t){
|
|
2116
2129
|
hlsResumeWarmup=false;
|
|
2117
2130
|
hlsResumeSettling=false;
|
|
2118
|
-
// 续播场景取消挂起的自动播放,统一改为点击播放
|
|
2119
2131
|
autoplayPending=false;
|
|
2132
|
+
// 注意:此处不可再调 hls.startLoad()。MANIFEST_PARSED 里的 startLoad(target)
|
|
2133
|
+
// 已进入正常加载循环,二次 startLoad 会在首片 append 途中重置 BufferController,
|
|
2134
|
+
// 使 SourceBuffer 操作队列永久阻塞(stream-controller 卡在 PARSED,分片下载但不入 MSE)。
|
|
2120
2135
|
applySeekToMedia(t);
|
|
2121
2136
|
setTimeout(function(){
|
|
2122
2137
|
if(!video){return;}
|
|
@@ -2184,6 +2199,11 @@
|
|
|
2184
2199
|
if(!seekTime || !video || seekApplyLock){
|
|
2185
2200
|
return;
|
|
2186
2201
|
}
|
|
2202
|
+
// 续播期间由 FRAG_BUFFERED + tryCompleteResumeSeek 处理定位,不在此处发起
|
|
2203
|
+
// 避免 canPlay/loadedMetaData 调用 applyPendingSeek → hlsSeekTo → startLoad 打断正在进行的加载
|
|
2204
|
+
if(hlsResumeSettling && hls){
|
|
2205
|
+
return;
|
|
2206
|
+
}
|
|
2187
2207
|
if(!isUndefined(vars['live']) && ((valType(vars['live'])=='boolean' && vars['live']) || valType(vars['live'])=='number')){
|
|
2188
2208
|
return;
|
|
2189
2209
|
}
|
|
@@ -2559,10 +2579,24 @@
|
|
|
2559
2579
|
seekApplyLock=false;
|
|
2560
2580
|
decodeRecoverCount=0;
|
|
2561
2581
|
hlsScrubbing=false;
|
|
2562
|
-
|
|
2582
|
+
// MSE 首次追加非零时间轴分片时,浏览器会自动把 currentTime 推到该片起点并触发 seeked。
|
|
2583
|
+
// 这不是续播完成,不能清除 settling;等待目标点真正进入 buffered。
|
|
2584
|
+
var resumePending=false;
|
|
2585
|
+
if(hlsResumeSettling && hlsResumeTarget>0){
|
|
2586
|
+
// 续播期间的 seeked 分两种情况:
|
|
2587
|
+
// 1) MSE 首次追加非零时间轴分片时自动跳到片起点(中间 seeked,不是最终定位)
|
|
2588
|
+
// 2) finishResumeSeek 后的最终 seeked(此时 hlsResumeSettling 已被清除,不会进入此分支)
|
|
2589
|
+
// 只要续播标志还在,就保持 pending,让 tryCompleteResumeSeek/超时兜底来完成
|
|
2590
|
+
resumePending=true;
|
|
2591
|
+
}
|
|
2592
|
+
if(!resumePending){
|
|
2593
|
+
hlsResumeSettling=false;
|
|
2594
|
+
}
|
|
2563
2595
|
startPendingAutoplay();
|
|
2564
2596
|
pSliderMouseDown=false;
|
|
2565
|
-
|
|
2597
|
+
if(!resumePending){
|
|
2598
|
+
hidePlaybackBuffer();
|
|
2599
|
+
}
|
|
2566
2600
|
// 用户拖动后恢复播放(标准 video + hls.js 行为)
|
|
2567
2601
|
if(hlsScrubResumePlay){
|
|
2568
2602
|
hlsScrubResumePlay=false;
|
|
@@ -7481,7 +7515,7 @@
|
|
|
7481
7515
|
if(!isRetry && (!vars || vars['cdnFallback']!==false)){
|
|
7482
7516
|
var cdn=(typeof window!=='undefined' && window.ckplayerPlusCdn) ? window.ckplayerPlusCdn : ckplayerPlusDefaultCdn;
|
|
7483
7517
|
var m=String(file).match(/\/(hls\.js|flv\.js|mpegts\.js|language)\/([^/?#]+)(?:[?#].*)?$/i);
|
|
7484
|
-
if(cdn && cdn.indexOf('1.1.
|
|
7518
|
+
if(cdn && cdn.indexOf('1.1.10')===-1 && m){
|
|
7485
7519
|
if(cdn.slice(-1)!=='/'){
|
|
7486
7520
|
cdn+='/';
|
|
7487
7521
|
}
|