Jelajahi Sumber

切换卡点计算方式

jsonwang 3 tahun lalu
induk
melakukan
be0545bd1e

+ 37 - 42
BFFramework/Classes/Stuckpoint/Controller/PQStuckPointEditerController.swift

@@ -67,6 +67,7 @@ class PQStuckPointEditerController: PQBaseViewController {
 
     // 最终使用的卡点数据
     var finallyStuckPoints: Array = Array<Float>.init()
+    var finallyStuckPointsInt64: Array = Array<Int64>.init()
     // 最终使用的音频时长
     var finallyUserAudioTime: Float = 0.0
 
@@ -74,6 +75,7 @@ class PQStuckPointEditerController: PQBaseViewController {
     // 保存丢卡点处理后的卡点信息推荐开始到最后倒数第二个
     // 经过档位处理后的卡点信息
     var stuckPointsTemp: Array = Array<Float>.init()
+    var stuckPointsTempInt64: Array = Array<Int64>.init()
     // 下一步
     lazy var nextBtn: UIButton = {
         let nextBtn = UIButton(type: .custom)
@@ -172,6 +174,10 @@ class PQStuckPointEditerController: PQBaseViewController {
                 self?.playeTimeRange = CMTimeRange(start: CMTimeMakeWithSeconds(Float64(startTime), preferredTimescale: BASE_FILTER_TIMESCALE), end: CMTimeMakeWithSeconds(Float64(endTime), preferredTimescale: BASE_FILTER_TIMESCALE))
 
                 self?.dealParameter(model: self?.currentCreateStickersModel ?? .createStickersModelSpeed)
+                if((self?.finallyStuckPoints.count ?? 0) < 1){
+                    BFLog(message: "finallyStuckPoints data is error!!!!")
+                    return
+                }
 
                 DispatchQueue.global().async { // 并行、异步
                     let beginTime: TimeInterval = Date().timeIntervalSince1970
@@ -1255,7 +1261,7 @@ extension PQStuckPointEditerController {
             if dunshu >= Int64((stuckPointMusicData?.startTime ?? 0) * Float64(BASE_FILTER_TIMESCALE)) && dunshu < lastPoint {
                 let savePointStr = String(format: "%.6f", Float(dunshu) / Float(BASE_FILTER_TIMESCALE))
                 BFLog(message: "原所有卡点数:\(index) \(savePointStr)")
-                
+             
                 pointsTemp.append(Float(savePointStr) ?? 0.0)
             }
         }
@@ -1301,7 +1307,7 @@ extension PQStuckPointEditerController {
 
     func clipPoint(clipCount: Int, oldPoints: Array<Float>) {
         BFLog(message: "拼接卡点数:\(clipCount)")
-        if(clipCount < 0){
+        if(clipCount < 0 || oldPoints.count < 2){
             BFLog(message: "clipCount is error!!!! \(clipCount)")
             return
         }
@@ -1309,10 +1315,10 @@ extension PQStuckPointEditerController {
         if finallyStuckPoints.count == 0 {
             finallyStuckPoints.append(stuckPointsTemp.first ?? 0.0)
         }
+        
         for i in finallyStuckPoints.count ... clipCount + finallyStuckPoints.count {
-            if (i % (oldPoints.count - 1)) != 0 {
-                
-               let value =  String(format: "%.6f", finallyStuckPoints[i - 1] + oldPoints[i % (oldPoints.count - 1)] - oldPoints[(i - 1) % (oldPoints.count - 1)])
+            if (i % (oldPoints.count - 1)) != 1 {
+               let value =  String(format: "%.6f", finallyStuckPoints[i - 1] + oldPoints[((i-1) % (oldPoints.count - 1)) + 1] - oldPoints[((i - 2) % (oldPoints.count - 1)) + 1])
                 
                 finallyStuckPoints.append(Float(value) ?? 0.0)
             } else {
@@ -1377,6 +1383,7 @@ extension PQStuckPointEditerController {
                 tempMinSpeed = minSpeed
             } else {
                 stuckPointsTemp = getUsedStuckPoint(seed: (stuckPointMusicData?.speed ?? 0))
+                
             }
 
             /*
@@ -1399,54 +1406,42 @@ extension PQStuckPointEditerController {
                             let assetDuration = Float(CMTimeGetSeconds(asset.duration))
                             BFLog(message: "输入素材时长 \(assetDuration)")
 
-                            // 查找使用的最后一个卡点在原数组中的位置
-                            var lastPointIndex = stuckPointsTemp.firstIndex(where: { (point) -> Bool in
-                                (point == (finallyStuckPoints.last ?? 0.0).truncatingRemainder(dividingBy: (stuckPointsTemp.last ?? 0)))
-                            })
-                            var i = lastPointIndex ?? 0
-                            // 1,计算 AB 段的个数
-                            var LACount: Int = 0
-                            var LBCount: Int = 0
+                            if(finallyStuckPoints.count == 0){
+                                finallyStuckPoints.append(stuckPointsTemp[0])
+                            }
+                            var j = finallyStuckPoints.count
+                            // 添加卡点的段数 用于判断当前卡点是快/慢速
+                            var pointCount:Int = 0
                             // 已经取到的视频素材总长度,用于和原视频素材时长做对比,不够多加一个卡点
                             var useAssestDurationTemp: Float = 0.0
                             while useAssestDurationTemp < assetDuration {
-                                // 回环从头取
-                                if i + 1 >= stuckPointsTemp.count || i + 2 >= stuckPointsTemp.count {
-                                    i = 0
-                                }
-                                // 快速段
-                                let LAValue =  String(format: "%.6f", tempMaxSpeed * (stuckPointsTemp[i + 1] - stuckPointsTemp[i]))
-                                useAssestDurationTemp = useAssestDurationTemp + (Float(LAValue) ?? 0.0)
-                                if useAssestDurationTemp > Float(assetDuration) {
-                                    useAssestDurationTemp = Float(assetDuration) - (Float(LAValue) ?? 0.0)
-                                    //6x 第一个卡点X 倍速 > 原素材
-                                    break
-                                }
-                                LACount = LACount + 1
-                                BFLog(message: "快速段段段段段段后LACount:\(LACount) realUsedMusicDuration:\(useAssestDurationTemp)")
-                                // 慢速段
-                     
-                                let LBValue =  String(format: "%.6f", tempMinSpeed * (stuckPointsTemp[i + 2] - stuckPointsTemp[i + 1]))
-                                
-                                useAssestDurationTemp = useAssestDurationTemp + (Float(LBValue) ?? 0.0)
-                                if useAssestDurationTemp > Float(assetDuration) {
-                                    useAssestDurationTemp = useAssestDurationTemp - (Float(LBValue) ?? 0.0)
-                                    break
+                                //当前段的应该使用的速度 A/B
+                                let useSpeed = (pointCount % 2 == 0 ) ? tempMaxSpeed : tempMinSpeed
+                                // 计算卡点
+                                //要添加的卡点数值
+                                var sub:Float = 0.0
+                                if stuckPointsTemp.count > 2 {
+                                    if ((j - 1) % (stuckPointsTemp.count - 1)) != 0{
+                                        sub =  stuckPointsTemp[((j - 1) % (stuckPointsTemp.count-1)) + 1] - stuckPointsTemp[(j - 1) % (stuckPointsTemp.count - 1)]
+                                    }else {
+                                        sub = stuckPointsTemp[1] - stuckPointsTemp[0]
+                                    }
+                          
+                                    finallyStuckPoints.append(finallyStuckPoints[j - 1] + sub)
+                                    j += 1
                                 }
-                                LBCount = LBCount + 1
-                                BFLog(message: "慢速段段段段段段后LACount:\(LBCount) realUsedMusicDuration:\(useAssestDurationTemp)")
-                                i = i + 1
+                                useAssestDurationTemp += sub * useSpeed
+                                pointCount += 1
+                                FilterLog(message: "wwwwwwwaaaaaaafin;\((finallyStuckPoints.last ?? 0.0) - (finallyStuckPoints.first ?? 0.0)), tmp:\(useAssestDurationTemp)")
+    
                             }
                             // 2拼接要使用的卡点信息
-                            sticker.clipCount = LACount + LBCount
+                            sticker.clipCount = pointCount
                             if stuckPointsTemp.count < 1 {
                                 //todo 和产品沟通提示
                                 BFLog(message: "卡点数据有错误!!!")
                                 return
                             }
-
-                            // sticker.clipCount + 1 是都先补一位,当不用补时删除最后多的一位
-                            clipPoint(clipCount: sticker.clipCount, oldPoints: stuckPointsTemp)
                             BFLog(message: "finallyStuckPoints\(finallyStuckPoints)")
 
                             // 3,多补一个卡点 做 C级 速处理,要根据条件不满足 要删除最后一位,