| 
					
				 | 
			
			
				@@ -27,7 +27,7 @@ class PQStuckPointEditerController: PQBaseViewController { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     var isSynchroMusicInfoSuccess: Bool = false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     /// 当前所有的filter 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     var filters: Array = Array<ImageProcessingOperation>.init() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // 选中所有素材的的总时长 其中图片时长为1.5 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // 选中所有素材的的总时长 已经不包括图片的时长 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     var selectedTotalDuration: Float64 = 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // 选择的总数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     var selectedDataCount: Int = 0 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -155,7 +155,7 @@ class PQStuckPointEditerController: PQBaseViewController { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 // 初始化音频的开始和结束时间 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 self?.playeTimeRange = CMTimeRange(start: CMTimeMakeWithSeconds(Float64(startTime), preferredTimescale: BASE_FILTER_TIMESCALE), end: CMTimeMakeWithSeconds(Float64(endTime), preferredTimescale: BASE_FILTER_TIMESCALE)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                DispatchQueue.global().async { // 并行、异步 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                DispatchQueue.global().async { // 并行、异步 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     let beginTime: TimeInterval = Date().timeIntervalSince1970 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     self?.mStickers = self?.createStickers(sections: self?.projectModel.sData?.sections ?? List(), inputSize: CGSize(width: CGFloat(self?.projectModel.sData?.videoMetaData?.videoWidth ?? 0), height: CGFloat(self?.projectModel.sData?.videoMetaData?.videoHeight ?? 0))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -165,13 +165,9 @@ class PQStuckPointEditerController: PQBaseViewController { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         BFLog(message: "endTime is endTimeendTime \(endTime = beginTime)") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         self?.playerView.play(pauseFirstFrame: false, playeTimeRange: self!.playeTimeRange) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            // 埋点上报 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if type == 1 || type == 2 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                // 点击上报:拖动拖拽条(左/右部分)r 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                PQEventTrackViewModel.baseReportUpload(businessType: .bt_buttonClick, objectType: type == 1 ? .ot_click_dragFront : .ot_click_dragBehind, pageSource: .sp_stuck_previewSyncedUp, extParams: ["targetTime": type == 1 ? startTime * 1000 : endTime * 1000], remindmsg: "点击上报:拖动拖拽条(左/右部分)") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return stuckPointCuttingView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     }() 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -329,6 +325,7 @@ class PQStuckPointEditerController: PQBaseViewController { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 self?.customSpeedSettingView.isHidden = false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 self?.customSpeedSettingView.isJumpSpeedModel = speedSettingView.viewType == 2 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            self?.settingPlayerView() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return speedSettingView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -343,7 +340,7 @@ class PQStuckPointEditerController: PQBaseViewController { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             self?.maxSpeed = maxSpeed 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             self?.minSpeed = minSpeed 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             BFLog(message: "自定义速度maxSpeed is\(maxSpeed) minSpeed \(minSpeed) \(isJumpSpeedModel)") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            self?.settingPlayerView() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return customSpeedSettingView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -465,6 +462,13 @@ class PQStuckPointEditerController: PQBaseViewController { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // 三种模式修改 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @objc func editModelClick(sender: UIButton) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //1,根据条件判断哪些功能不可用直接出提示 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        if(selectedDataCount == selectedImageDataCount && (sender == speedStuckBtn || sender == onlyMusicBtn )){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            BFLog(message: "全是图片 \(selectedDataCount) \(selectedImageDataCount)") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            cShowHUB(superView: self.view, msg: "1111") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if sender.isSelected { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             BFLog(message: "已经是选中状态") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             return 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -940,71 +944,12 @@ extension PQStuckPointEditerController { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				          
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // 推荐卡点数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         dealParameter(model: model) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let stuckPoints: Array = finallyStuckPoints 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // 保存滤镜对象数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         var stickers: Array = Array<PQEditVisionTrackMaterialsModel>.init() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if model == .createStickersModelPoint { //跳跃卡点 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             for section in sections { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 if section.sectionType == "normal" { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    // 推荐卡点数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    var stuckPoints: Array = Array<Float>.init() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    var stuckPointsTemp = Array<Float>.init() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    for (index, dunshu) in stuckPointMusicData!.rhythmSdata[0].pointTimes.enumerated() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        BFLog(message: "原所有卡点数:\(index) \(Float(dunshu) / Float(BASE_FILTER_TIMESCALE))") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        if Float64(dunshu) / Float64(BASE_FILTER_TIMESCALE) > CMTimeGetSeconds(playeTimeRange.start), Float64(dunshu) / Float64(BASE_FILTER_TIMESCALE) < CMTimeGetSeconds(playeTimeRange.end) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            stuckPointsTemp.append(Float(dunshu) / Float(BASE_FILTER_TIMESCALE)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    /* 快慢速模式下取卡点 1 3 5 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                     - 快节奏为选中区域的所有点位,即0,1,2,3,4 5 6 7 8 9 10 …… 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                     - 适中为每两个点位取一个,即0,3,6,9 12 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                     - 慢节奏为每三个点位取一个,即0 5 10 15 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                     慢节奏要做特殊处理 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    // 跳跃卡点模式下根据不同速度 取卡点 1,2,3 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    /* 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                     - 快节奏为选中区域的所有点位,即0,1,2,3,4…… 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                     - 适中为每两个点位取一个,即0,2,4,6…… 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                     - 慢节奏为每三个点位取一个,即0,3,6,9…… 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    BFLog(message: "stuckPointMusicData?.speed is \(String(describing: stuckPointMusicData?.speed))") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    for (index, point) in stuckPointsTemp.enumerated() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        if stuckPointMusicData?.speed == 1 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            stuckPoints.append(Float(point)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        } else if stuckPointMusicData?.speed == 2 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            if index % 2 == 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                stuckPoints.append(point) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        } else if stuckPointMusicData?.speed == 3 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            if index % 3 == 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                stuckPoints.append(point) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    for point in stuckPoints { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        BFLog(message: "没有 start end 计算后的卡点数\(point)") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    if stuckPoints.first != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        stuckPoints.removeFirst() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    if stuckPoints.last != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        stuckPoints.removeLast() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    // 开始时间是服务器返回, 结果时间根据策略计算的 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    stuckPoints.insert(Float(CMTimeGetSeconds(playeTimeRange.start)), at: 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    stuckPoints.insert((Float(CMTimeGetSeconds(playeTimeRange.end))), at: stuckPoints.count) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    for point in stuckPoints { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        BFLog(message: "有 start end 计算后的卡点数\(point)") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    BFLog(message: "stuckPoints count is \(stuckPoints.count)") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     // 当用户上传视觉素材个数大于等于音乐选择区域节拍分割个数时,无需进行视频分割,只显示卡点数-1 个素材 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     if section.sectionTimeline!.visionTrack!.getEnableVisionTrackMaterials().count >= stuckPointMusicData!.rhythmSdata[0].pointTimes.count { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         for (index, sticker) in section.sectionTimeline!.visionTrack!.getEnableVisionTrackMaterials().enumerated() { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1013,8 +958,8 @@ extension PQStuckPointEditerController { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                 break 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             BFLog(message: "创建 filter start :\(sticker.timelineIn) end :\(sticker.timelineOut) type is \(sticker.type) \(sticker.locationPath)") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            sticker.timelineIn = Float64("\(stuckPoints[index])") ?? 0.0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            sticker.timelineOut = Float64("\(stuckPoints[index + 1])") ?? 0.0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            sticker.timelineIn = Float64("\(finallyStuckPoints[index])") ?? 0.0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            sticker.timelineOut = Float64("\(finallyStuckPoints[index + 1])") ?? 0.0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             BFLog(message: "卡点 间隔 \(sticker.timelineIn - sticker.timelineOut)") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             sticker.generateDefaultValues() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             stickers.append(sticker) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1025,16 +970,17 @@ extension PQStuckPointEditerController { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         // 第一种情况:全是图片,图片回环播放 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         if section.sectionTimeline!.visionTrack!.getEnableVisionTrackMaterials(type: "video").count == 0, section.sectionTimeline!.visionTrack!.getEnableVisionTrackMaterials(type: "image").count > 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            for (index, point) in stuckPoints.enumerated() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            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 < stuckPoints.count { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                        deepCopySticker!.timelineIn = Float64("\(stuckPoints[index])") ?? 0.0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                        deepCopySticker!.timelineOut = Float64("\(stuckPoints[index + 1])") ?? 0.0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    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!) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1044,15 +990,15 @@ extension PQStuckPointEditerController { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             // 第二种情况:有视频要进行分割 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            let clipFilters = clipVideoMerage(section: section, stuckPoints: stuckPoints) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            for (index, point) in stuckPoints.enumerated() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            let clipFilters = clipVideoMerage(section: section, stuckPoints: finallyStuckPoints) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            for (index, point) in finallyStuckPoints.enumerated() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                 BFLog(message: "aaaaaindexindeindexxindexindexindex \(index) \(point)") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                if index + 1 < stuckPoints.count, index < clipFilters.count { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                if index + 1 < finallyStuckPoints.count, index < clipFilters.count { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                     BFLog(message: "bbbbbindexindeindexxindexindexindex \(index) \(point)") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                     let sticker: PQEditVisionTrackMaterialsModel = clipFilters[index] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                    sticker.timelineIn = Float64("\(stuckPoints[index])") ?? 0.0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    sticker.timelineIn = Float64("\(finallyStuckPoints[index])") ?? 0.0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                    sticker.timelineOut = Float64("\(stuckPoints[index + 1])") ?? 0.0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    sticker.timelineOut = Float64("\(finallyStuckPoints[index + 1])") ?? 0.0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                     // 卡点的时间 >  in out 值 这里就会出现鬼畜效果 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                     let timelineInterval = sticker.timelineOut - sticker.timelineIn 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                     let inOutInterval = sticker.out - sticker.model_in 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1088,7 +1034,7 @@ extension PQStuckPointEditerController { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             for section in sections { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 if section.sectionType == "normal" { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    BFLog(message: "stuckPoints count is \(stuckPoints.count)") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    BFLog(message: "stuckPoints count is \(finallyStuckPoints.count)") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     //一共裁剪的段数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     var totalClipNum:Int = 0 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1103,18 +1049,18 @@ extension PQStuckPointEditerController { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             var realUsedMusicDuration = 0.0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             while realUsedMusicDuration <= CMTimeGetSeconds(asset.duration) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                 //快速段 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                let LA = maxSpeed * (stuckPoints[i+1] - stuckPoints[i]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                let LA = maxSpeed * (finallyStuckPoints[i+1] - finallyStuckPoints[i]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                 realUsedMusicDuration = realUsedMusicDuration + Float64(LA) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                 if(realUsedMusicDuration > CMTimeGetSeconds(asset.duration)){ break} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                 oneVideoClipNum = oneVideoClipNum + 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                 //慢速段 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                let LB = minSpeed * (stuckPoints[i+2] - stuckPoints[i+1]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                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) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1122,16 +1068,26 @@ extension PQStuckPointEditerController { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                 // 设置循环模式和适配模式 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                 deepCopySticker?.generateDefaultValues() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                 //当前分段的速度 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                let tempSpeed = (totalClipNum + clipindex) % 2 == 0 ? maxSpeed : minSpeed 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                if(totalClipNum + 1 + clipindex < stuckPoints.count){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                var tempSpeed = (totalClipNum + clipindex) % 2 == 0 ? maxSpeed : minSpeed 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                                tempSpeed = 2 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                if(totalClipNum + 1 + clipindex < finallyStuckPoints.count){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                     deepCopySticker?.speedRate = tempSpeed 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                    deepCopySticker?.model_in = Float64(tempSpeed) * Float64(stuckPoints[totalClipNum + clipindex] - (stuckPoints.first ?? 0.0)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                    deepCopySticker?.out = Float64(tempSpeed) * Float64(stuckPoints[totalClipNum + 1 + clipindex] - (stuckPoints.first ?? 0.0)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                    deepCopySticker?.timelineIn = Float64(stuckPoints[totalClipNum + clipindex]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                    deepCopySticker?.timelineOut = Float64(stuckPoints[totalClipNum + 1 + clipindex]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                     
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                                    deepCopySticker?.model_in = Float64(tempSpeed) * Float64(finallyStuckPoints[totalClipNum + clipindex] - (finallyStuckPoints.first ?? 0.0)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    deepCopySticker?.model_in = lastOutTime 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                     
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    deepCopySticker?.out = lastOutTime + Float64(tempSpeed) * Float64(finallyStuckPoints[totalClipNum + 1 + clipindex] - finallyStuckPoints[totalClipNum + clipindex]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                     
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                                    deepCopySticker?.out = lastOutTime +   Float64(finallyStuckPoints[totalClipNum + 1 + clipindex] - finallyStuckPoints[totalClipNum + clipindex]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    lastOutTime =  deepCopySticker?.out ?? 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                     
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    deepCopySticker?.timelineIn =   Float64(finallyStuckPoints[totalClipNum + clipindex]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    deepCopySticker?.timelineOut =    Float64(finallyStuckPoints[totalClipNum + 1 + clipindex]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                     
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                     
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                             
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                BFLog(message: " crilp is in \(deepCopySticker?.model_in ?? 0) out \(deepCopySticker?.out ?? 0) timelineIN:\(deepCopySticker?.timelineIn ?? 0) timelineOUT:\(deepCopySticker?.timelineOut ?? 0) 总时长\(CMTimeGetSeconds(asset.duration)) speedRate:\(String(describing: deepCopySticker?.speedRate))") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                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!) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1141,8 +1097,8 @@ extension PQStuckPointEditerController { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             totalClipNum = totalClipNum + oneVideoClipNum - 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         } else if sticker.type == StickerType.IMAGE.rawValue { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             sticker.generateDefaultValues() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            sticker.timelineIn = Float64(stuckPoints[totalClipNum]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            sticker.timelineOut = Float64(stuckPoints[totalClipNum + 1]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            sticker.timelineIn = Float64(finallyStuckPoints[totalClipNum]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            sticker.timelineOut = Float64(finallyStuckPoints[totalClipNum + 1]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             stickers.append(sticker) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1154,7 +1110,7 @@ extension PQStuckPointEditerController { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             for section in sections { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 if section.sectionType == "normal" { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    BFLog(message: "stuckPoints count is \(stuckPoints.count)") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    BFLog(message: "stuckPoints count is \(finallyStuckPoints.count)") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     //已经计算过所有贴纸的累计时长,起点是推荐时长或用户划动后的时间 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     var totalStickerTimer:Float64 = CMTimeGetSeconds(playeTimeRange.start) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     for sticker in section.sectionTimeline!.visionTrack!.getEnableVisionTrackMaterials() { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1267,6 +1223,10 @@ extension PQStuckPointEditerController { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         //保存丢卡点处理后的卡点信息推荐开始到最后倒数第二个 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         let stuckPointsTemp = getUsedStuckPoint(seed: stuckPointMusicData?.speed ?? 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				          
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if(selectedDataCount == selectedImageDataCount){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         //最后真正要使用推荐结束时长 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         var realUsedMusicDuration:Float = 0.0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         switch model { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1282,7 +1242,7 @@ extension PQStuckPointEditerController { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             while tempTime < Float(selectedTotalDuration) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				              
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 //回环从头取 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if(i+2 > stuckPointsTemp.count){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if(i+2 >= stuckPointsTemp.count){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     i = 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 //快速段 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1562,12 +1522,16 @@ extension PQStuckPointEditerController { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if !isSynchroMusicInfoSuccess || !isStuckPointDataSuccess || !isExportVideosSuccess { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         createPorjectData() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        BFLog(message: "界面编辑界面时参数 选择素材时长:\(selectedTotalDuration) 选择素材总数:\(selectedDataCount) 选择图片总数\(selectedImageDataCount)") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //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)") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				          
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         //1 生成默认参数值 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         /* 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				          - 当素材总时长∈[0-6)s 时,提示推荐仅配乐模式 or 快慢速模式 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1621,22 +1585,17 @@ extension PQStuckPointEditerController { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         /* 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           文档规则 https://w42nne6hzg.feishu.cn/docs/doccnQZm1uCfkU4QtJb5fLxYk4d# 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				          */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        //2,根据所选择所有素材时长判断哪些功能不可能用,及进入默认模式 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //2,根据所选择所有素材时长进入默认模式 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         //全是图片 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if(selectedDataCount == selectedImageDataCount){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             BFLog(message: "全是图片 \(selectedDataCount) \(selectedImageDataCount)") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            speedStuckBtn.isEnabled = false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             //默认进入跳跃卡点模式 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             editModelClick(sender: jumpPointBtn) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             speedSettingView.setSelectItem(index: lastJumpSpeedSelectIndex) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				              
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         }else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-             
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            //1,根据素材输入确定可用模式及推荐模式 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            //1)0-6s时卡点不能使用, 纯图片时快慢速不可用 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if(selectedTotalDuration > 0 && selectedTotalDuration < 6){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                jumpPointBtn.isEnabled = false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             //默认进入快慢速模式 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if(selectedTotalDuration > 0 && selectedTotalDuration <= 144){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                  
			 |