ckplayer-plus 1.0.5 → 1.0.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/README.md +1 -1
- package/dist/ckplayer.js +278 -58
- package/dist/ckplayer.min.js +2 -2
- package/dist/index.cjs +245 -52
- package/dist/index.js +245 -52
- package/dist/react.cjs +245 -52
- package/dist/react.js +245 -52
- package/dist/vue.cjs +245 -52
- package/dist/vue.js +245 -52
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -77,7 +77,7 @@ React:
|
|
|
77
77
|
| `preferBuiltinPlug` | `true` | 优先加载本包内置脚本,避免复用页面上其它全局 `Hls` |
|
|
78
78
|
| `cdnFallback` | `true` | `getPath` 失败时回退 jsDelivr;内网无外网请设 `false` 并配 `pluginPath` |
|
|
79
79
|
| `pluginPath` | 自动 | 插件脚本根路径。默认:`window.ckplayerBasePath` → 本包 `dist/` → jsDelivr CDN |
|
|
80
|
-
| `seek` | `0` | 续播秒数(number 或数字字符串);会同步 `maxSeeTime
|
|
80
|
+
| `seek` | `0` | 续播秒数(number 或数字字符串);会同步 `maxSeeTime`。HLS 优先用 `startPosition`,并等待缓冲后再跳,降低非关键帧解码失败 |
|
|
81
81
|
| `loaded` | — | **只支持函数**;字符串形式已禁用(防 XSS) |
|
|
82
82
|
|
|
83
83
|
### 进阶(按需)
|
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.0.
|
|
144
|
+
var ckplayerPlusDefaultCdn='https://cdn.jsdelivr.net/npm/ckplayer-plus@1.0.7/dist/';
|
|
145
145
|
function ckplayerEmbed(videoObj){
|
|
146
146
|
/*
|
|
147
147
|
* rightMenu
|
|
@@ -171,6 +171,11 @@
|
|
|
171
171
|
var paused=true;//默认暂停状态
|
|
172
172
|
var loadTime=0;//已加载部分
|
|
173
173
|
var seekTime=0;//需要跳转的时间,初次播放以及切换清晰度后会用该变量记录需要seek的时间
|
|
174
|
+
var seekRetryTimer=null;//续播等待缓冲的重试计时器
|
|
175
|
+
var seekRetryCount=0;//续播重试次数
|
|
176
|
+
var seekApplyLock=false;//防止并发多次 currentTime 赋值
|
|
177
|
+
var decodeRecoverCount=0;//MEDIA_ERR_DECODE 恢复次数
|
|
178
|
+
var hlsStartPositionUsed=false;//是否已用 hls.js startPosition 处理续播
|
|
174
179
|
var oldTime=0,playTime=0,firstSeekTime=-1,maxSeeTime=0;//oldTime=记录上次播放时间,playTime=当前播放时间,firstSeekTime=记录第一次拖动的时间,maxSeeTime=看过的最大时间
|
|
175
180
|
var isChangeDef=true;//是否需要重置清晰度
|
|
176
181
|
var playType='';//播放类别,默认='',是通过api接口播放,='button'则判定是通过点击按钮播放
|
|
@@ -409,7 +414,7 @@
|
|
|
409
414
|
}
|
|
410
415
|
var allowCdn=!vars || vars['cdnFallback']!==false;
|
|
411
416
|
var cdn=(typeof window!=='undefined' && window.ckplayerPlusCdn) ? window.ckplayerPlusCdn : ckplayerPlusDefaultCdn;
|
|
412
|
-
if(!allowCdn || !cdn || cdn.indexOf('1.0.
|
|
417
|
+
if(!allowCdn || !cdn || cdn.indexOf('1.0.7')>-1){
|
|
413
418
|
// 避免占位版本或显式关闭 CDN 时请求坏地址;交给相对路径或业务 pluginPath
|
|
414
419
|
return folder+'/'+file;
|
|
415
420
|
}
|
|
@@ -657,6 +662,99 @@
|
|
|
657
662
|
*/
|
|
658
663
|
return player;
|
|
659
664
|
},
|
|
665
|
+
/*
|
|
666
|
+
* parseResumeSeekFromVars
|
|
667
|
+
* 功能:从 vars 解析续播秒数(不含 seekTime 缓存)
|
|
668
|
+
*/
|
|
669
|
+
parseResumeSeekFromVars=function(){
|
|
670
|
+
if(isUndefined(vars['seek'])){
|
|
671
|
+
return 0;
|
|
672
|
+
}
|
|
673
|
+
if(valType(vars['seek'])=='number' && vars['seek']>0){
|
|
674
|
+
return vars['seek'];
|
|
675
|
+
}
|
|
676
|
+
if(valType(vars['seek'])=='string' && vars['seek']=='cookie' && cookieName){
|
|
677
|
+
var cke=player.cookie(cookieName);
|
|
678
|
+
if(cke && cke['time']){
|
|
679
|
+
return cke['time'];
|
|
680
|
+
}
|
|
681
|
+
return 0;
|
|
682
|
+
}
|
|
683
|
+
if(valType(vars['seek'])=='string' && vars['seek']!=='' && !isNaN(parseFloat(vars['seek']))){
|
|
684
|
+
return parseFloat(vars['seek']);
|
|
685
|
+
}
|
|
686
|
+
return 0;
|
|
687
|
+
},
|
|
688
|
+
/*
|
|
689
|
+
* applyResumeSeekState
|
|
690
|
+
* 功能:写入续播目标并同步 maxSeeTime(timeScheduleAdjust=5 依赖)
|
|
691
|
+
*/
|
|
692
|
+
applyResumeSeekState=function(t){
|
|
693
|
+
if(!t || t<=0){
|
|
694
|
+
return;
|
|
695
|
+
}
|
|
696
|
+
seekTime=t;
|
|
697
|
+
maxSeeTime=Math.max(maxSeeTime,t);
|
|
698
|
+
if(firstSeekTime<0){
|
|
699
|
+
firstSeekTime=t;
|
|
700
|
+
}
|
|
701
|
+
},
|
|
702
|
+
/*
|
|
703
|
+
* prepareCookieAndSeek
|
|
704
|
+
* 功能:解析 cookie / seek,必须在 plugPlayer 之前调用
|
|
705
|
+
*/
|
|
706
|
+
prepareCookieAndSeek=function(){
|
|
707
|
+
if(vars['cookie']){
|
|
708
|
+
if(valType(vars['cookie'])=='array' && vars['cookie'].length>=2){
|
|
709
|
+
if(vars['cookie'][0] && valType(vars['cookie'][0])=='string'){
|
|
710
|
+
cookieName=vars['cookie'][0];
|
|
711
|
+
}
|
|
712
|
+
if(vars['cookie'][1] && valType(vars['cookie'][1])=='number'){
|
|
713
|
+
cookieTime=vars['cookie'][1];
|
|
714
|
+
}
|
|
715
|
+
}
|
|
716
|
+
if(valType(vars['cookie'])=='object' && !isUndefined(vars['cookie']['name'])){
|
|
717
|
+
cookieName=vars['cookie']['name'];
|
|
718
|
+
if(!isUndefined(vars['cookie']['hour']) && valType(vars['cookie']['hour'])=='number'){
|
|
719
|
+
cookieTime=vars['cookie']['hour'];
|
|
720
|
+
}
|
|
721
|
+
}
|
|
722
|
+
if(valType(vars['cookie'])=='string'){
|
|
723
|
+
cookieName=vars['cookie'];
|
|
724
|
+
}
|
|
725
|
+
if(cookieName){
|
|
726
|
+
cookieName=cookieName.replace(/[ ]*,[ ]*|[ ]+/g, '').replace(/[ ]*;[ ]*|[ ]+/g, '');
|
|
727
|
+
}
|
|
728
|
+
}
|
|
729
|
+
if(!seekTime){
|
|
730
|
+
applyResumeSeekState(parseResumeSeekFromVars());
|
|
731
|
+
}
|
|
732
|
+
},
|
|
733
|
+
/*
|
|
734
|
+
* destroyStreamPlayers
|
|
735
|
+
* 功能:切换地址前销毁 hls/flv/mpegts 实例
|
|
736
|
+
*/
|
|
737
|
+
destroyStreamPlayers=function(){
|
|
738
|
+
clearSeekRetry();
|
|
739
|
+
seekApplyLock=false;
|
|
740
|
+
hlsStartPositionUsed=false;
|
|
741
|
+
decodeRecoverCount=0;
|
|
742
|
+
if(hls){
|
|
743
|
+
try{
|
|
744
|
+
hls.destroy();
|
|
745
|
+
}catch(event){}
|
|
746
|
+
hls=null;
|
|
747
|
+
}
|
|
748
|
+
if(pugPlayer){
|
|
749
|
+
try{
|
|
750
|
+
pugPlayer.pause();
|
|
751
|
+
pugPlayer.unload();
|
|
752
|
+
pugPlayer.detachMediaElement();
|
|
753
|
+
pugPlayer.destroy();
|
|
754
|
+
}catch(event){}
|
|
755
|
+
pugPlayer=null;
|
|
756
|
+
}
|
|
757
|
+
},
|
|
660
758
|
/*
|
|
661
759
|
* changeVideo
|
|
662
760
|
* 功能:初始化视频地址或修改视频地址
|
|
@@ -664,6 +762,8 @@
|
|
|
664
762
|
changeVideo=function (vstr){
|
|
665
763
|
var i=0;
|
|
666
764
|
ensureAutoPlug(vstr);
|
|
765
|
+
prepareCookieAndSeek();
|
|
766
|
+
destroyStreamPlayers();
|
|
667
767
|
if(video.attr('src') || video.htm()){
|
|
668
768
|
player.pause();
|
|
669
769
|
}
|
|
@@ -755,52 +855,6 @@
|
|
|
755
855
|
if(isChangeDef){
|
|
756
856
|
checkDefinition();
|
|
757
857
|
}
|
|
758
|
-
/*
|
|
759
|
-
* 对cookie进行相关分析
|
|
760
|
-
*/
|
|
761
|
-
if(vars['cookie']){
|
|
762
|
-
if(valType(vars['cookie'])=='array' && vars['cookie'].length>=2){
|
|
763
|
-
if(vars['cookie'][0] && valType(vars['cookie'][0])=='string'){
|
|
764
|
-
cookieName=vars['cookie'][0];
|
|
765
|
-
}
|
|
766
|
-
if(vars['cookie'][1] && valType(vars['cookie'][1])=='number'){
|
|
767
|
-
cookieTime=vars['cookie'][1];
|
|
768
|
-
}
|
|
769
|
-
}
|
|
770
|
-
if(valType(vars['cookie'])=='object' && !isUndefined(vars['cookie']['name'])){
|
|
771
|
-
cookieName=vars['cookie']['name'];
|
|
772
|
-
if(!isUndefined(vars['cookie']['hour']) && valType(vars['cookie']['hour'])=='number'){
|
|
773
|
-
cookieTime=vars['cookie']['hour'];
|
|
774
|
-
}
|
|
775
|
-
}
|
|
776
|
-
if(valType(vars['cookie'])=='string'){
|
|
777
|
-
cookieName=vars['cookie'];
|
|
778
|
-
}
|
|
779
|
-
if(cookieName){
|
|
780
|
-
cookieName=cookieName.replace(/[ ]*,[ ]*|[ ]+/g, '').replace(/[ ]*;[ ]*|[ ]+/g, '');
|
|
781
|
-
}
|
|
782
|
-
}
|
|
783
|
-
if(!isUndefined(vars['seek']) && !seekTime){
|
|
784
|
-
if(valType(vars['seek'])=='number' && vars['seek']>0){
|
|
785
|
-
seekTime=vars['seek'];
|
|
786
|
-
}
|
|
787
|
-
else if(valType(vars['seek'])=='string' && vars['seek']=='cookie' && cookieName){
|
|
788
|
-
var cke=player.cookie(cookieName);
|
|
789
|
-
if(cke){
|
|
790
|
-
seekTime=cke['time'];
|
|
791
|
-
}
|
|
792
|
-
}
|
|
793
|
-
else if(valType(vars['seek'])=='string' && vars['seek']!=='' && !isNaN(parseFloat(vars['seek']))){
|
|
794
|
-
seekTime=parseFloat(vars['seek']);
|
|
795
|
-
}
|
|
796
|
-
// 与旧版对齐:续播 seek 同步进度水位,避免 timeScheduleAdjust=5 时被打回 0
|
|
797
|
-
if(seekTime && seekTime>0){
|
|
798
|
-
maxSeeTime=Math.max(maxSeeTime,seekTime);
|
|
799
|
-
if(firstSeekTime<0){
|
|
800
|
-
firstSeekTime=seekTime;
|
|
801
|
-
}
|
|
802
|
-
}
|
|
803
|
-
}
|
|
804
858
|
},
|
|
805
859
|
/*
|
|
806
860
|
* plugPlayer
|
|
@@ -842,11 +896,39 @@
|
|
|
842
896
|
hlsPlayer=function (url){
|
|
843
897
|
var startHls=function(){
|
|
844
898
|
if (typeof Hls!=='undefined' && !isUndefined(Hls) && Hls.isSupported()) {
|
|
845
|
-
hls
|
|
899
|
+
if(hls){
|
|
900
|
+
try{
|
|
901
|
+
hls.destroy();
|
|
902
|
+
}catch(event){}
|
|
903
|
+
hls=null;
|
|
904
|
+
}
|
|
905
|
+
var hlsConf={
|
|
906
|
+
// 10s 分片流在续播点附近需要略大缓冲,减少卡住转圈
|
|
907
|
+
maxBufferLength:30,
|
|
908
|
+
maxMaxBufferLength:60
|
|
909
|
+
};
|
|
910
|
+
var resumeAt=seekTime;
|
|
911
|
+
if(!resumeAt){
|
|
912
|
+
resumeAt=parseResumeSeekFromVars();
|
|
913
|
+
}
|
|
914
|
+
// 断点续播:startPosition 必须在 loadSource 前设置,从正确 TS 分片起播
|
|
915
|
+
if(resumeAt && resumeAt>0 && (isUndefined(vars['live']) || !vars['live'])){
|
|
916
|
+
hlsConf.startPosition=resumeAt;
|
|
917
|
+
maxSeeTime=Math.max(maxSeeTime,resumeAt);
|
|
918
|
+
if(firstSeekTime<0){
|
|
919
|
+
firstSeekTime=resumeAt;
|
|
920
|
+
}
|
|
921
|
+
seekTime=0;
|
|
922
|
+
hlsStartPositionUsed=true;
|
|
923
|
+
clearSeekRetry();
|
|
924
|
+
}
|
|
925
|
+
hls = new Hls(hlsConf);
|
|
846
926
|
hls.loadSource(url);
|
|
847
927
|
hls.attachMedia(video);
|
|
848
928
|
hls.on(Hls.Events.MANIFEST_PARSED, function(){
|
|
849
|
-
|
|
929
|
+
if(!hlsStartPositionUsed){
|
|
930
|
+
applyPendingSeek();
|
|
931
|
+
}
|
|
850
932
|
});
|
|
851
933
|
hls.on(Hls.Events.ERROR, function(event, data){
|
|
852
934
|
var code=9;
|
|
@@ -865,6 +947,13 @@
|
|
|
865
947
|
}
|
|
866
948
|
}
|
|
867
949
|
}
|
|
950
|
+
// 媒体解码类错误先尝试恢复,避免续播直接黑屏
|
|
951
|
+
if(fatal && data.type===Hls.ErrorTypes.MEDIA_ERROR && hls && typeof hls.recoverMediaError==='function'){
|
|
952
|
+
try{
|
|
953
|
+
hls.recoverMediaError();
|
|
954
|
+
fatal=false;
|
|
955
|
+
}catch(errRecover){}
|
|
956
|
+
}
|
|
868
957
|
CT.error={code:code,message:message};
|
|
869
958
|
eventTarget('error',CT.error);//注册监听error
|
|
870
959
|
if(fatal){
|
|
@@ -1614,12 +1703,42 @@
|
|
|
1614
1703
|
}
|
|
1615
1704
|
}
|
|
1616
1705
|
},
|
|
1706
|
+
/*
|
|
1707
|
+
* timeInBuffered
|
|
1708
|
+
* 功能:判断目标时间是否已在 buffered 区间内(续播前避免跳到未缓冲的非关键帧)
|
|
1709
|
+
*/
|
|
1710
|
+
timeInBuffered=function(t){
|
|
1711
|
+
if(!video || isUndefined(video.buffered)){
|
|
1712
|
+
return false;
|
|
1713
|
+
}
|
|
1714
|
+
try{
|
|
1715
|
+
var buf=video.buffered;
|
|
1716
|
+
for(var i=0;i<buf.length;i++){
|
|
1717
|
+
if(t>=buf.start(i)-0.35 && t<=buf.end(i)+0.15){
|
|
1718
|
+
return true;
|
|
1719
|
+
}
|
|
1720
|
+
}
|
|
1721
|
+
}catch(event){}
|
|
1722
|
+
return false;
|
|
1723
|
+
},
|
|
1724
|
+
/*
|
|
1725
|
+
* clearSeekRetry
|
|
1726
|
+
* 功能:清理续播等待计时器
|
|
1727
|
+
*/
|
|
1728
|
+
clearSeekRetry=function(){
|
|
1729
|
+
if(seekRetryTimer){
|
|
1730
|
+
clearTimeout(seekRetryTimer);
|
|
1731
|
+
seekRetryTimer=null;
|
|
1732
|
+
}
|
|
1733
|
+
seekRetryCount=0;
|
|
1734
|
+
},
|
|
1617
1735
|
/*
|
|
1618
1736
|
* applyPendingSeek
|
|
1619
|
-
*
|
|
1737
|
+
* 功能:在媒体就绪且目标时间可解码后再应用挂起的 seekTime
|
|
1738
|
+
* 避免断点续播过早 seek 触发 PIPELINE_ERROR_DECODE(非关键帧)
|
|
1620
1739
|
*/
|
|
1621
|
-
applyPendingSeek=function(){
|
|
1622
|
-
if(!seekTime || !video){
|
|
1740
|
+
applyPendingSeek=function(force){
|
|
1741
|
+
if(!seekTime || !video || seekApplyLock){
|
|
1623
1742
|
return;
|
|
1624
1743
|
}
|
|
1625
1744
|
if(!isUndefined(vars['live']) && ((valType(vars['live'])=='boolean' && vars['live']) || valType(vars['live'])=='number')){
|
|
@@ -1630,19 +1749,97 @@
|
|
|
1630
1749
|
if(dur && isFinite(dur) && dur>0 && t>=dur){
|
|
1631
1750
|
t=Math.max(0,dur-0.3);
|
|
1632
1751
|
}
|
|
1633
|
-
|
|
1752
|
+
if(t<=0){
|
|
1753
|
+
seekTime=0;
|
|
1754
|
+
clearSeekRetry();
|
|
1755
|
+
return;
|
|
1756
|
+
}
|
|
1634
1757
|
if(t>0){
|
|
1635
1758
|
maxSeeTime=Math.max(maxSeeTime,t);
|
|
1636
1759
|
if(firstSeekTime<0){
|
|
1637
1760
|
firstSeekTime=t;
|
|
1638
1761
|
}
|
|
1639
1762
|
}
|
|
1763
|
+
// HLS:用 hls.startLoad 从目标分片加载,避免裸 currentTime 导致 16s 处一直转圈/解码失败
|
|
1764
|
+
if(hls && typeof hls.startLoad==='function'){
|
|
1765
|
+
clearSeekRetry();
|
|
1766
|
+
seekTime=0;
|
|
1767
|
+
try{
|
|
1768
|
+
hls.startLoad(t);
|
|
1769
|
+
}catch(event){
|
|
1770
|
+
seekTime=t;
|
|
1771
|
+
}
|
|
1772
|
+
return;
|
|
1773
|
+
}
|
|
1774
|
+
var readyEnough=!isUndefined(video.readyState) && video.readyState>=2;
|
|
1775
|
+
var bufferedOk=timeInBuffered(t);
|
|
1776
|
+
if(!force && !bufferedOk && (!readyEnough || video.readyState<3)){
|
|
1777
|
+
seekRetryCount++;
|
|
1778
|
+
if(seekRetryCount<=50){
|
|
1779
|
+
if(seekRetryTimer){
|
|
1780
|
+
clearTimeout(seekRetryTimer);
|
|
1781
|
+
}
|
|
1782
|
+
seekRetryTimer=setTimeout(function(){
|
|
1783
|
+
applyPendingSeek(false);
|
|
1784
|
+
},200);
|
|
1785
|
+
return;
|
|
1786
|
+
}
|
|
1787
|
+
}
|
|
1788
|
+
clearSeekRetry();
|
|
1789
|
+
seekApplyLock=true;
|
|
1640
1790
|
seekTime=0;
|
|
1641
1791
|
try{
|
|
1642
1792
|
video.currentTime=t;
|
|
1643
1793
|
}catch(event){
|
|
1644
1794
|
seekTime=t;
|
|
1795
|
+
seekApplyLock=false;
|
|
1796
|
+
}
|
|
1797
|
+
setTimeout(function(){
|
|
1798
|
+
seekApplyLock=false;
|
|
1799
|
+
},800);
|
|
1800
|
+
},
|
|
1801
|
+
/*
|
|
1802
|
+
* recoverDecodeError
|
|
1803
|
+
* 功能:断点续播触发的解码错误尝试恢复(Chrome PIPELINE_ERROR_DECODE)
|
|
1804
|
+
*/
|
|
1805
|
+
recoverDecodeError=function(){
|
|
1806
|
+
if(decodeRecoverCount>=2){
|
|
1807
|
+
return false;
|
|
1645
1808
|
}
|
|
1809
|
+
decodeRecoverCount++;
|
|
1810
|
+
var resumeAt=playTime>0?playTime:(vars['seek']?parseFloat(vars['seek']):0);
|
|
1811
|
+
if(isNaN(resumeAt) || resumeAt<0){
|
|
1812
|
+
resumeAt=0;
|
|
1813
|
+
}
|
|
1814
|
+
try{
|
|
1815
|
+
if(hls && typeof hls.recoverMediaError==='function'){
|
|
1816
|
+
hls.recoverMediaError();
|
|
1817
|
+
if(resumeAt>0){
|
|
1818
|
+
seekTime=resumeAt;
|
|
1819
|
+
seekApplyLock=false;
|
|
1820
|
+
setTimeout(function(){
|
|
1821
|
+
applyPendingSeek(true);
|
|
1822
|
+
},300);
|
|
1823
|
+
}
|
|
1824
|
+
return true;
|
|
1825
|
+
}
|
|
1826
|
+
}catch(event){}
|
|
1827
|
+
try{
|
|
1828
|
+
var soft=Math.max(0,resumeAt-1.5);
|
|
1829
|
+
seekTime=resumeAt;
|
|
1830
|
+
seekApplyLock=false;
|
|
1831
|
+
if(video){
|
|
1832
|
+
video.currentTime=soft;
|
|
1833
|
+
}
|
|
1834
|
+
setTimeout(function(){
|
|
1835
|
+
applyPendingSeek(true);
|
|
1836
|
+
if(video && video.paused && vars['autoplay']){
|
|
1837
|
+
try{video.play();}catch(e2){}
|
|
1838
|
+
}
|
|
1839
|
+
},400);
|
|
1840
|
+
return true;
|
|
1841
|
+
}catch(event){}
|
|
1842
|
+
return false;
|
|
1646
1843
|
},
|
|
1647
1844
|
/*
|
|
1648
1845
|
* loadedMetaData
|
|
@@ -1834,6 +2031,12 @@
|
|
|
1834
2031
|
if(!isUndefined(errorInfo.message)){
|
|
1835
2032
|
msg=errorInfo.message;
|
|
1836
2033
|
}
|
|
2034
|
+
// code=3 MEDIA_ERR_DECODE:续播非关键帧常见,先尝试恢复
|
|
2035
|
+
if(code===3 && recoverDecodeError()){
|
|
2036
|
+
CT.error={code:code,message:msg};
|
|
2037
|
+
eventTarget('error',CT.error);
|
|
2038
|
+
return;
|
|
2039
|
+
}
|
|
1837
2040
|
CT.error={code:code,message:msg};
|
|
1838
2041
|
showError();
|
|
1839
2042
|
}
|
|
@@ -1887,6 +2090,8 @@
|
|
|
1887
2090
|
eventTarget('error',CT.error);//注册监听error
|
|
1888
2091
|
},
|
|
1889
2092
|
seeked:function(){
|
|
2093
|
+
seekApplyLock=false;
|
|
2094
|
+
decodeRecoverCount=0;
|
|
1890
2095
|
if(paused){
|
|
1891
2096
|
player.play();
|
|
1892
2097
|
}
|
|
@@ -2311,7 +2516,8 @@
|
|
|
2311
2516
|
ad['frontPlay']=false;
|
|
2312
2517
|
C['ad'].hide();
|
|
2313
2518
|
allBarShow();
|
|
2314
|
-
seekTime=
|
|
2519
|
+
seekTime=0;
|
|
2520
|
+
applyResumeSeekState(parseResumeSeekFromVars());
|
|
2315
2521
|
if(ad['front']['video']){//如果包含视频广告
|
|
2316
2522
|
changeVideo(vars['video']);
|
|
2317
2523
|
}
|
|
@@ -2920,7 +3126,7 @@
|
|
|
2920
3126
|
break;
|
|
2921
3127
|
}
|
|
2922
3128
|
pSliderMouseDown=false;
|
|
2923
|
-
//
|
|
3129
|
+
// 媒体未就绪时只记录目标,禁止抢先 currentTime(会触发非关键帧解码失败)
|
|
2924
3130
|
var ready=video.readyState>=2 || (duration && isFinite(duration) && duration>0);
|
|
2925
3131
|
if(!ready){
|
|
2926
3132
|
seekTime=target;
|
|
@@ -2930,7 +3136,6 @@
|
|
|
2930
3136
|
firstSeekTime=target;
|
|
2931
3137
|
}
|
|
2932
3138
|
}
|
|
2933
|
-
try{video.currentTime=target;}catch(event){}
|
|
2934
3139
|
return player;
|
|
2935
3140
|
}
|
|
2936
3141
|
if(duration && isFinite(duration) && duration>0 && target>duration){
|
|
@@ -2943,6 +3148,21 @@
|
|
|
2943
3148
|
if(vars['timeScheduleAdjust']==5 && target>maxSeeTime && seekTime && Math.abs(seekTime-target)<0.5){
|
|
2944
3149
|
maxSeeTime=Math.max(maxSeeTime,target);
|
|
2945
3150
|
}
|
|
3151
|
+
// 目标尚未进入缓冲时改为挂起,由 applyPendingSeek 等待后再跳
|
|
3152
|
+
if(target>0.5 && !timeInBuffered(target) && video.readyState<3 && !hls){
|
|
3153
|
+
seekTime=target;
|
|
3154
|
+
applyPendingSeek(false);
|
|
3155
|
+
return player;
|
|
3156
|
+
}
|
|
3157
|
+
if(hls && typeof hls.startLoad==='function'){
|
|
3158
|
+
seekTime=0;
|
|
3159
|
+
try{
|
|
3160
|
+
hls.startLoad(target);
|
|
3161
|
+
}catch(event){
|
|
3162
|
+
seekTime=target;
|
|
3163
|
+
}
|
|
3164
|
+
return player;
|
|
3165
|
+
}
|
|
2946
3166
|
try{
|
|
2947
3167
|
video.currentTime=target;
|
|
2948
3168
|
seekTime=0;
|
|
@@ -6758,7 +6978,7 @@
|
|
|
6758
6978
|
if(!isRetry && (!vars || vars['cdnFallback']!==false)){
|
|
6759
6979
|
var cdn=(typeof window!=='undefined' && window.ckplayerPlusCdn) ? window.ckplayerPlusCdn : ckplayerPlusDefaultCdn;
|
|
6760
6980
|
var m=String(file).match(/\/(hls\.js|flv\.js|mpegts\.js|language)\/([^/?#]+)(?:[?#].*)?$/i);
|
|
6761
|
-
if(cdn && cdn.indexOf('1.0.
|
|
6981
|
+
if(cdn && cdn.indexOf('1.0.7')===-1 && m){
|
|
6762
6982
|
if(cdn.slice(-1)!=='/'){
|
|
6763
6983
|
cdn+='/';
|
|
6764
6984
|
}
|