ソースを参照

插入时的thum变化

胡志强 3 年 前
コミット
24868a757a

+ 14 - 6
BFRecordScreenKit/Classes/RecordScreen/Controller/BFRecordScreenCameraManager.swift

@@ -45,6 +45,9 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
     // 用于打开摄像头初始流程
     static var initOpenCamera : Bool = true
     
+    // timer循环每次录制增长的时长
+    var increaseTime :CMTime = .zero
+    
     var currPlayTime : CMTime = .zero
     fileprivate var timerr:Timer?
     
@@ -211,7 +214,14 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
         
         // 为了第一时间能更新collection view数据
         if !BFRecordScreenCameraManager.initOpenCamera{
-            recordItem?.videoStickers.append(videoModel)
+            // 将model插入正确位置
+            if let index = recordItem?.videoStickers.firstIndex(where: { mod in
+                mod.timelineCMOut.seconds - currentAssetProgress.seconds > 0.7
+            }) {
+                recordItem?.videoStickers.insert(videoModel, at: index)
+            }else {
+                recordItem?.videoStickers.append(videoModel)
+            }
             progreddL?.isHidden = false
             cameraProgressV?.isHidden = false
         }
@@ -226,6 +236,7 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
 
             let currDur = CMTime(seconds: wself.videoModel.timelineCMIn.seconds + movieWrite.duration.seconds, preferredTimescale: 1000)
             if CMTimeCompare(currDur, wself.currentAssetProgress) > 0 {
+                wself.increaseTime = currDur - wself.currentAssetProgress
                 wself.currentAssetProgress = currDur
                 wself.videoModel.timelineCMOut = currDur
                 wself.recordProgressCallBack?(currDur)
@@ -249,6 +260,7 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
             }
             let cameraSuccess = wself.recordFinishedResult && ((wself.videoModel.timelineCMOut - wself.videoModel.timelineCMIn).seconds > 1)
             if cameraSuccess {
+                wself.increaseTime = wself.videoModel.timelineCMOut - wself.currentAssetProgress
                 wself.currentAssetProgress = wself.videoModel.timelineCMOut
                 wself.recordEndCallBack?(true, wself.videoModel)
                 wself.updateUI(progress: wself.currentAssetProgress)
@@ -257,7 +269,7 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
                 }
             }else {
                 wself.videoModel.locationPath = "nil"
-                wself.revertLast()
+//                wself.revertLast()
                 wself.recordEndCallBack?(false, nil)
             }
         }
@@ -286,10 +298,6 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
                         cShowHUB(superView: nil, msg: "shoot_tips_least".BFLocale)
                     }
                     wself.gropQueue.leave()
-                    DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {[weak self] in
-                        guard let wself = self else { return }
-                        wself.updateUI(progress:  wself.currentAssetProgress)
-                    }
 
                 }
             }

+ 3 - 165
BFRecordScreenKit/Classes/RecordScreen/Controller/BFRecordScreenController.swift

@@ -79,6 +79,8 @@ public class BFRecordScreenController: BFBaseViewController {
                 })
                 wself.rscmanager.recordItem?.materialDuraion = CMTime(seconds: dur ?? 0, preferredTimescale: 1000)
 //                BFLog(1, message: "camera:\(sticker.timelineCMIn.seconds) ~ \(sticker.timelineCMOut.seconds)")
+            }else{
+                wself.withdrawAction()
             }
         }
         return m
@@ -1512,170 +1514,6 @@ public class BFRecordScreenController: BFBaseViewController {
     @objc func withdrawAction() {
         pause()
         recoverRecord()
-        return
-        if let action = events.last {
-            let jumpTime = action.timestamp
-            if action.type == 2 {
-                // 撤销录制
-                if let modelIndex = itemModels[currItemModelIndex].voiceStickers.firstIndex(where: { mod in
-                    CMTimeCompare(mod.startCMTime, action.timestamp) == 0
-                }) {
-                    // 移除音频
-                    let model = itemModels[currItemModelIndex].voiceStickers[modelIndex]
-                    itemModels[currItemModelIndex].voiceStickers.remove(at: modelIndex)
-                    indirectionView?.deleteItem(index: modelIndex)
-
-                    // 删除对应字幕
-                    itemModels[currItemModelIndex].titleStickers.removeAll { m in
-                        m.audioFilePath == model.wavFilePath
-                    }
-
-                    // 恢复被覆盖的音频
-                    if let voiceTuples = action.deletedVoices{
-                        itemModels[currItemModelIndex].voiceStickers.append(contentsOf: voiceTuples)
-                        itemModels[currItemModelIndex].voiceStickers.sort { m1, m2 in
-                            CMTimeCompare(m1.startCMTime, m2.startCMTime) < 0
-                        }
-                    }
-                    
-                    // 恢复被覆盖的字幕
-                    if let titleTuples = action.deletedTittles{
-                        itemModels[currItemModelIndex].titleStickers.append(contentsOf: titleTuples)
-                        itemModels[currItemModelIndex].titleStickers.sort { m1, m2 in
-                            CMTimeCompare(m1.timelineOut, m2.timelineOut) < 0
-                        }
-                    }
-//                    jumpTime = model.startCMTime.seconds
-
-                    if currMediaType == .Image {
-                        itemModels[currItemModelIndex].materialDuraion = model.startCMTime
-                    }else if currMediaType == .Camera {
-                        let video = rscmanager.recordItem?.videoStickers.last
-                        rscmanager.revertLast(modelIndex)
-                        itemModels[currItemModelIndex].materialDuraion = video?.timelineCMIn ?? .zero
-                    }
-                }
-            } else if action.type == 3 {
-                // 恢复删除录音
-                if var tuples = action.deletedVoices{
-                    
-                    if currMediaType != .Video {
-
-                        tuples.sort { m1, m2 in
-                            CMTimeCompare(m1.startCMTime, m2.startCMTime) < 0
-                        }
-                        
-                        var firstTime = 0.0
-                        var currDuration : CMTime = .zero
-                        
-                        if currMediaType == .Camera, let first = action.deletedCameras?.first, let end = action.deletedCameras?.last {
-                            firstTime = first.timelineCMIn.seconds
-                            currDuration = (end.timelineCMOut - first.timelineCMIn)
-                        }else if currMediaType == .Image, let first = tuples.first, let end = tuples.last {
-                            firstTime = first.startCMTime.seconds
-                            currDuration = end.endCMTime - first.startCMTime
-                        }
-                        
-                        BFLog(1, message: "恢复删除时长:\(currDuration.seconds)")
-                        
-                        itemModels[currItemModelIndex].materialDuraion = itemModels[currItemModelIndex].materialDuraion + currDuration
-                        
-                        // 恢复录音的时间点
-                        let list = itemModels[currItemModelIndex].voiceStickers.filter({ mod in
-                            CMTimeCompare(mod.startCMTime, CMTime(seconds: firstTime, preferredTimescale: 1000)) >= 0
-                        })
-                    
-                        list.forEach { mod in
-                            mod.startCMTime = mod.startCMTime + currDuration
-                            mod.endCMTime = mod.endCMTime + currDuration
-                            
-                            // 恢复字幕的时间点
-                            let titlsList = itemModels[currItemModelIndex].titleStickers.filter { tm in
-                                tm.recordId == mod.recordId
-                            }
-                            
-                            for titleM in titlsList {
-                                titleM.timelineIn = titleM.timelineIn + currDuration
-                                titleM.timelineOut = titleM.timelineOut + currDuration
-                            }
-                        }
-                        
-                        if currMediaType == .Camera {
-                            rscmanager.cameraProgressV?.isHidden = false
-                            // 恢复录像的时间点
-                            _ = itemModels[currItemModelIndex].videoStickers.map { mod in
-                                if CMTimeCompare(mod.timelineCMIn, CMTime(seconds: firstTime, preferredTimescale: 1000)) >= 0{
-                                    mod.timelineCMIn = mod.timelineCMIn + currDuration
-                                    mod.timelineCMOut = mod.timelineCMOut + currDuration
-                                }
-                            }
-                            
-                            // 摄像头录制的
-                            if let videoTuple = action.deletedCameras {
-                                itemModels[currItemModelIndex].videoStickers.append(contentsOf: videoTuple)
-                                itemModels[currItemModelIndex].videoStickers.sort { m1, m2 in
-                                    CMTimeCompare(m1.timelineCMIn, m2.timelineCMIn) < 0
-                                }
-                                itemModels[currItemModelIndex].thumbImgs.removeAll()
-                                itemModels[currItemModelIndex].videoStickers.forEach { mod in
-                                    if let thumImag = mod.thumImgs{
-                                        itemModels[currItemModelIndex].thumbImgs.append(contentsOf: thumImag)
-                                    }
-                                }
-                                DispatchQueue.main.async {[weak self] in
-                                    guard let wself = self else { return }
-                                    wself.rscmanager.cameraProgressV?.resetThumIV()
-                                }
-                            }
-                        }
-                    
-                    }
-                    
-                    itemModels[currItemModelIndex].voiceStickers.append(contentsOf: tuples)
-                    itemModels[currItemModelIndex].voiceStickers.sort { m1, m2 in
-                        CMTimeCompare(m1.startCMTime, m2.startCMTime) < 0
-                    }
-                }
-                // 恢复字幕
-                
-                if let titleTuples = action.deletedTittles, titleTuples.count > 0 {
-                    itemModels[currItemModelIndex].titleStickers.append(contentsOf: titleTuples)
-                    itemModels[currItemModelIndex].titleStickers.sort { m1, m2 in
-                        CMTimeCompare(m1.timelineOut, m2.timelineOut) < 0
-                    }
-                }
-                if currMediaType == .Image {
-                    itemModels[currItemModelIndex].materialDuraion = itemModels[currItemModelIndex].voiceStickers.last?.endCMTime ?? .zero
-                }
-
-            } else {}
-            events.removeLast()
-
-            let dur = itemModels[currItemModelIndex].materialDuraion.seconds
-            changeProgress(changCMTime: (dur > 0) ? jumpTime : .zero)
-            
-            isDragingProgressSlder = false
-            currentPlayRecordIndex = -1
-            BFLog(3, message: "重置播放index-\(#function) = \(currentPlayRecordIndex)")
-            hadPrepareToPlayRecord = false
-            progressThumV.progress = jumpTime.seconds
-
-            if let event = events.last {
-                changeWithDrawBtnLayout(event.type)
-            } else {
-                changeWithDrawBtnLayout(0)
-                withDrawBtn.isEnabled = false
-            }
-            searchStopAtRecordRange()
-            let itemModel = itemModels[currItemModelIndex]
-            /// 重绘录音进度视图
-            resetAllIndirectionView()
-            // 如果是图片需重置播放按钮
-            if itemModel.mediaType != .Video {
-                playBtn.isSelected = itemModels[currItemModelIndex].voiceStickers.count <= 0
-                playBtn.isHidden = playBtn.isSelected
-            }
-        }
     }
 
     @objc func changeVoiceAction() {
@@ -1899,7 +1737,7 @@ public class BFRecordScreenController: BFBaseViewController {
             progressThumV.progress = action.timestamp.seconds
             searchStopAtRecordRange()
             resetAllIndirectionView()
-            
+            events.removeLast()
         }
     }
     

+ 68 - 40
BFRecordScreenKit/Classes/RecordScreen/View/ProgressView/BFCameraProgressView.swift

@@ -15,7 +15,11 @@ class BFCameraProgressView: BFProgressBaseView {
     
     var imageViews = [BFThumImageView]()
     
-    var newRecord = false
+    // 判断是否需要分割线的(最后一个录音或者是超出5秒的缩略图不要分割线)
+    var newRecordLine = false
+    
+    // 上次更新缩略图长度时的时间戳
+    var lastUpdateTime : CMTime = .zero
     
     lazy var progressView: BFAutolayoutScrollView = {
         let sv = BFAutolayoutScrollView()
@@ -52,36 +56,47 @@ class BFCameraProgressView: BFProgressBaseView {
     
     /// 添加缩略图
     /// - Parameter images:
-    func addThumbImages() {
+    func addThumbImages(_ img:UIImage) {
         DispatchQueue.main.async {[weak self] in
             guard let wself = self else { return }
             
-            if let img = wself.recordItem?.thumbImgs.last {
-                let iv = BFThumImageView(image: img)
-                iv.image = img
-                iv.contentMode = .scaleAspectFill
-                iv.clipsToBounds = true
-                iv.isHiddenBord = true
-                wself.progressView.contentView.addSubview(iv)
-
-                if let lastiv = wself.imageViews.last {
-                    let wid = wself.recordItem!.videoStickers.last!.timelineCMOut.seconds * 70.0 / 5.0 - (lastiv.rightX - cScreenWidth / 2.0)
-                    let wid0 = floor(wid * UIScreen.main.scale) /  UIScreen.main.scale
-                    iv.frame = CGRect(x: lastiv.rightX, y: lastiv.y, width: wid0, height: 50)
-                    if wself.newRecord {
-                        lastiv.isHiddenBord = false
-                        wself.newRecord = false
-                    }
-                    BFLog(1, message: "frame: new \(wid0)")
-                }else{
+            let iv = BFThumImageView(image: img)
+            iv.image = img
+            iv.contentMode = .scaleAspectFill
+            iv.clipsToBounds = true
+            iv.isHiddenBord = true
+            wself.progressView.contentView.addSubview(iv)
+            
+            if let ind = wself.recordItem?.thumbImgs.firstIndex(where: { image in
+                image == img
+            }){
+                if ind == 0 {
                     iv.frame = CGRect(x: cScreenWidth / 2.0, y: 0, width: 0, height: 50)
+                }else{
+                    if wself.imageViews.count > ind - 1 {
+                        let lastiv = wself.imageViews[ind - 1]
+                        if let sticker = wself.recordItem!.videoStickers.first(where: { mod in
+                            mod.thumImgs!.contains(img)
+                        }){
+                            let wid = sticker.timelineCMOut.seconds * 70.0 / 5.0 - (lastiv.rightX - cScreenWidth / 2.0)
+                            let wid0 = floor(wid * UIScreen.main.scale) /  UIScreen.main.scale
+                            iv.frame = CGRect(x: lastiv.rightX, y: lastiv.y, width: wid0, height: 50)
+                            if wself.newRecordLine {
+                                lastiv.isHiddenBord = false
+                                wself.newRecordLine = false
+                            }
+                            BFLog(1, message: "frame: new \(wid0)")
+                            
+                        }
+                    }
                 }
-                wself.imageViews.append(iv)
-
-                wself.progressView.setNeedsLayout()
-                wself.progressView.layoutIfNeeded()
+                wself.imageViews.insert(iv, at: ind)
             }
             
+
+            wself.progressView.setNeedsLayout()
+            wself.progressView.layoutIfNeeded()
+            
         }
         
     }
@@ -127,21 +142,33 @@ class BFCameraProgressView: BFProgressBaseView {
         progressView.contentSize = CGSize(width: p.x + cScreenWidth, height: 50)
     }
     
-    func updateCellWidth(index:Int, progress:CMTime) {
+    //
+    func updateCellWidth(progress:CMTime, increaseTime:CMTime) {
         if let sticker = recordItem?.videoStickers.first(where: { mod in
             CMTimeCompare(mod.timelineCMIn, progress) <= 0 &&  CMTimeCompare(mod.timelineCMOut, progress) >= 0
         }) {
-            if index < imageViews.count{
-                let lastiv = imageViews[index]
-                let wid = progress.seconds * 70.0 / 5.0 - (lastiv.x - cScreenWidth / 2.0)
-                let wid0 = min(floor(wid * UIScreen.main.scale) /  UIScreen.main.scale, 70)
-                
-                if wid0 <= lastiv.width {
-                    return
+            if let img = sticker.thumImgs?.last {
+                if let lastiv = imageViews.first(where: { v in
+                    v.image == img
+                }){
+                    let wid = progress.seconds * 70.0 / 5.0 - (lastiv.x - cScreenWidth / 2.0)
+                    let wid0 = min(floor(wid * UIScreen.main.scale) /  UIScreen.main.scale, 70)
+                    
+                    if wid0 <= lastiv.width {
+                        return
+                    }
+                    var frame = lastiv.frame
+                    let offsetx = wid0 - frame.size.width
+                    frame.size.width = wid0
+                    lastiv.frame = frame
+                    
+                    imageViews.forEach { iv in
+                        if iv.rightX > lastiv.rightX, offsetx > 0 {
+                            let frame = iv.frame
+                            iv.frame = frame.offsetBy(dx: offsetx, dy: 0)
+                        }
+                    }
                 }
-                var frame = lastiv.frame
-                frame.size.width = wid0
-                lastiv.frame = frame
             }
 
             let p = CGPoint(x: progress.seconds * 70 / 5.0, y: 0)
@@ -151,10 +178,11 @@ class BFCameraProgressView: BFProgressBaseView {
             // 刷新之后的sticker
             recordItem?.videoStickers.forEach({ mod in
                 if mod.timelineCMOut.seconds > progress.seconds {
-                    BFLog(1, message: "insert before: \(mod.timelineCMIn)")
-                    mod.timelineCMIn = mod.timelineCMIn + (sticker.timelineCMOut - sticker.timelineCMIn)
-                    mod.timelineCMOut = mod.timelineCMOut + (sticker.timelineCMOut - sticker.timelineCMIn)
-                    BFLog(1, message: "insert after: \(mod.timelineCMIn)")
+                    BFLog(1, message: "insert progress:\(progress.seconds), start:\(sticker.timelineCMIn.seconds), end:\(sticker.timelineCMOut.seconds)")
+                    BFLog(1, message: "insert before: \(mod.timelineCMIn.seconds)")
+                    mod.timelineCMIn = mod.timelineCMIn + increaseTime
+                    mod.timelineCMOut = mod.timelineCMOut + increaseTime
+                    BFLog(1, message: "insert after: \(mod.timelineCMIn.seconds)")
 
                 }
             })
@@ -167,7 +195,7 @@ class BFCameraProgressView: BFProgressBaseView {
     }
     
     func changeSepline(img:UIImage){
-        newRecord = true
+        newRecordLine = true
     }
 }