ckplayer-plus 1.0.6 → 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/dist/ckplayer.js +147 -70
- package/dist/ckplayer.min.js +2 -2
- package/dist/index.cjs +128 -62
- package/dist/index.js +128 -62
- package/dist/react.cjs +128 -62
- package/dist/react.js +128 -62
- package/dist/vue.cjs +128 -62
- package/dist/vue.js +128 -62
- 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.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
|
|
@@ -414,7 +414,7 @@
|
|
|
414
414
|
}
|
|
415
415
|
var allowCdn=!vars || vars['cdnFallback']!==false;
|
|
416
416
|
var cdn=(typeof window!=='undefined' && window.ckplayerPlusCdn) ? window.ckplayerPlusCdn : ckplayerPlusDefaultCdn;
|
|
417
|
-
if(!allowCdn || !cdn || cdn.indexOf('1.0.
|
|
417
|
+
if(!allowCdn || !cdn || cdn.indexOf('1.0.7')>-1){
|
|
418
418
|
// 避免占位版本或显式关闭 CDN 时请求坏地址;交给相对路径或业务 pluginPath
|
|
419
419
|
return folder+'/'+file;
|
|
420
420
|
}
|
|
@@ -662,6 +662,99 @@
|
|
|
662
662
|
*/
|
|
663
663
|
return player;
|
|
664
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
|
+
},
|
|
665
758
|
/*
|
|
666
759
|
* changeVideo
|
|
667
760
|
* 功能:初始化视频地址或修改视频地址
|
|
@@ -669,6 +762,8 @@
|
|
|
669
762
|
changeVideo=function (vstr){
|
|
670
763
|
var i=0;
|
|
671
764
|
ensureAutoPlug(vstr);
|
|
765
|
+
prepareCookieAndSeek();
|
|
766
|
+
destroyStreamPlayers();
|
|
672
767
|
if(video.attr('src') || video.htm()){
|
|
673
768
|
player.pause();
|
|
674
769
|
}
|
|
@@ -760,52 +855,6 @@
|
|
|
760
855
|
if(isChangeDef){
|
|
761
856
|
checkDefinition();
|
|
762
857
|
}
|
|
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
858
|
},
|
|
810
859
|
/*
|
|
811
860
|
* plugPlayer
|
|
@@ -847,13 +896,27 @@
|
|
|
847
896
|
hlsPlayer=function (url){
|
|
848
897
|
var startHls=function(){
|
|
849
898
|
if (typeof Hls!=='undefined' && !isUndefined(Hls) && Hls.isSupported()) {
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
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);
|
|
855
918
|
if(firstSeekTime<0){
|
|
856
|
-
firstSeekTime=
|
|
919
|
+
firstSeekTime=resumeAt;
|
|
857
920
|
}
|
|
858
921
|
seekTime=0;
|
|
859
922
|
hlsStartPositionUsed=true;
|
|
@@ -1691,17 +1754,28 @@
|
|
|
1691
1754
|
clearSeekRetry();
|
|
1692
1755
|
return;
|
|
1693
1756
|
}
|
|
1757
|
+
if(t>0){
|
|
1758
|
+
maxSeeTime=Math.max(maxSeeTime,t);
|
|
1759
|
+
if(firstSeekTime<0){
|
|
1760
|
+
firstSeekTime=t;
|
|
1761
|
+
}
|
|
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
|
+
}
|
|
1694
1774
|
var readyEnough=!isUndefined(video.readyState) && video.readyState>=2;
|
|
1695
1775
|
var bufferedOk=timeInBuffered(t);
|
|
1696
|
-
// 未进入可播缓冲时先等待,并引导 hls 加载目标位置
|
|
1697
1776
|
if(!force && !bufferedOk && (!readyEnough || video.readyState<3)){
|
|
1698
1777
|
seekRetryCount++;
|
|
1699
1778
|
if(seekRetryCount<=50){
|
|
1700
|
-
try{
|
|
1701
|
-
if(hls && typeof hls.startLoad==='function'){
|
|
1702
|
-
hls.startLoad(t);
|
|
1703
|
-
}
|
|
1704
|
-
}catch(event){}
|
|
1705
1779
|
if(seekRetryTimer){
|
|
1706
1780
|
clearTimeout(seekRetryTimer);
|
|
1707
1781
|
}
|
|
@@ -1712,12 +1786,6 @@
|
|
|
1712
1786
|
}
|
|
1713
1787
|
}
|
|
1714
1788
|
clearSeekRetry();
|
|
1715
|
-
if(t>0){
|
|
1716
|
-
maxSeeTime=Math.max(maxSeeTime,t);
|
|
1717
|
-
if(firstSeekTime<0){
|
|
1718
|
-
firstSeekTime=t;
|
|
1719
|
-
}
|
|
1720
|
-
}
|
|
1721
1789
|
seekApplyLock=true;
|
|
1722
1790
|
seekTime=0;
|
|
1723
1791
|
try{
|
|
@@ -1726,7 +1794,6 @@
|
|
|
1726
1794
|
seekTime=t;
|
|
1727
1795
|
seekApplyLock=false;
|
|
1728
1796
|
}
|
|
1729
|
-
// seeked / 短暂延时后解锁,允许后续切换清晰度再 seek
|
|
1730
1797
|
setTimeout(function(){
|
|
1731
1798
|
seekApplyLock=false;
|
|
1732
1799
|
},800);
|
|
@@ -2449,7 +2516,8 @@
|
|
|
2449
2516
|
ad['frontPlay']=false;
|
|
2450
2517
|
C['ad'].hide();
|
|
2451
2518
|
allBarShow();
|
|
2452
|
-
seekTime=
|
|
2519
|
+
seekTime=0;
|
|
2520
|
+
applyResumeSeekState(parseResumeSeekFromVars());
|
|
2453
2521
|
if(ad['front']['video']){//如果包含视频广告
|
|
2454
2522
|
changeVideo(vars['video']);
|
|
2455
2523
|
}
|
|
@@ -3081,11 +3149,20 @@
|
|
|
3081
3149
|
maxSeeTime=Math.max(maxSeeTime,target);
|
|
3082
3150
|
}
|
|
3083
3151
|
// 目标尚未进入缓冲时改为挂起,由 applyPendingSeek 等待后再跳
|
|
3084
|
-
if(target>0.5 && !timeInBuffered(target) && video.readyState<3){
|
|
3152
|
+
if(target>0.5 && !timeInBuffered(target) && video.readyState<3 && !hls){
|
|
3085
3153
|
seekTime=target;
|
|
3086
3154
|
applyPendingSeek(false);
|
|
3087
3155
|
return player;
|
|
3088
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
|
+
}
|
|
3089
3166
|
try{
|
|
3090
3167
|
video.currentTime=target;
|
|
3091
3168
|
seekTime=0;
|
|
@@ -6901,7 +6978,7 @@
|
|
|
6901
6978
|
if(!isRetry && (!vars || vars['cdnFallback']!==false)){
|
|
6902
6979
|
var cdn=(typeof window!=='undefined' && window.ckplayerPlusCdn) ? window.ckplayerPlusCdn : ckplayerPlusDefaultCdn;
|
|
6903
6980
|
var m=String(file).match(/\/(hls\.js|flv\.js|mpegts\.js|language)\/([^/?#]+)(?:[?#].*)?$/i);
|
|
6904
|
-
if(cdn && cdn.indexOf('1.0.
|
|
6981
|
+
if(cdn && cdn.indexOf('1.0.7')===-1 && m){
|
|
6905
6982
|
if(cdn.slice(-1)!=='/'){
|
|
6906
6983
|
cdn+='/';
|
|
6907
6984
|
}
|