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 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.6/dist/';
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.6')>-1){
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
- var hlsConf={};
851
- // 断点续播:优先用 startPosition,让 hls 从正确分片/关键帧起播,避免裸 currentTime 解码失败
852
- if(seekTime && seekTime>0 && (isUndefined(vars['live']) || !vars['live'])){
853
- hlsConf.startPosition=seekTime;
854
- maxSeeTime=Math.max(maxSeeTime,seekTime);
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=seekTime;
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=vars['seek'];
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.6')===-1 && m){
6981
+ if(cdn && cdn.indexOf('1.0.7')===-1 && m){
6905
6982
  if(cdn.slice(-1)!=='/'){
6906
6983
  cdn+='/';
6907
6984
  }