| 
					
				 | 
			
			
				@@ -51,13 +51,15 @@ class PQStuckPointEditerController: PQBaseViewController { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     var lastEditModelBtn: UIButton? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // add by ak  最大、最小速度 有固定值和自定义,当快慢速下两个值都有效,当跳跃卡点只有maxSpeed有效 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    var maxSpeed: Float = 0.0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    var minSpeed: Float = 0.0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    var maxSpeed: Float = 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    var minSpeed: Float = 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     //快慢速最后一次选择的速度位置 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     var lastSpeedSelectIndex:Int = 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     //跳跃卡点最后一次选择的速度位置 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     var lastJumpSpeedSelectIndex:Int = 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //循环次数设置最后一次选择的位置 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    var lastCyclesSelectIndex:Int = 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     //当前选择的玩法模式 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     var currentCreateStickersModel:createStickersModel = .createStickersModelSpeed 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -319,15 +321,17 @@ class PQStuckPointEditerController: PQBaseViewController { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         speedSettingView.selectSpeedCallBack = { [weak self] maxSpeed, minSpeed,selectIndex in 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             BFLog(message: "固定maxSpeed is\(maxSpeed) minSpeed \(minSpeed)") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             //更新最后一次选择的位置恢复时使用 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if(speedSettingView.viewType == 2){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if(speedSettingView.viewType == 1){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                self?.lastSpeedSelectIndex = selectIndex 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }else if(speedSettingView.viewType == 2){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 self?.lastJumpSpeedSelectIndex = selectIndex 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             }else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                self?.lastSpeedSelectIndex = selectIndex 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                self?.lastCyclesSelectIndex = selectIndex 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             self?.maxSpeed = maxSpeed 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             self?.minSpeed = minSpeed 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if maxSpeed == 0 && minSpeed == 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                self?.customSpeedSettingView.isHidden = false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if maxSpeed == -1.0 && minSpeed == -1.0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                self?.customSpeedSettingView.isHidden = true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 self?.customSpeedSettingView.isJumpSpeedModel = speedSettingView.viewType == 2 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             self?.settingPlayerView() 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -484,49 +488,79 @@ class PQStuckPointEditerController: PQBaseViewController { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         BFLog(message: "sender tag is \(sender.tag)") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // 1 ui 调整 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if sender.tag == 1 || sender.tag == 2 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            speedSettingView.viewType = sender.tag 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            customSpeedSettingView.isJumpSpeedModel = speedSettingView.viewType == 2 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          if sender.tag == 1 || sender.tag == 2 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              speedSettingView.viewType = sender.tag 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              customSpeedSettingView.isJumpSpeedModel = speedSettingView.viewType == 2 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              speedSettingView.snp.remakeConstraints { make in 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  make.left.equalToSuperview().offset(16) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  make.right.equalToSuperview() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  make.top.equalTo(editModelLineView.snp_bottom).offset(8) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  make.height.equalTo(sender.tag == 1 ? 44 : 30) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              speedSettingView.isHidden = false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              speedTitleLab.isHidden = false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              sustomSwitchView.isHidden = false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              editModelLineView.isHidden = false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+               
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              speedTitleLab.isHidden = true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              speedSettingView.isHidden = true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              editModelLineView.isHidden = true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              sustomSwitchView.isHidden = true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //素材全是图片的时候三个模式都显示循环设置 UI 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if(selectedDataCount == selectedImageDataCount){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            speedSettingView.viewType = 3 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            customSpeedSettingView.isJumpSpeedModel = false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             speedSettingView.snp.remakeConstraints { make in 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 make.left.equalToSuperview().offset(16) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 make.right.equalToSuperview() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 make.top.equalTo(editModelLineView.snp_bottom).offset(8) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                make.height.equalTo(sender.tag == 1 ? 44 : 30) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                make.height.equalTo(30) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            speedSettingView.isHidden = false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            speedTitleLab.isHidden = false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            sustomSwitchView.isHidden = false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            editModelLineView.isHidden = false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            speedSettingView.isHidden = true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            speedTitleLab.isHidden = true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            sustomSwitchView.isHidden = true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            editModelLineView.isHidden = true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            speedSettingView.isHidden = !(selectedDataCount == selectedImageDataCount) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            editModelLineView.isHidden = !(selectedDataCount == selectedImageDataCount) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+           
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            speedSettingView.setSelectItem(index: lastCyclesSelectIndex) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+       
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if sender.tag == 1 { // 快慢速 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                speedSettingView.setSelectItem(index: lastSpeedSelectIndex) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } else if sender.tag == 2 { // 跳跃卡点 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                speedSettingView.setSelectItem(index: lastJumpSpeedSelectIndex) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } else if sender.tag == 3 { // 仅音乐 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                customSpeedSettingView.isJumpSpeedModel = false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                speedSettingView.viewType = 2 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // 2 不同状的业务逻辑 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 2 设置 btn 不同显示状态 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         var speedStuckBtnGifName = "" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         var jumpPointBtnGifName = "" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if sender.tag == 1 { // 快慢速 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             speedStuckBtnGifName = "speedstuck_h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             jumpPointBtnGifName = "jumpPoint_n" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             currentCreateStickersModel = .createStickersModelSpeed 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            speedSettingView.setSelectItem(index: lastSpeedSelectIndex) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-             
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } else if sender.tag == 2 { // 跳跃卡点 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             speedStuckBtnGifName = "speedstuck_n" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             jumpPointBtnGifName = "jumpPoint_h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            speedSettingView.setSelectItem(index: lastJumpSpeedSelectIndex) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             currentCreateStickersModel = .createStickersModelPoint 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } else if sender.tag == 3 { // 仅音乐 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             speedStuckBtnGifName = "speedstuck_n" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             jumpPointBtnGifName = "jumpPoint_n" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             currentCreateStickersModel = .createStickersModelOnlyMusic 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         settingPlayerView() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         speedStuckBtnGif.kf.setImage(with: URL(fileURLWithPath:  Bundle.init().BF_mainbundle().path(forResource:speedStuckBtnGifName , ofType: ".gif")!)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         jumpPointBtnGif.kf.setImage(with: URL(fileURLWithPath:  Bundle.init().BF_mainbundle().path(forResource: jumpPointBtnGifName  , ofType: ".gif")!)) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1043,109 +1077,138 @@ extension PQStuckPointEditerController { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        }else if (model == .createStickersModelOnlyMusic || model == .createStickersModelSpeed){ //仅音乐 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }else if (model == .createStickersModelOnlyMusic || model == .createStickersModelSpeed){ //仅音乐 和 跳跃卡点 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             for section in sections { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 if section.sectionType == "normal" { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     BFLog(message: "stuckPoints count is \(finallyStuckPoints.count)") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    //一共裁剪的段数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    var totalClipNum:Int = 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    for sticker in section.sectionTimeline!.visionTrack!.getEnableVisionTrackMaterials() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        if sticker.type == StickerType.VIDEO.rawValue { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            let asset: AVURLAsset = AVURLAsset(url: URL(fileURLWithPath: documensDirectory + sticker.locationPath), options: nil) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            var i:Int = 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            //一个视频切的的段落 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            var oneVideoClipNum:Int = 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            var realUsedMusicDuration = 0.0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            while realUsedMusicDuration <= CMTimeGetSeconds(asset.duration) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                //快速段 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                let LA = maxSpeed * (finallyStuckPoints[i+1] - finallyStuckPoints[i]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                realUsedMusicDuration = realUsedMusicDuration + Float64(LA) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                if(realUsedMusicDuration > CMTimeGetSeconds(asset.duration)){ break} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                oneVideoClipNum = oneVideoClipNum + 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                //慢速段 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                if(i + 2 >= finallyStuckPoints.count){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                    break 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                     
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    // 第一种情况:全是图片,图片回环播放 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if section.sectionTimeline!.visionTrack!.getEnableVisionTrackMaterials(type: "video").count == 0, section.sectionTimeline!.visionTrack!.getEnableVisionTrackMaterials(type: "image").count > 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        for (index, point) in finallyStuckPoints.enumerated() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            let sticker: PQEditVisionTrackMaterialsModel = section.sectionTimeline!.visionTrack!.getEnableVisionTrackMaterials()[index % section.sectionTimeline!.visionTrack!.getEnableVisionTrackMaterials().count] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            BFLog(message: "stickerlocationPath sticker : \(sticker.locationPath)") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            let stickerjson = sticker.toJSONString(prettyPrint: false) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            let deepCopySticker = Mapper<PQEditVisionTrackMaterialsModel>().map(JSONString: stickerjson!) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            if deepCopySticker!.type == StickerType.IMAGE.rawValue { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                if index + 1 < finallyStuckPoints.count { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    deepCopySticker!.timelineIn = Float64("\(finallyStuckPoints[index])") ?? 0.0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                     
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    deepCopySticker!.timelineOut = Float64("\(finallyStuckPoints[index + 1])") ?? 0.0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    if deepCopySticker != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        deepCopySticker?.generateDefaultValues() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        stickers.append(deepCopySticker!) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                let LB = minSpeed * (finallyStuckPoints[i+2] - finallyStuckPoints[i+1]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                realUsedMusicDuration = realUsedMusicDuration + Float64(LB) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                oneVideoClipNum = oneVideoClipNum + 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                i = i + 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            BFLog(message: "单个视频\(sticker.locationPath)时长::\(CMTimeGetSeconds(asset.duration)) ,clipNum is:\(oneVideoClipNum)") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            var lastOutTime:Float64 = 0.0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            for clipindex in 0 ... oneVideoClipNum - 1 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                // deep copy sticker model 防止只有一个对象 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                let stickerjson = sticker.toJSONString(prettyPrint: false) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                let deepCopySticker = Mapper<PQEditVisionTrackMaterialsModel>().map(JSONString: stickerjson!) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                // 设置循环模式和适配模式 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                deepCopySticker?.generateDefaultValues() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                //当前分段的速度 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                var tempSpeed:Float = 1.0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                if model == .createStickersModelSpeed{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                    tempSpeed = (totalClipNum + clipindex) % 2 == 0 ? maxSpeed : minSpeed 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    }else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        //一共裁剪的段数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        var totalClipNum:Int = 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        for sticker in section.sectionTimeline!.visionTrack!.getEnableVisionTrackMaterials() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            if sticker.type == StickerType.VIDEO.rawValue { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                let asset: AVURLAsset = AVURLAsset(url: URL(fileURLWithPath: documensDirectory + sticker.locationPath), options: nil) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                var i:Int = 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                //一个视频切的的段落 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                var oneVideoClipNum:Int = 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                var realUsedMusicDuration = 0.0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                while realUsedMusicDuration <= CMTimeGetSeconds(asset.duration) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    //快速段 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    let LA = maxSpeed * (finallyStuckPoints[i+1] - finallyStuckPoints[i]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    realUsedMusicDuration = realUsedMusicDuration + Float64(LA) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    if(realUsedMusicDuration > CMTimeGetSeconds(asset.duration)){ break} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    oneVideoClipNum = oneVideoClipNum + 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    //慢速段 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    if(i + 2 >= finallyStuckPoints.count){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        break 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    let LB = minSpeed * (finallyStuckPoints[i+2] - finallyStuckPoints[i+1]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    realUsedMusicDuration = realUsedMusicDuration + Float64(LB) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    oneVideoClipNum = oneVideoClipNum + 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    i = i + 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                           
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                if(totalClipNum + 1 + clipindex < finallyStuckPoints.count){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                    deepCopySticker?.speedRate = tempSpeed 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                    //定义临时使用的变量 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                    let tempModel_In = lastOutTime 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                    let tempOut = lastOutTime + Float64(tempSpeed) * Float64(finallyStuckPoints[totalClipNum + 1 + clipindex] - finallyStuckPoints[totalClipNum + clipindex]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                    let tempTimelineIn = Float64(finallyStuckPoints[totalClipNum + clipindex]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                    let timelineOut = Float64(finallyStuckPoints[totalClipNum + 1 + clipindex]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                    //处理最后一点视频素材不够卡点时长 e.g. 0.3 卡点时长0.5 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                    if(tempOut > realUsedMusicDuration){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                        BFLog(message: "最后一点视频素材不够卡点时长 ") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                        //最后一点素材时长 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                        let lastAssetDuration = realUsedMusicDuration - tempOut 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                        let pointDuration = timelineOut -  tempTimelineIn 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                        let needSpeed = lastAssetDuration / pointDuration 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                        //当前卡点段为快速 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                        if(tempSpeed >= 1){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                            if(needSpeed > 0.4 * Double(tempSpeed)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                                deepCopySticker?.speedRate = tempSpeed 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                            } else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                                continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                        }else{//当前卡点段为慢速 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                            if(needSpeed > 0.4 * Double(tempSpeed) && needSpeed > 0.2){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                                deepCopySticker?.speedRate = tempSpeed 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                            } else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                                continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                BFLog(message: "单个视频\(sticker.locationPath)时长::\(CMTimeGetSeconds(asset.duration)) ,clipNum is:\(oneVideoClipNum)") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                var lastOutTime:Float64 = 0.0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                for clipindex in 0 ... oneVideoClipNum - 1 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    // deep copy sticker model 防止只有一个对象 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    let stickerjson = sticker.toJSONString(prettyPrint: false) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    let deepCopySticker = Mapper<PQEditVisionTrackMaterialsModel>().map(JSONString: stickerjson!) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    // 设置循环模式和适配模式 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    deepCopySticker?.generateDefaultValues() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    //当前分段的速度 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    var tempSpeed:Float = 1.0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    if model == .createStickersModelSpeed{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        tempSpeed = (totalClipNum + clipindex) % 2 == 0 ? maxSpeed : minSpeed 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                               
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    if(totalClipNum + 1 + clipindex < finallyStuckPoints.count){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        deepCopySticker?.speedRate = tempSpeed 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        //定义临时使用的变量 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        let tempModel_In = lastOutTime 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        let tempOut = lastOutTime + Float64(tempSpeed) * Float64(finallyStuckPoints[totalClipNum + 1 + clipindex] - finallyStuckPoints[totalClipNum + clipindex]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        let tempTimelineIn = Float64(finallyStuckPoints[totalClipNum + clipindex]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        let timelineOut = Float64(finallyStuckPoints[totalClipNum + 1 + clipindex]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        //处理最后一点视频素材不够卡点时长 e.g. 0.3 卡点时长0.5 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        if(tempOut > realUsedMusicDuration){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                            BFLog(message: "最后一点视频素材不够卡点时长 ") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                            //最后一点素材时长 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                            let lastAssetDuration = realUsedMusicDuration - tempOut 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                            let pointDuration = timelineOut -  tempTimelineIn 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                            let needSpeed = lastAssetDuration / pointDuration 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                            //当前卡点段为快速 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                            if(tempSpeed >= 1){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                                if(needSpeed > 0.4 * Double(tempSpeed)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                                    deepCopySticker?.speedRate = tempSpeed 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                                } else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                                    continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                            }else{//当前卡点段为慢速 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                                if(needSpeed > 0.4 * Double(tempSpeed) && needSpeed > 0.2){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                                    deepCopySticker?.speedRate = tempSpeed 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                                } else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                                    continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        deepCopySticker?.model_in = tempModel_In 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        deepCopySticker?.out = tempOut 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                    deepCopySticker?.model_in = tempModel_In 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                    deepCopySticker?.out = tempOut 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        deepCopySticker?.timelineIn = tempTimelineIn 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        deepCopySticker?.timelineOut = timelineOut 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                    deepCopySticker?.timelineIn = tempTimelineIn 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                    deepCopySticker?.timelineOut = timelineOut 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        lastOutTime =  deepCopySticker?.out ?? 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                    lastOutTime =  deepCopySticker?.out ?? 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    BFLog(message: " 创建 sticker crilp is in \(String(format: "%.6f", deepCopySticker?.model_in ?? 0)) out  \(String(format: "%.6f", deepCopySticker?.out ?? 0)) ,分段素材时长:\(String(format: "%.6f", (deepCopySticker?.out ?? 0) - (deepCopySticker?.model_in ?? 0))) ,分段显示时长:\(String(format: "%.6f", (deepCopySticker?.timelineOut ?? 0) - (deepCopySticker?.timelineIn ?? 0))), 总时长\(CMTimeGetSeconds(asset.duration)) timelineIN: \(String(format: "%.6f", deepCopySticker?.timelineIn ?? 0)) timelineOUT:\(String(format: "%.6f", deepCopySticker?.timelineOut ?? 0)) speedRate:\(deepCopySticker?.speedRate ?? 0.0)") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                BFLog(message: " 创建 sticker crilp is in \(String(format: "%.6f", deepCopySticker?.model_in ?? 0)) out  \(String(format: "%.6f", deepCopySticker?.out ?? 0)) ,分段素材时长:\(String(format: "%.6f", (deepCopySticker?.out ?? 0) - (deepCopySticker?.model_in ?? 0))) ,分段显示时长:\(String(format: "%.6f", (deepCopySticker?.timelineOut ?? 0) - (deepCopySticker?.timelineIn ?? 0))), 总时长\(CMTimeGetSeconds(asset.duration)) timelineIN: \(String(format: "%.6f", deepCopySticker?.timelineIn ?? 0)) timelineOUT:\(String(format: "%.6f", deepCopySticker?.timelineOut ?? 0)) speedRate:\(deepCopySticker?.speedRate ?? 0.0)") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    if deepCopySticker != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        stickers.append(deepCopySticker!) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                if deepCopySticker != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                    stickers.append(deepCopySticker!) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                totalClipNum = totalClipNum + oneVideoClipNum - 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            } else if sticker.type == StickerType.IMAGE.rawValue { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                if(totalClipNum + 1 >= finallyStuckPoints.count){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    BFLog(message: "数据出现错误!!!查正") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    break 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                sticker.generateDefaultValues() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                sticker.timelineIn = Float64(finallyStuckPoints[totalClipNum]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                sticker.timelineOut = Float64(finallyStuckPoints[totalClipNum + 1]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                totalClipNum = totalClipNum + 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                stickers.append(sticker) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            totalClipNum = totalClipNum + oneVideoClipNum - 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        } else if sticker.type == StickerType.IMAGE.rawValue { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            sticker.generateDefaultValues() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            sticker.timelineIn = Float64(finallyStuckPoints[totalClipNum]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            sticker.timelineOut = Float64(finallyStuckPoints[totalClipNum + 1]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            stickers.append(sticker) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				              
			 | 
		
	
		
			
				 | 
				 | 
			
			
				              
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1199,15 +1262,21 @@ extension PQStuckPointEditerController { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         for point in stuckPoints { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             BFLog(message: "没有 start end 计算后的卡点数\(point)") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if stuckPoints.first != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            stuckPoints.removeFirst() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if stuckPoints.last != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            stuckPoints.removeLast() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //若音乐起点至第一个卡点点位之间时长t0<0.3时,此段时长与下一个点位时长合并,故第一段卡点部分时长为t0+d 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if(Float(stuckPointMusicData?.startTime ?? 0) - (stuckPoints.first ?? 0.0) < 0.3){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if stuckPoints.first != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                stuckPoints.removeFirst() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // 开始时间是服务器返回, 结果时间根据策略计算的 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         stuckPoints.insert(Float(stuckPointMusicData?.startTime ?? 0), at: 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        stuckPoints.insert(Float(stuckPointMusicData?.endTime ?? 0), at: stuckPoints.count) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        if stuckPoints.last != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            stuckPoints.removeLast() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 开始时间是服务器返回, 结果时间根据策略计算的 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        stuckPoints.insert(Float(stuckPointMusicData?.startTime ?? 0), at: 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        stuckPoints.insert(Float(stuckPointMusicData?.endTime ?? 0), at: stuckPoints.count) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         for point in stuckPoints { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             BFLog(message: "有 start end 计算后的卡点数\(point)") 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1231,10 +1300,6 @@ extension PQStuckPointEditerController { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         let stuckPointsTemp:Array<Float> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if(selectedDataCount == selectedImageDataCount){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         //最后真正要使用推荐结束时长 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         var realUsedMusicDuration:Float = 0.0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         switch model { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1272,7 +1337,6 @@ extension PQStuckPointEditerController { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             break 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         case .createStickersModelSpeed://快慢速 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//                (1:快节奏,2:适中,3:慢节奏) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 //          快慢速  (2:快节奏,3:适中,4:慢节奏) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             stuckPointsTemp  = getUsedStuckPoint(seed: (stuckPointMusicData?.speed ?? 0) + 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				              
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1292,7 +1356,7 @@ extension PQStuckPointEditerController { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             var i:Int = 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             var LACount:Int = 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             var LBCount:Int = 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            while realUsedMusicDuration <= Float(selectedTotalDuration) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            while realUsedMusicDuration < Float(selectedTotalDuration) && selectedTotalDuration != 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				              
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 //回环从头取 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 if(i+2 > stuckPointsTemp.count){ 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1367,8 +1431,62 @@ extension PQStuckPointEditerController { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             break 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //拼接图片所使用的时长 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //二,最一个卡点在原数组中的位置,从这个位置开始拼接图片所要使用的卡点 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        var pointIndex = stuckPointsTemp.firstIndex(where: { (point) -> Bool in 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            (point == (finallyStuckPoints.last ?? 0).truncatingRemainder(dividingBy: (stuckPointsTemp.last ?? 0))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        pointIndex = (pointIndex ?? 0) + 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for i in 0...selectedImageDataCount { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            finallyStuckPoints.append(stuckPointsTemp[(i + Int(pointIndex ?? 0))  % stuckPointsTemp.count] + Float((i + Int(pointIndex ?? 0)) / stuckPointsTemp.count) * (stuckPointsTemp.first ?? 0)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        selectedTotalDuration = Float64(((finallyStuckPoints.last ?? 0) - (finallyStuckPoints.first ?? 0))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         //3)素材全是图片时如果时长 < 10s要做轮播处理 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         if(selectedDataCount == selectedImageDataCount && selectedTotalDuration < 10 ){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //已经设置过循环次数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if(lastCyclesSelectIndex != 0){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                for i in 0...lastCyclesSelectIndex { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                     
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    var pointIndex = stuckPointsTemp.firstIndex(where: { (point) -> Bool in 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        (point == (finallyStuckPoints.last ?? 0).truncatingRemainder(dividingBy: (stuckPointsTemp.last ?? 0))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    pointIndex = (pointIndex ?? 0) + 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    for i in 0...selectedImageDataCount { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                         
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        finallyStuckPoints.append(stuckPointsTemp[(i + Int(pointIndex ?? 0))  % stuckPointsTemp.count] + Float((i + Int(pointIndex ?? 0)) / stuckPointsTemp.count) * (stuckPointsTemp.first ?? 0)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                lastCyclesSelectIndex = 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                while selectedTotalDuration < 10{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    //不够10S 时 一次加图片数量的卡点数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    var pointIndex = stuckPointsTemp.firstIndex(where: { (point) -> Bool in 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        (point == (finallyStuckPoints.last ?? 0).truncatingRemainder(dividingBy: (stuckPointsTemp.last ?? 0))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    pointIndex = (pointIndex ?? 0) + 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    for i in 0...selectedImageDataCount { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                         
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        finallyStuckPoints.append(stuckPointsTemp[(i + Int(pointIndex ?? 0))  % stuckPointsTemp.count] + Float((i + Int(pointIndex ?? 0)) / stuckPointsTemp.count) * (stuckPointsTemp.first ?? 0)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                     
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    selectedTotalDuration = Float64((finallyStuckPoints.last ?? 0) - (finallyStuckPoints.first ?? 0)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    lastCyclesSelectIndex = lastCyclesSelectIndex + 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                speedSettingView.setSelectItem(index: lastCyclesSelectIndex) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         
			 | 
		
	
		
			
				 | 
				 | 
			
			
				          
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        //计算最后使用的音频时长, 如果不用拼接音频时长度是卡点的倒数第二位时间 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        lastJumpSpeedSelectIndex = 6 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //三,计算最后使用的音频时长, 如果不用拼接音频时长度是卡点的倒数第二位时间 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         let asset = AVURLAsset(url: URL(fileURLWithPath: documensDirectory + (stuckPointMusicData?.localPath ?? "")), options: nil) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         //原推荐卡点的倒数第二位时间 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1381,6 +1499,7 @@ extension PQStuckPointEditerController { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				              
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				          
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         playeTimeRange = CMTimeRange(start: CMTime(value: CMTimeValue( Float(stuckPointMusicData?.startTime ?? 0) * Float(BASE_FILTER_TIMESCALE)), timescale: BASE_FILTER_TIMESCALE), end: CMTime(value: CMTimeValue((Float(finallyStuckPoints.last ?? 0)) * Float(BASE_FILTER_TIMESCALE)), timescale: BASE_FILTER_TIMESCALE)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // 更新裁剪时间条的的ui数据 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1562,12 +1681,6 @@ extension PQStuckPointEditerController { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         createPorjectData() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        //0 先计算所有图片的总时长 = 平均卡点时长  * 图片个数 * 档位 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let avgPoint:Float = (Float(stuckPointMusicData!.rhythmSdata[0].pointTimes.last ?? 0) - Float(stuckPointMusicData!.rhythmSdata[0].pointTimes.first ?? 0))  / Float(stuckPointMusicData!.rhythmSdata[0].pointTimes.count) /  Float(BASE_FILTER_TIMESCALE) * Float(stuckPointMusicData?.speed ?? 2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        selectedTotalDuration = selectedTotalDuration + Float64(Float(selectedImageDataCount) * avgPoint) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         BFLog(message: "界面编辑界面时参数 选择素材时长:\(selectedTotalDuration) 选择素材总数:\(selectedDataCount) 选择图片总数\(selectedImageDataCount)") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				          
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1631,7 +1744,7 @@ extension PQStuckPointEditerController { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             //默认进入跳跃卡点模式 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             editModelClick(sender: jumpPointBtn) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            speedSettingView.setSelectItem(index: lastJumpSpeedSelectIndex) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            speedSettingView.setSelectItem(index: lastJumpSpeedSelectIndex) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				              
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         }else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1639,12 +1752,12 @@ extension PQStuckPointEditerController { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if(selectedTotalDuration > 0 && selectedTotalDuration <= 144){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 editModelClick(sender: speedStuckBtn) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                speedSettingView.setSelectItem(index: lastSpeedSelectIndex) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                speedSettingView.setSelectItem(index: lastSpeedSelectIndex) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             }else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 //默认进入卡点模式 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 editModelClick(sender: jumpPointBtn) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                speedSettingView.setSelectItem(index: lastJumpSpeedSelectIndex) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                speedSettingView.setSelectItem(index: lastJumpSpeedSelectIndex) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				          
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 |