ckplayer-plus 1.1.5 → 1.1.7
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 +207 -151
- package/dist/ckplayer.min.js +2 -2
- package/dist/index.cjs +185 -141
- package/dist/index.js +185 -141
- package/dist/react.cjs +185 -141
- package/dist/react.js +185 -141
- package/dist/vue.cjs +185 -141
- package/dist/vue.js +185 -141
- 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.7/dist/';
|
|
145
145
|
function ckplayerEmbed(videoObj){
|
|
146
146
|
/*
|
|
147
147
|
* rightMenu
|
|
@@ -181,6 +181,9 @@
|
|
|
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 时恢复播放
|
|
185
|
+
var hlsScrubbing=false;//进度条拖动中(seeking 钩子跳过二次 seek)
|
|
186
|
+
var hlsResumeSettling=false;//断点续播定位中(弱化 waiting、跳过二次 seek)
|
|
184
187
|
var oldTime=0,playTime=0,firstSeekTime=-1,maxSeeTime=0;//oldTime=记录上次播放时间,playTime=当前播放时间,firstSeekTime=记录第一次拖动的时间,maxSeeTime=看过的最大时间
|
|
185
188
|
var isChangeDef=true;//是否需要重置清晰度
|
|
186
189
|
var playType='';//播放类别,默认='',是通过api接口播放,='button'则判定是通过点击按钮播放
|
|
@@ -446,7 +449,7 @@
|
|
|
446
449
|
}
|
|
447
450
|
var allowCdn=!vars || vars['cdnFallback']!==false;
|
|
448
451
|
var cdn=(typeof window!=='undefined' && window.ckplayerPlusCdn) ? window.ckplayerPlusCdn : ckplayerPlusDefaultCdn;
|
|
449
|
-
if(!allowCdn || !cdn || cdn.indexOf('1.1.
|
|
452
|
+
if(!allowCdn || !cdn || cdn.indexOf('1.1.7')>-1){
|
|
450
453
|
// 避免占位版本或显式关闭 CDN 时请求坏地址;交给相对路径或业务 pluginPath
|
|
451
454
|
return folder+'/'+file;
|
|
452
455
|
}
|
|
@@ -820,52 +823,82 @@
|
|
|
820
823
|
},
|
|
821
824
|
/*
|
|
822
825
|
* hlsInteractiveSeek
|
|
823
|
-
* 功能:用户拖动/点击进度条时的 HLS
|
|
824
|
-
*
|
|
826
|
+
* 功能:用户拖动/点击进度条时的 HLS 跳转
|
|
827
|
+
* 对齐三站/标准 hls.js:只改 video.currentTime,由 hls.js 内部响应 seeking 拉片。
|
|
825
828
|
*/
|
|
826
829
|
hlsInteractiveSeek=function(target){
|
|
827
|
-
if(!hls || !video
|
|
830
|
+
if(!hls || !video){
|
|
828
831
|
return false;
|
|
829
832
|
}
|
|
830
833
|
if(isNaN(target) || target<0){
|
|
831
834
|
target=0;
|
|
832
835
|
}
|
|
836
|
+
var dur=duration || video.duration || 0;
|
|
837
|
+
if(dur && isFinite(dur) && dur>0 && target>=dur){
|
|
838
|
+
target=Math.max(0,dur-0.3);
|
|
839
|
+
}
|
|
833
840
|
var wasPlaying=!paused;
|
|
841
|
+
hlsScrubbing=true;
|
|
842
|
+
hlsScrubResumePlay=wasPlaying;
|
|
834
843
|
clearSeekRetry();
|
|
835
|
-
// 退出续播预热态,避免拖动被当成断点续播而一直等前片 / 强制暂停
|
|
836
844
|
hlsResumeWarmup=false;
|
|
837
|
-
|
|
845
|
+
hlsResumeSettling=false;
|
|
846
|
+
hlsResumeTarget=-1;
|
|
838
847
|
seekTime=0;
|
|
839
848
|
seekApplyLock=true;
|
|
840
|
-
|
|
841
|
-
if(
|
|
842
|
-
|
|
849
|
+
// 已在缓冲区内:秒切并尽快恢复播放
|
|
850
|
+
if(timeInBuffered(target)){
|
|
851
|
+
try{
|
|
852
|
+
video.currentTime=target;
|
|
853
|
+
}catch(event){
|
|
854
|
+
seekApplyLock=false;
|
|
855
|
+
hlsScrubbing=false;
|
|
856
|
+
return false;
|
|
857
|
+
}
|
|
858
|
+
setTimeout(function(){
|
|
859
|
+
seekApplyLock=false;
|
|
860
|
+
hlsScrubbing=false;
|
|
861
|
+
if(C['buffer']){
|
|
862
|
+
C['buffer'].hide();
|
|
863
|
+
}
|
|
864
|
+
waited=true;
|
|
865
|
+
if(wasPlaying){
|
|
866
|
+
hlsScrubResumePlay=false;
|
|
867
|
+
try{
|
|
868
|
+
player.play();
|
|
869
|
+
}catch(errPlay){}
|
|
870
|
+
}
|
|
871
|
+
else{
|
|
872
|
+
hlsScrubResumePlay=false;
|
|
873
|
+
}
|
|
874
|
+
},80);
|
|
875
|
+
return true;
|
|
843
876
|
}
|
|
844
|
-
hlsLoadAt=loadAt;
|
|
845
|
-
hlsLoadTs=Date.now();
|
|
846
|
-
try{
|
|
847
|
-
hls.startLoad(loadAt);
|
|
848
|
-
}catch(event){}
|
|
849
877
|
try{
|
|
850
878
|
video.currentTime=target;
|
|
851
879
|
}catch(event){
|
|
852
|
-
|
|
880
|
+
seekApplyLock=false;
|
|
881
|
+
hlsScrubbing=false;
|
|
882
|
+
return false;
|
|
853
883
|
}
|
|
854
884
|
setTimeout(function(){
|
|
855
885
|
seekApplyLock=false;
|
|
856
|
-
|
|
857
|
-
if(C['buffer']){
|
|
858
|
-
C['buffer'].hide();
|
|
859
|
-
}
|
|
860
|
-
waited=true;
|
|
861
|
-
if(wasPlaying && paused){
|
|
862
|
-
try{
|
|
863
|
-
player.play();
|
|
864
|
-
}catch(errPlay){}
|
|
865
|
-
}
|
|
866
|
-
},200);
|
|
886
|
+
},120);
|
|
867
887
|
return true;
|
|
868
888
|
},
|
|
889
|
+
/*
|
|
890
|
+
* hidePlaybackBuffer
|
|
891
|
+
* 功能:统一关闭 loading/转圈(seeked/canplay/续播完成共用)
|
|
892
|
+
*/
|
|
893
|
+
hidePlaybackBuffer=function(){
|
|
894
|
+
waited=true;
|
|
895
|
+
if(C['buffer']){
|
|
896
|
+
C['buffer'].hide();
|
|
897
|
+
}
|
|
898
|
+
if(C['loading']){
|
|
899
|
+
C['loading'].hide();
|
|
900
|
+
}
|
|
901
|
+
},
|
|
869
902
|
/*
|
|
870
903
|
* destroyStreamPlayers
|
|
871
904
|
* 功能:切换地址前销毁 hls/flv/mpegts 实例
|
|
@@ -878,6 +911,9 @@
|
|
|
878
911
|
hlsResumeWarmup=false;
|
|
879
912
|
hlsLoadAt=-1;
|
|
880
913
|
hlsLoadTs=0;
|
|
914
|
+
hlsScrubResumePlay=false;
|
|
915
|
+
hlsScrubbing=false;
|
|
916
|
+
hlsResumeSettling=false;
|
|
881
917
|
decodeRecoverCount=0;
|
|
882
918
|
if(hls){
|
|
883
919
|
try{
|
|
@@ -1043,16 +1079,19 @@
|
|
|
1043
1079
|
hls=null;
|
|
1044
1080
|
}
|
|
1045
1081
|
var hlsConf={
|
|
1046
|
-
//
|
|
1082
|
+
// 对齐常见在线 M3U8 播放器:更大前向/后向缓冲,拖动更易命中已缓存区间
|
|
1083
|
+
enableWorker:false,
|
|
1047
1084
|
maxBufferLength:30,
|
|
1048
|
-
maxMaxBufferLength:
|
|
1085
|
+
maxMaxBufferLength:600,
|
|
1086
|
+
maxBufferSize:60*1000*1000,
|
|
1087
|
+
backBufferLength:90
|
|
1049
1088
|
};
|
|
1050
1089
|
var resumeAt=seekTime;
|
|
1051
1090
|
if(!resumeAt){
|
|
1052
1091
|
resumeAt=parseResumeSeekFromVars();
|
|
1053
1092
|
}
|
|
1054
|
-
//
|
|
1055
|
-
//
|
|
1093
|
+
// 断点续播对齐 ZWPlayer:保持默认 autoStartLoad,媒体就绪后 currentTime=seek。
|
|
1094
|
+
// 不再 autoStartLoad:false + 手动 startLoad 预热(易自相 cancel)。
|
|
1056
1095
|
if(resumeAt && resumeAt>0 && (isUndefined(vars['live']) || !vars['live'])){
|
|
1057
1096
|
maxSeeTime=Math.max(maxSeeTime,resumeAt);
|
|
1058
1097
|
if(firstSeekTime<0){
|
|
@@ -1060,36 +1099,40 @@
|
|
|
1060
1099
|
}
|
|
1061
1100
|
seekTime=resumeAt;
|
|
1062
1101
|
hlsResumeTarget=resumeAt;
|
|
1063
|
-
|
|
1064
|
-
|
|
1102
|
+
hlsResumeSettling=true;
|
|
1103
|
+
hlsResumeWarmup=false;
|
|
1065
1104
|
}
|
|
1066
1105
|
hls = new Hls(hlsConf);
|
|
1067
1106
|
hls.loadSource(url);
|
|
1068
1107
|
hls.attachMedia(video);
|
|
1069
1108
|
hls.on(Hls.Events.MANIFEST_PARSED, function(){
|
|
1070
|
-
if(
|
|
1071
|
-
var loadAt=hlsPriorLoadTime(seekTime);
|
|
1072
|
-
hlsLoadAt=loadAt;
|
|
1073
|
-
hlsLoadTs=Date.now();
|
|
1109
|
+
if(seekTime>0 && hlsResumeSettling){
|
|
1074
1110
|
hlsStartPositionUsed=true;
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
if(!hlsResumeWarmup || !seekTime){return;}
|
|
1081
|
-
var target=seekTime;
|
|
1082
|
-
if(hlsCanSafelySeekTo(target)){
|
|
1083
|
-
finishResumeSeek(target);
|
|
1111
|
+
var tryResume=function(){
|
|
1112
|
+
if(!seekTime || !hlsResumeSettling){return;}
|
|
1113
|
+
var t=seekTime;
|
|
1114
|
+
if(video && (video.readyState>=1 || (duration && isFinite(duration) && duration>0))){
|
|
1115
|
+
finishResumeSeek(t);
|
|
1084
1116
|
return;
|
|
1085
1117
|
}
|
|
1086
|
-
|
|
1087
|
-
if(
|
|
1088
|
-
|
|
1089
|
-
|
|
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
|
+
// 超时兜底:避免永久转圈
|
|
1131
|
+
setTimeout(function(){
|
|
1132
|
+
if(hlsResumeSettling && seekTime>0){
|
|
1133
|
+
finishResumeSeek(seekTime);
|
|
1090
1134
|
}
|
|
1091
|
-
|
|
1092
|
-
},5000);
|
|
1135
|
+
},4000);
|
|
1093
1136
|
return;
|
|
1094
1137
|
}
|
|
1095
1138
|
if(!hlsStartPositionUsed){
|
|
@@ -1097,10 +1140,7 @@
|
|
|
1097
1140
|
}
|
|
1098
1141
|
});
|
|
1099
1142
|
hls.on(Hls.Events.FRAG_BUFFERED, function(event, data){
|
|
1100
|
-
if(
|
|
1101
|
-
if(hlsCanSafelySeekTo(seekTime)){
|
|
1102
|
-
finishResumeSeek(seekTime);
|
|
1103
|
-
}
|
|
1143
|
+
if(hlsResumeSettling && seekTime>0){
|
|
1104
1144
|
return;
|
|
1105
1145
|
}
|
|
1106
1146
|
if(hlsResumeTarget<=0 || !data || !data.frag){
|
|
@@ -1109,12 +1149,7 @@
|
|
|
1109
1149
|
var fragStart=data.frag.start;
|
|
1110
1150
|
var fragEnd=fragStart+data.frag.duration;
|
|
1111
1151
|
if(hlsResumeTarget>=fragStart-0.5 && hlsResumeTarget<=fragEnd+0.5){
|
|
1112
|
-
|
|
1113
|
-
waited=true;
|
|
1114
|
-
if(C['buffer']){
|
|
1115
|
-
C['buffer'].hide();
|
|
1116
|
-
}
|
|
1117
|
-
}
|
|
1152
|
+
hidePlaybackBuffer();
|
|
1118
1153
|
}
|
|
1119
1154
|
});
|
|
1120
1155
|
hls.on(Hls.Events.ERROR, function(event, data){
|
|
@@ -1134,12 +1169,29 @@
|
|
|
1134
1169
|
}
|
|
1135
1170
|
}
|
|
1136
1171
|
}
|
|
1137
|
-
//
|
|
1138
|
-
if(fatal &&
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1172
|
+
// 对齐 ZWPlayer / ezwebtools:网络错误重拉,媒体错误恢复解码
|
|
1173
|
+
if(fatal && hls){
|
|
1174
|
+
if(data.type===Hls.ErrorTypes.NETWORK_ERROR && typeof hls.startLoad==='function'){
|
|
1175
|
+
try{
|
|
1176
|
+
if(data.details==='keyLoadError'){
|
|
1177
|
+
setTimeout(function(){
|
|
1178
|
+
if(hls && typeof hls.startLoad==='function'){
|
|
1179
|
+
hls.startLoad();
|
|
1180
|
+
}
|
|
1181
|
+
},2000);
|
|
1182
|
+
}
|
|
1183
|
+
else{
|
|
1184
|
+
hls.startLoad();
|
|
1185
|
+
}
|
|
1186
|
+
fatal=false;
|
|
1187
|
+
}catch(errNet){}
|
|
1188
|
+
}
|
|
1189
|
+
else if(data.type===Hls.ErrorTypes.MEDIA_ERROR && typeof hls.recoverMediaError==='function'){
|
|
1190
|
+
try{
|
|
1191
|
+
hls.recoverMediaError();
|
|
1192
|
+
fatal=false;
|
|
1193
|
+
}catch(errRecover){}
|
|
1194
|
+
}
|
|
1143
1195
|
}
|
|
1144
1196
|
CT.error={code:code,message:message};
|
|
1145
1197
|
eventTarget('error',CT.error);//注册监听error
|
|
@@ -2053,10 +2105,11 @@
|
|
|
2053
2105
|
/*
|
|
2054
2106
|
* finishResumeSeek
|
|
2055
2107
|
* 功能:完成续播定位。只 seek、不自动 play(由用户点击中央按钮/播放键)
|
|
2056
|
-
*
|
|
2108
|
+
* ZW 模型:直接 currentTime,不依赖前片预热完成态
|
|
2057
2109
|
*/
|
|
2058
2110
|
finishResumeSeek=function(t){
|
|
2059
2111
|
hlsResumeWarmup=false;
|
|
2112
|
+
hlsResumeSettling=false;
|
|
2060
2113
|
// 续播场景取消挂起的自动播放,统一改为点击播放
|
|
2061
2114
|
autoplayPending=false;
|
|
2062
2115
|
applySeekToMedia(t);
|
|
@@ -2066,10 +2119,7 @@
|
|
|
2066
2119
|
video.pause();
|
|
2067
2120
|
}catch(event){}
|
|
2068
2121
|
paused=true;
|
|
2069
|
-
|
|
2070
|
-
C['buffer'].hide();
|
|
2071
|
-
}
|
|
2072
|
-
waited=true;
|
|
2122
|
+
hidePlaybackBuffer();
|
|
2073
2123
|
if(!vars['controls'] && C['centerPlay']){
|
|
2074
2124
|
C['centerPlay'].show();
|
|
2075
2125
|
}
|
|
@@ -2122,9 +2172,8 @@
|
|
|
2122
2172
|
},
|
|
2123
2173
|
/*
|
|
2124
2174
|
* applyPendingSeek
|
|
2125
|
-
*
|
|
2126
|
-
*
|
|
2127
|
-
* seekTime 仅在 finishResumeSeek / applySeekToMedia 成功后清零
|
|
2175
|
+
* 功能:在媒体就绪后应用挂起的 seekTime
|
|
2176
|
+
* HLS 对齐 ZWPlayer:就绪后直接 currentTime(finishResumeSeek),不再主路径 startLoad 预热
|
|
2128
2177
|
*/
|
|
2129
2178
|
applyPendingSeek=function(force){
|
|
2130
2179
|
if(!seekTime || !video || seekApplyLock){
|
|
@@ -2141,6 +2190,7 @@
|
|
|
2141
2190
|
if(t<=0){
|
|
2142
2191
|
seekTime=0;
|
|
2143
2192
|
clearSeekRetry();
|
|
2193
|
+
hlsResumeSettling=false;
|
|
2144
2194
|
return;
|
|
2145
2195
|
}
|
|
2146
2196
|
if(t>0){
|
|
@@ -2149,47 +2199,25 @@
|
|
|
2149
2199
|
firstSeekTime=t;
|
|
2150
2200
|
}
|
|
2151
2201
|
}
|
|
2152
|
-
// HLS
|
|
2153
|
-
if(hls
|
|
2154
|
-
|
|
2155
|
-
|
|
2156
|
-
return;
|
|
2157
|
-
}
|
|
2158
|
-
// 预热中或需加载:只按对齐点 startLoad(去重),保留 seekTime 等 FRAG_BUFFERED
|
|
2159
|
-
if(t>1){
|
|
2160
|
-
hlsResumeWarmup=true;
|
|
2161
|
-
hlsResumeTarget=t;
|
|
2162
|
-
var loadAt=hlsPriorLoadTime(t);
|
|
2163
|
-
var shouldLoad=!!force;
|
|
2164
|
-
if(!shouldLoad){
|
|
2165
|
-
if(!(hlsLoadAt>=0 && Math.abs(hlsLoadAt-loadAt)<1.5 && (Date.now()-hlsLoadTs)<4000)){
|
|
2166
|
-
shouldLoad=true;
|
|
2167
|
-
}
|
|
2168
|
-
}
|
|
2169
|
-
if(shouldLoad){
|
|
2170
|
-
hlsLoadAt=loadAt;
|
|
2171
|
-
hlsLoadTs=Date.now();
|
|
2172
|
-
try{
|
|
2173
|
-
hls.startLoad(loadAt);
|
|
2174
|
-
}catch(event){}
|
|
2175
|
-
}
|
|
2202
|
+
// HLS:媒体元数据就绪即可定位(由 hls.js 响应 seeking 拉片)
|
|
2203
|
+
if(hls){
|
|
2204
|
+
hlsResumeSettling=true;
|
|
2205
|
+
if(!force && (!isUndefined(video.readyState) && video.readyState<1) && !(dur && isFinite(dur) && dur>0)){
|
|
2176
2206
|
seekRetryCount++;
|
|
2177
|
-
if(seekRetryCount<=
|
|
2207
|
+
if(seekRetryCount<=40){
|
|
2178
2208
|
if(seekRetryTimer){
|
|
2179
2209
|
clearTimeout(seekRetryTimer);
|
|
2180
2210
|
}
|
|
2181
2211
|
seekRetryTimer=setTimeout(function(){
|
|
2182
2212
|
applyPendingSeek(false);
|
|
2183
|
-
},
|
|
2213
|
+
},120);
|
|
2184
2214
|
return;
|
|
2185
2215
|
}
|
|
2186
|
-
// 重试耗尽:落到目标片起点,避免永久转圈
|
|
2187
|
-
finishResumeSeek(hlsFragStartTime(t) || loadAt || t);
|
|
2188
|
-
return;
|
|
2189
2216
|
}
|
|
2217
|
+
finishResumeSeek(t);
|
|
2218
|
+
return;
|
|
2190
2219
|
}
|
|
2191
2220
|
// 对普通 MP4,metadata 后设置 currentTime 会由浏览器自动请求目标 Range。
|
|
2192
|
-
// 等待目标已缓冲会形成循环等待:目标分片只有 seek 后才会下载。
|
|
2193
2221
|
if(!force && (!isUndefined(video.readyState) && video.readyState<1)){
|
|
2194
2222
|
seekRetryCount++;
|
|
2195
2223
|
if(seekRetryCount<=50){
|
|
@@ -2310,6 +2338,7 @@
|
|
|
2310
2338
|
},
|
|
2311
2339
|
canPlay:function(){
|
|
2312
2340
|
C['loading'].hide();
|
|
2341
|
+
hidePlaybackBuffer();
|
|
2313
2342
|
eventTarget('canplay');
|
|
2314
2343
|
applyPendingSeek();
|
|
2315
2344
|
startPendingAutoplay();
|
|
@@ -2511,61 +2540,74 @@
|
|
|
2511
2540
|
seeked:function(){
|
|
2512
2541
|
seekApplyLock=false;
|
|
2513
2542
|
decodeRecoverCount=0;
|
|
2543
|
+
hlsScrubbing=false;
|
|
2544
|
+
hlsResumeSettling=false;
|
|
2514
2545
|
startPendingAutoplay();
|
|
2515
2546
|
pSliderMouseDown=false;
|
|
2547
|
+
hidePlaybackBuffer();
|
|
2548
|
+
// 用户拖动后恢复播放(标准 video + hls.js 行为)
|
|
2549
|
+
if(hlsScrubResumePlay){
|
|
2550
|
+
hlsScrubResumePlay=false;
|
|
2551
|
+
try{
|
|
2552
|
+
player.play();
|
|
2553
|
+
}catch(event){}
|
|
2554
|
+
}
|
|
2516
2555
|
eventTarget('seek',{time:this.currentTime,state:'seeked'});
|
|
2517
2556
|
eventTarget('seeked');
|
|
2518
2557
|
},
|
|
2519
2558
|
seeking:function(){
|
|
2520
|
-
//
|
|
2521
|
-
if(paused && !seekApplyLock && !hlsResumeWarmup && !seekTime && !autoplayPending){
|
|
2559
|
+
// 续播/拖动定位中禁止抢先 play:会取消进行中的 .ts 并导致永久 loading
|
|
2560
|
+
if(paused && !seekApplyLock && !hlsResumeWarmup && !hlsResumeSettling && !hlsScrubbing && !seekTime && !autoplayPending){
|
|
2522
2561
|
player.play();
|
|
2523
2562
|
}
|
|
2524
2563
|
var seekingTime=this.currentTime;
|
|
2525
2564
|
if(firstSeekTime==-1){
|
|
2526
2565
|
firstSeekTime=seekingTime;//记录第一次拖动的时间
|
|
2527
2566
|
}
|
|
2528
|
-
|
|
2529
|
-
|
|
2530
|
-
|
|
2531
|
-
|
|
2532
|
-
|
|
2533
|
-
|
|
2534
|
-
|
|
2535
|
-
|
|
2536
|
-
|
|
2537
|
-
|
|
2538
|
-
|
|
2539
|
-
|
|
2540
|
-
|
|
2541
|
-
|
|
2542
|
-
|
|
2543
|
-
|
|
2544
|
-
|
|
2545
|
-
|
|
2546
|
-
|
|
2547
|
-
|
|
2548
|
-
|
|
2549
|
-
|
|
2550
|
-
|
|
2551
|
-
|
|
2552
|
-
|
|
2553
|
-
|
|
2554
|
-
|
|
2555
|
-
|
|
2556
|
-
|
|
2557
|
-
|
|
2558
|
-
|
|
2559
|
-
|
|
2560
|
-
|
|
2561
|
-
|
|
2562
|
-
|
|
2563
|
-
|
|
2564
|
-
|
|
2565
|
-
|
|
2566
|
-
|
|
2567
|
-
|
|
2568
|
-
|
|
2567
|
+
// scrub/续播定位期间:跳过二次 player.seek(timeScheduleAdjust 由进度条侧执法)
|
|
2568
|
+
if(!(hlsScrubbing || hlsScrubResumePlay || hlsResumeSettling || hlsResumeWarmup)){
|
|
2569
|
+
switch(vars['timeScheduleAdjust']){
|
|
2570
|
+
case 0://禁止拖动
|
|
2571
|
+
if(oldTime!=seekingTime){
|
|
2572
|
+
waitingMessage=false;
|
|
2573
|
+
player.seek(oldTime);
|
|
2574
|
+
message(language['timeScheduleAdjust']['prohibit']);
|
|
2575
|
+
return;
|
|
2576
|
+
}
|
|
2577
|
+
break;
|
|
2578
|
+
case 2://只能前进(向右拖动
|
|
2579
|
+
if(seekingTime<oldTime){
|
|
2580
|
+
waitingMessage=false;
|
|
2581
|
+
player.seek(oldTime);
|
|
2582
|
+
message(language['timeScheduleAdjust']['prohibitBackOff']);
|
|
2583
|
+
return;
|
|
2584
|
+
}
|
|
2585
|
+
break;
|
|
2586
|
+
case 3://是只能后退
|
|
2587
|
+
if(seekingTime>oldTime){
|
|
2588
|
+
waitingMessage=false;
|
|
2589
|
+
player.seek(oldTime);
|
|
2590
|
+
message(language['timeScheduleAdjust']['prohibitForward']);
|
|
2591
|
+
return;
|
|
2592
|
+
}
|
|
2593
|
+
break;
|
|
2594
|
+
case 4://只能前进但能回到第一次拖动时的位置
|
|
2595
|
+
if(seekingTime<firstSeekTime){
|
|
2596
|
+
waitingMessage=false;
|
|
2597
|
+
player.seek(firstSeekTime);
|
|
2598
|
+
message(language['timeScheduleAdjust']['prohibitLookBack']);
|
|
2599
|
+
return;
|
|
2600
|
+
}
|
|
2601
|
+
break;
|
|
2602
|
+
case 5://看过的地方可以随意拖动
|
|
2603
|
+
if(seekingTime>maxSeeTime){
|
|
2604
|
+
waitingMessage=false;
|
|
2605
|
+
player.seek(maxSeeTime);
|
|
2606
|
+
message(language['timeScheduleAdjust']['prohibitForwardNotViewed']);
|
|
2607
|
+
return;
|
|
2608
|
+
}
|
|
2609
|
+
break;
|
|
2610
|
+
}
|
|
2569
2611
|
}
|
|
2570
2612
|
eventTarget('seek',{time:seekingTime,state:'seeking'});
|
|
2571
2613
|
eventTarget('seeking');
|
|
@@ -2578,10 +2620,16 @@
|
|
|
2578
2620
|
waiting:function(){
|
|
2579
2621
|
waited=false;
|
|
2580
2622
|
eventTarget('buffer','start');//注册监听视频缓冲
|
|
2581
|
-
|
|
2623
|
+
if(!(hlsScrubbing || hlsScrubResumePlay || hlsResumeSettling)){
|
|
2624
|
+
C['centerPlay'].hide();
|
|
2625
|
+
}
|
|
2582
2626
|
if(!vars['controls']){
|
|
2583
2627
|
C['buffer'].show();
|
|
2584
2628
|
}
|
|
2629
|
+
// scrub/续播定位中的短暂 waiting 不刷文案,避免钉死「缓冲中」体验
|
|
2630
|
+
if(hlsScrubbing || hlsScrubResumePlay || hlsResumeSettling){
|
|
2631
|
+
return;
|
|
2632
|
+
}
|
|
2585
2633
|
if(!waitingMessage){
|
|
2586
2634
|
waitingMessage=true;
|
|
2587
2635
|
}
|
|
@@ -2596,6 +2644,7 @@
|
|
|
2596
2644
|
C['bar']['playAndPause']['pause'].show();
|
|
2597
2645
|
C['bar']['playAndPause']['refresh'].hide();
|
|
2598
2646
|
C['centerPlay'].hide();
|
|
2647
|
+
hidePlaybackBuffer();
|
|
2599
2648
|
if(playType=='button'){
|
|
2600
2649
|
C['bar']['pbox'].removeClass('ck-bar-progress-out');
|
|
2601
2650
|
}
|
|
@@ -5693,6 +5742,7 @@
|
|
|
5693
5742
|
e = e || window.event;
|
|
5694
5743
|
var eleOffset = slider.offset(),bgOffset=bg.offset(),client = getClient(e);
|
|
5695
5744
|
pSliderMouseDown=true;
|
|
5745
|
+
hlsScrubbing=true;
|
|
5696
5746
|
posRecord = client['x'];
|
|
5697
5747
|
//供比较
|
|
5698
5748
|
var left = eleOffset['left']-bgOffset['left'];
|
|
@@ -5794,6 +5844,12 @@
|
|
|
5794
5844
|
eventTarget('playback',{time:playbackTime,date:date('Y-m-d H:i:s',playbackTime)});
|
|
5795
5845
|
eventTarget('seek',{time:playbackTime,state:'seeking',date:date('Y-m-d H:i:s',playbackTime)});
|
|
5796
5846
|
}
|
|
5847
|
+
// seek 完成后由 seeked 清 hlsScrubbing;此处延迟兜底
|
|
5848
|
+
setTimeout(function(){
|
|
5849
|
+
if(!pSliderMouseDown){
|
|
5850
|
+
hlsScrubbing=false;
|
|
5851
|
+
}
|
|
5852
|
+
},800);
|
|
5797
5853
|
C['bar']['pbox'].removeClass('ck-bar-progress-slider-move');
|
|
5798
5854
|
if(isMouseLeave){
|
|
5799
5855
|
tip();
|
|
@@ -7407,7 +7463,7 @@
|
|
|
7407
7463
|
if(!isRetry && (!vars || vars['cdnFallback']!==false)){
|
|
7408
7464
|
var cdn=(typeof window!=='undefined' && window.ckplayerPlusCdn) ? window.ckplayerPlusCdn : ckplayerPlusDefaultCdn;
|
|
7409
7465
|
var m=String(file).match(/\/(hls\.js|flv\.js|mpegts\.js|language)\/([^/?#]+)(?:[?#].*)?$/i);
|
|
7410
|
-
if(cdn && cdn.indexOf('1.1.
|
|
7466
|
+
if(cdn && cdn.indexOf('1.1.7')===-1 && m){
|
|
7411
7467
|
if(cdn.slice(-1)!=='/'){
|
|
7412
7468
|
cdn+='/';
|
|
7413
7469
|
}
|