ckplayer-plus 1.0.6 → 1.0.8
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 +203 -70
- package/dist/ckplayer.min.js +2 -2
- package/dist/index.cjs +173 -62
- package/dist/index.js +173 -62
- package/dist/react.cjs +176 -62
- package/dist/react.js +176 -62
- package/dist/vue.cjs +183 -62
- package/dist/vue.js +183 -62
- package/package.json +1 -1
- package/types/vue.d.ts +2 -0
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.8/dist/';
|
|
145
145
|
function ckplayerEmbed(videoObj){
|
|
146
146
|
/*
|
|
147
147
|
* rightMenu
|
|
@@ -176,6 +176,9 @@
|
|
|
176
176
|
var seekApplyLock=false;//防止并发多次 currentTime 赋值
|
|
177
177
|
var decodeRecoverCount=0;//MEDIA_ERR_DECODE 恢复次数
|
|
178
178
|
var hlsStartPositionUsed=false;//是否已用 hls.js startPosition 处理续播
|
|
179
|
+
var hlsResumeTarget=-1;//HLS 续播目标秒数(避免重复 startLoad 取消分片请求)
|
|
180
|
+
var hlsLoadAt=-1;//最近一次 hls.startLoad 目标
|
|
181
|
+
var hlsLoadTs=0;//最近一次 hls.startLoad 时间戳
|
|
179
182
|
var oldTime=0,playTime=0,firstSeekTime=-1,maxSeeTime=0;//oldTime=记录上次播放时间,playTime=当前播放时间,firstSeekTime=记录第一次拖动的时间,maxSeeTime=看过的最大时间
|
|
180
183
|
var isChangeDef=true;//是否需要重置清晰度
|
|
181
184
|
var playType='';//播放类别,默认='',是通过api接口播放,='button'则判定是通过点击按钮播放
|
|
@@ -414,7 +417,7 @@
|
|
|
414
417
|
}
|
|
415
418
|
var allowCdn=!vars || vars['cdnFallback']!==false;
|
|
416
419
|
var cdn=(typeof window!=='undefined' && window.ckplayerPlusCdn) ? window.ckplayerPlusCdn : ckplayerPlusDefaultCdn;
|
|
417
|
-
if(!allowCdn || !cdn || cdn.indexOf('1.0.
|
|
420
|
+
if(!allowCdn || !cdn || cdn.indexOf('1.0.8')>-1){
|
|
418
421
|
// 避免占位版本或显式关闭 CDN 时请求坏地址;交给相对路径或业务 pluginPath
|
|
419
422
|
return folder+'/'+file;
|
|
420
423
|
}
|
|
@@ -662,6 +665,143 @@
|
|
|
662
665
|
*/
|
|
663
666
|
return player;
|
|
664
667
|
},
|
|
668
|
+
/*
|
|
669
|
+
* parseResumeSeekFromVars
|
|
670
|
+
* 功能:从 vars 解析续播秒数(不含 seekTime 缓存)
|
|
671
|
+
*/
|
|
672
|
+
parseResumeSeekFromVars=function(){
|
|
673
|
+
if(isUndefined(vars['seek'])){
|
|
674
|
+
return 0;
|
|
675
|
+
}
|
|
676
|
+
if(valType(vars['seek'])=='number' && vars['seek']>0){
|
|
677
|
+
return vars['seek'];
|
|
678
|
+
}
|
|
679
|
+
if(valType(vars['seek'])=='string' && vars['seek']=='cookie' && cookieName){
|
|
680
|
+
var cke=player.cookie(cookieName);
|
|
681
|
+
if(cke && cke['time']){
|
|
682
|
+
return cke['time'];
|
|
683
|
+
}
|
|
684
|
+
return 0;
|
|
685
|
+
}
|
|
686
|
+
if(valType(vars['seek'])=='string' && vars['seek']!=='' && !isNaN(parseFloat(vars['seek']))){
|
|
687
|
+
return parseFloat(vars['seek']);
|
|
688
|
+
}
|
|
689
|
+
return 0;
|
|
690
|
+
},
|
|
691
|
+
/*
|
|
692
|
+
* applyResumeSeekState
|
|
693
|
+
* 功能:写入续播目标并同步 maxSeeTime(timeScheduleAdjust=5 依赖)
|
|
694
|
+
*/
|
|
695
|
+
applyResumeSeekState=function(t){
|
|
696
|
+
if(!t || t<=0){
|
|
697
|
+
return;
|
|
698
|
+
}
|
|
699
|
+
seekTime=t;
|
|
700
|
+
maxSeeTime=Math.max(maxSeeTime,t);
|
|
701
|
+
if(firstSeekTime<0){
|
|
702
|
+
firstSeekTime=t;
|
|
703
|
+
}
|
|
704
|
+
},
|
|
705
|
+
/*
|
|
706
|
+
* prepareCookieAndSeek
|
|
707
|
+
* 功能:解析 cookie / seek,必须在 plugPlayer 之前调用
|
|
708
|
+
*/
|
|
709
|
+
prepareCookieAndSeek=function(){
|
|
710
|
+
if(vars['cookie']){
|
|
711
|
+
if(valType(vars['cookie'])=='array' && vars['cookie'].length>=2){
|
|
712
|
+
if(vars['cookie'][0] && valType(vars['cookie'][0])=='string'){
|
|
713
|
+
cookieName=vars['cookie'][0];
|
|
714
|
+
}
|
|
715
|
+
if(vars['cookie'][1] && valType(vars['cookie'][1])=='number'){
|
|
716
|
+
cookieTime=vars['cookie'][1];
|
|
717
|
+
}
|
|
718
|
+
}
|
|
719
|
+
if(valType(vars['cookie'])=='object' && !isUndefined(vars['cookie']['name'])){
|
|
720
|
+
cookieName=vars['cookie']['name'];
|
|
721
|
+
if(!isUndefined(vars['cookie']['hour']) && valType(vars['cookie']['hour'])=='number'){
|
|
722
|
+
cookieTime=vars['cookie']['hour'];
|
|
723
|
+
}
|
|
724
|
+
}
|
|
725
|
+
if(valType(vars['cookie'])=='string'){
|
|
726
|
+
cookieName=vars['cookie'];
|
|
727
|
+
}
|
|
728
|
+
if(cookieName){
|
|
729
|
+
cookieName=cookieName.replace(/[ ]*,[ ]*|[ ]+/g, '').replace(/[ ]*;[ ]*|[ ]+/g, '');
|
|
730
|
+
}
|
|
731
|
+
}
|
|
732
|
+
if(!seekTime){
|
|
733
|
+
applyResumeSeekState(parseResumeSeekFromVars());
|
|
734
|
+
}
|
|
735
|
+
},
|
|
736
|
+
/*
|
|
737
|
+
* hlsSeekTo
|
|
738
|
+
* 功能:HLS 跳转(去重,避免重复 startLoad 取消进行中的 .ts 请求)
|
|
739
|
+
* @force 强制重新加载
|
|
740
|
+
* @returns true=已由 HLS 处理(含 no-op),false=非 HLS 或未处理
|
|
741
|
+
*/
|
|
742
|
+
hlsSeekTo=function(target,force){
|
|
743
|
+
if(!hls || typeof hls.startLoad!=='function' || !video){
|
|
744
|
+
return false;
|
|
745
|
+
}
|
|
746
|
+
if(isNaN(target) || target<0){
|
|
747
|
+
target=0;
|
|
748
|
+
}
|
|
749
|
+
var curTime=video.currentTime || 0;
|
|
750
|
+
if(!force){
|
|
751
|
+
// startPosition / 上次 startLoad 已针对同一续播点,且缓冲已覆盖 → 不再重启
|
|
752
|
+
if(hlsResumeTarget>=0 && Math.abs(hlsResumeTarget-target)<1.5){
|
|
753
|
+
if(timeInBuffered(target) && Math.abs(curTime-target)<2.5){
|
|
754
|
+
return true;
|
|
755
|
+
}
|
|
756
|
+
}
|
|
757
|
+
// 已在目标附近且可播 → 跳过
|
|
758
|
+
if(timeInBuffered(target) && Math.abs(curTime-target)<1.5){
|
|
759
|
+
hlsResumeTarget=target;
|
|
760
|
+
return true;
|
|
761
|
+
}
|
|
762
|
+
// 短时间内重复 seek 同一点 → 跳过(防止 onReady 再 seek 取消分片)
|
|
763
|
+
if(hlsLoadAt>=0 && Math.abs(hlsLoadAt-target)<1.5 && (Date.now()-hlsLoadTs)<4000){
|
|
764
|
+
return true;
|
|
765
|
+
}
|
|
766
|
+
}
|
|
767
|
+
hlsLoadAt=target;
|
|
768
|
+
hlsLoadTs=Date.now();
|
|
769
|
+
hlsResumeTarget=target;
|
|
770
|
+
try{
|
|
771
|
+
hls.startLoad(target);
|
|
772
|
+
}catch(event){
|
|
773
|
+
return false;
|
|
774
|
+
}
|
|
775
|
+
return true;
|
|
776
|
+
},
|
|
777
|
+
/*
|
|
778
|
+
* destroyStreamPlayers
|
|
779
|
+
* 功能:切换地址前销毁 hls/flv/mpegts 实例
|
|
780
|
+
*/
|
|
781
|
+
destroyStreamPlayers=function(){
|
|
782
|
+
clearSeekRetry();
|
|
783
|
+
seekApplyLock=false;
|
|
784
|
+
hlsStartPositionUsed=false;
|
|
785
|
+
hlsResumeTarget=-1;
|
|
786
|
+
hlsLoadAt=-1;
|
|
787
|
+
hlsLoadTs=0;
|
|
788
|
+
decodeRecoverCount=0;
|
|
789
|
+
if(hls){
|
|
790
|
+
try{
|
|
791
|
+
hls.destroy();
|
|
792
|
+
}catch(event){}
|
|
793
|
+
hls=null;
|
|
794
|
+
}
|
|
795
|
+
if(pugPlayer){
|
|
796
|
+
try{
|
|
797
|
+
pugPlayer.pause();
|
|
798
|
+
pugPlayer.unload();
|
|
799
|
+
pugPlayer.detachMediaElement();
|
|
800
|
+
pugPlayer.destroy();
|
|
801
|
+
}catch(event){}
|
|
802
|
+
pugPlayer=null;
|
|
803
|
+
}
|
|
804
|
+
},
|
|
665
805
|
/*
|
|
666
806
|
* changeVideo
|
|
667
807
|
* 功能:初始化视频地址或修改视频地址
|
|
@@ -669,6 +809,8 @@
|
|
|
669
809
|
changeVideo=function (vstr){
|
|
670
810
|
var i=0;
|
|
671
811
|
ensureAutoPlug(vstr);
|
|
812
|
+
prepareCookieAndSeek();
|
|
813
|
+
destroyStreamPlayers();
|
|
672
814
|
if(video.attr('src') || video.htm()){
|
|
673
815
|
player.pause();
|
|
674
816
|
}
|
|
@@ -760,52 +902,6 @@
|
|
|
760
902
|
if(isChangeDef){
|
|
761
903
|
checkDefinition();
|
|
762
904
|
}
|
|
763
|
-
/*
|
|
764
|
-
* 对cookie进行相关分析
|
|
765
|
-
*/
|
|
766
|
-
if(vars['cookie']){
|
|
767
|
-
if(valType(vars['cookie'])=='array' && vars['cookie'].length>=2){
|
|
768
|
-
if(vars['cookie'][0] && valType(vars['cookie'][0])=='string'){
|
|
769
|
-
cookieName=vars['cookie'][0];
|
|
770
|
-
}
|
|
771
|
-
if(vars['cookie'][1] && valType(vars['cookie'][1])=='number'){
|
|
772
|
-
cookieTime=vars['cookie'][1];
|
|
773
|
-
}
|
|
774
|
-
}
|
|
775
|
-
if(valType(vars['cookie'])=='object' && !isUndefined(vars['cookie']['name'])){
|
|
776
|
-
cookieName=vars['cookie']['name'];
|
|
777
|
-
if(!isUndefined(vars['cookie']['hour']) && valType(vars['cookie']['hour'])=='number'){
|
|
778
|
-
cookieTime=vars['cookie']['hour'];
|
|
779
|
-
}
|
|
780
|
-
}
|
|
781
|
-
if(valType(vars['cookie'])=='string'){
|
|
782
|
-
cookieName=vars['cookie'];
|
|
783
|
-
}
|
|
784
|
-
if(cookieName){
|
|
785
|
-
cookieName=cookieName.replace(/[ ]*,[ ]*|[ ]+/g, '').replace(/[ ]*;[ ]*|[ ]+/g, '');
|
|
786
|
-
}
|
|
787
|
-
}
|
|
788
|
-
if(!isUndefined(vars['seek']) && !seekTime){
|
|
789
|
-
if(valType(vars['seek'])=='number' && vars['seek']>0){
|
|
790
|
-
seekTime=vars['seek'];
|
|
791
|
-
}
|
|
792
|
-
else if(valType(vars['seek'])=='string' && vars['seek']=='cookie' && cookieName){
|
|
793
|
-
var cke=player.cookie(cookieName);
|
|
794
|
-
if(cke){
|
|
795
|
-
seekTime=cke['time'];
|
|
796
|
-
}
|
|
797
|
-
}
|
|
798
|
-
else if(valType(vars['seek'])=='string' && vars['seek']!=='' && !isNaN(parseFloat(vars['seek']))){
|
|
799
|
-
seekTime=parseFloat(vars['seek']);
|
|
800
|
-
}
|
|
801
|
-
// 与旧版对齐:续播 seek 同步进度水位,避免 timeScheduleAdjust=5 时被打回 0
|
|
802
|
-
if(seekTime && seekTime>0){
|
|
803
|
-
maxSeeTime=Math.max(maxSeeTime,seekTime);
|
|
804
|
-
if(firstSeekTime<0){
|
|
805
|
-
firstSeekTime=seekTime;
|
|
806
|
-
}
|
|
807
|
-
}
|
|
808
|
-
}
|
|
809
905
|
},
|
|
810
906
|
/*
|
|
811
907
|
* plugPlayer
|
|
@@ -847,14 +943,31 @@
|
|
|
847
943
|
hlsPlayer=function (url){
|
|
848
944
|
var startHls=function(){
|
|
849
945
|
if (typeof Hls!=='undefined' && !isUndefined(Hls) && Hls.isSupported()) {
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
946
|
+
if(hls){
|
|
947
|
+
try{
|
|
948
|
+
hls.destroy();
|
|
949
|
+
}catch(event){}
|
|
950
|
+
hls=null;
|
|
951
|
+
}
|
|
952
|
+
var hlsConf={
|
|
953
|
+
// 10s 分片流在续播点附近需要略大缓冲,减少卡住转圈
|
|
954
|
+
maxBufferLength:30,
|
|
955
|
+
maxMaxBufferLength:60
|
|
956
|
+
};
|
|
957
|
+
var resumeAt=seekTime;
|
|
958
|
+
if(!resumeAt){
|
|
959
|
+
resumeAt=parseResumeSeekFromVars();
|
|
960
|
+
}
|
|
961
|
+
// 断点续播:startPosition 必须在 loadSource 前设置,从正确 TS 分片起播
|
|
962
|
+
if(resumeAt && resumeAt>0 && (isUndefined(vars['live']) || !vars['live'])){
|
|
963
|
+
hlsConf.startPosition=resumeAt;
|
|
964
|
+
maxSeeTime=Math.max(maxSeeTime,resumeAt);
|
|
855
965
|
if(firstSeekTime<0){
|
|
856
|
-
firstSeekTime=
|
|
966
|
+
firstSeekTime=resumeAt;
|
|
857
967
|
}
|
|
968
|
+
hlsResumeTarget=resumeAt;
|
|
969
|
+
hlsLoadAt=resumeAt;
|
|
970
|
+
hlsLoadTs=Date.now();
|
|
858
971
|
seekTime=0;
|
|
859
972
|
hlsStartPositionUsed=true;
|
|
860
973
|
clearSeekRetry();
|
|
@@ -867,6 +980,22 @@
|
|
|
867
980
|
applyPendingSeek();
|
|
868
981
|
}
|
|
869
982
|
});
|
|
983
|
+
hls.on(Hls.Events.FRAG_BUFFERED, function(event, data){
|
|
984
|
+
if(hlsResumeTarget<=0 || !data || !data.frag){
|
|
985
|
+
return;
|
|
986
|
+
}
|
|
987
|
+
var fragStart=data.frag.start;
|
|
988
|
+
var fragEnd=fragStart+data.frag.duration;
|
|
989
|
+
if(hlsResumeTarget>=fragStart-0.5 && hlsResumeTarget<=fragEnd+0.5){
|
|
990
|
+
// 续播分片已进入缓冲,解除 waiting
|
|
991
|
+
if(!waited){
|
|
992
|
+
waited=true;
|
|
993
|
+
if(C['buffer']){
|
|
994
|
+
C['buffer'].hide();
|
|
995
|
+
}
|
|
996
|
+
}
|
|
997
|
+
}
|
|
998
|
+
});
|
|
870
999
|
hls.on(Hls.Events.ERROR, function(event, data){
|
|
871
1000
|
var code=9;
|
|
872
1001
|
var message=language['error']['loadingFailed'];
|
|
@@ -1691,17 +1820,23 @@
|
|
|
1691
1820
|
clearSeekRetry();
|
|
1692
1821
|
return;
|
|
1693
1822
|
}
|
|
1823
|
+
if(t>0){
|
|
1824
|
+
maxSeeTime=Math.max(maxSeeTime,t);
|
|
1825
|
+
if(firstSeekTime<0){
|
|
1826
|
+
firstSeekTime=t;
|
|
1827
|
+
}
|
|
1828
|
+
}
|
|
1829
|
+
// HLS:用 hls.startLoad 从目标分片加载(去重,避免取消进行中的 .ts)
|
|
1830
|
+
if(hlsSeekTo(t, !!force)){
|
|
1831
|
+
clearSeekRetry();
|
|
1832
|
+
seekTime=0;
|
|
1833
|
+
return;
|
|
1834
|
+
}
|
|
1694
1835
|
var readyEnough=!isUndefined(video.readyState) && video.readyState>=2;
|
|
1695
1836
|
var bufferedOk=timeInBuffered(t);
|
|
1696
|
-
// 未进入可播缓冲时先等待,并引导 hls 加载目标位置
|
|
1697
1837
|
if(!force && !bufferedOk && (!readyEnough || video.readyState<3)){
|
|
1698
1838
|
seekRetryCount++;
|
|
1699
1839
|
if(seekRetryCount<=50){
|
|
1700
|
-
try{
|
|
1701
|
-
if(hls && typeof hls.startLoad==='function'){
|
|
1702
|
-
hls.startLoad(t);
|
|
1703
|
-
}
|
|
1704
|
-
}catch(event){}
|
|
1705
1840
|
if(seekRetryTimer){
|
|
1706
1841
|
clearTimeout(seekRetryTimer);
|
|
1707
1842
|
}
|
|
@@ -1712,12 +1847,6 @@
|
|
|
1712
1847
|
}
|
|
1713
1848
|
}
|
|
1714
1849
|
clearSeekRetry();
|
|
1715
|
-
if(t>0){
|
|
1716
|
-
maxSeeTime=Math.max(maxSeeTime,t);
|
|
1717
|
-
if(firstSeekTime<0){
|
|
1718
|
-
firstSeekTime=t;
|
|
1719
|
-
}
|
|
1720
|
-
}
|
|
1721
1850
|
seekApplyLock=true;
|
|
1722
1851
|
seekTime=0;
|
|
1723
1852
|
try{
|
|
@@ -1726,7 +1855,6 @@
|
|
|
1726
1855
|
seekTime=t;
|
|
1727
1856
|
seekApplyLock=false;
|
|
1728
1857
|
}
|
|
1729
|
-
// seeked / 短暂延时后解锁,允许后续切换清晰度再 seek
|
|
1730
1858
|
setTimeout(function(){
|
|
1731
1859
|
seekApplyLock=false;
|
|
1732
1860
|
},800);
|
|
@@ -2449,7 +2577,8 @@
|
|
|
2449
2577
|
ad['frontPlay']=false;
|
|
2450
2578
|
C['ad'].hide();
|
|
2451
2579
|
allBarShow();
|
|
2452
|
-
seekTime=
|
|
2580
|
+
seekTime=0;
|
|
2581
|
+
applyResumeSeekState(parseResumeSeekFromVars());
|
|
2453
2582
|
if(ad['front']['video']){//如果包含视频广告
|
|
2454
2583
|
changeVideo(vars['video']);
|
|
2455
2584
|
}
|
|
@@ -3081,11 +3210,15 @@
|
|
|
3081
3210
|
maxSeeTime=Math.max(maxSeeTime,target);
|
|
3082
3211
|
}
|
|
3083
3212
|
// 目标尚未进入缓冲时改为挂起,由 applyPendingSeek 等待后再跳
|
|
3084
|
-
if(target>0.5 && !timeInBuffered(target) && video.readyState<3){
|
|
3213
|
+
if(target>0.5 && !timeInBuffered(target) && video.readyState<3 && !hls){
|
|
3085
3214
|
seekTime=target;
|
|
3086
3215
|
applyPendingSeek(false);
|
|
3087
3216
|
return player;
|
|
3088
3217
|
}
|
|
3218
|
+
if(hlsSeekTo(target, false)){
|
|
3219
|
+
seekTime=0;
|
|
3220
|
+
return player;
|
|
3221
|
+
}
|
|
3089
3222
|
try{
|
|
3090
3223
|
video.currentTime=target;
|
|
3091
3224
|
seekTime=0;
|
|
@@ -6901,7 +7034,7 @@
|
|
|
6901
7034
|
if(!isRetry && (!vars || vars['cdnFallback']!==false)){
|
|
6902
7035
|
var cdn=(typeof window!=='undefined' && window.ckplayerPlusCdn) ? window.ckplayerPlusCdn : ckplayerPlusDefaultCdn;
|
|
6903
7036
|
var m=String(file).match(/\/(hls\.js|flv\.js|mpegts\.js|language)\/([^/?#]+)(?:[?#].*)?$/i);
|
|
6904
|
-
if(cdn && cdn.indexOf('1.0.
|
|
7037
|
+
if(cdn && cdn.indexOf('1.0.8')===-1 && m){
|
|
6905
7038
|
if(cdn.slice(-1)!=='/'){
|
|
6906
7039
|
cdn+='/';
|
|
6907
7040
|
}
|