瀏覽代碼

恢复逻辑修改
分割线允许插入 - 摄像头逻辑

胡志强 3 年之前
父節點
當前提交
ca9299ae61

+ 1 - 0
BFRecordScreenKit/Classes/RecordScreen/Controller/BFRecordScreenBaseManager.swift

@@ -51,6 +51,7 @@ class BFRecordScreenBaseManager : NSObject{
         }
         
         recording = true
+//        recordItem?.voiceStickers.append(<#T##newElement: PQVoiceModel##PQVoiceModel#>)
     }
 
     func endRecord(){

+ 3 - 3
BFRecordScreenKit/Classes/RecordScreen/Controller/BFRecordScreenCameraManager.swift

@@ -276,11 +276,11 @@ class BFRecordScreenCameraManager : BFRecordScreenBaseManager{
             
             if FileManager.default.fileExists(atPath: vpath) {
                 if !su {
-                    let newPath:String? = PQBridgeObject.p_setupFileRename(vpath)
-                    if let finalPath = newPath, finalPath.count > 0 {
+                    if let finalPath = PQBridgeObject.p_setupFileRename(vpath), finalPath.count > 0 {
                         let dur = AVURLAsset(url: URL(fileURLWithPath: finalPath))
-                        wself.videoModel.timelineCMOut = wself.videoModel.timelineCMIn + CMTime(seconds: dur.duration.seconds, preferredTimescale: 1000)
                         BFLog(1, message: "文件时长camera:\(wself.recordItem?.videoStickers.count ?? 0),   \(wself.videoModel.timelineCMIn.seconds)~\(wself.videoModel.timelineCMOut.seconds),  \(dur.duration.seconds)")
+
+                        wself.videoModel.timelineCMOut = wself.videoModel.timelineCMIn + CMTime(seconds: dur.duration.seconds, preferredTimescale: 1000)
                         wself.videoModel.locationPath = finalPath
                     }else{
                         cShowHUB(superView: nil, msg: "shoot_tips_least".BFLocale)

+ 45 - 30
BFRecordScreenKit/Classes/RecordScreen/Controller/BFRecordScreenController.swift

@@ -26,6 +26,8 @@ struct WithDrawModel {
     var deletedTittles: [PQEditSubTitleModel]?
     //
     var deletedCameras: [PQEditVisionTrackMaterialsModel]?
+    
+    var recordItem: BFRecordItemModel
 
 }
 
@@ -183,6 +185,7 @@ public class BFRecordScreenController: BFBaseViewController {
             changeVoiceBtn.isHidden = isRecording
             subtitleBtn.isHidden = isRecording
             soundSettingBtn.isHidden = isRecording
+            cameraFlipBtn.isHidden = isRecording || (currMediaType == .Camera)
             recordBtn.setTitle(isRecording ? "record_pause".BFLocale : (currMediaType == .Camera ? "record_lz".BFLocale : "record_ly".BFLocale), for: .normal)
             recordBtn.backgroundColor = UIColor.hexColor(hexadecimal: "#389AFF", alpha: isRecording ? 0.6 : 1)
 //            if !isRecording {
@@ -208,6 +211,11 @@ public class BFRecordScreenController: BFBaseViewController {
     public var isNormalPlaying = false { // 是否正在播放
         didSet {
             withDrawBtn.isHidden = isNormalPlaying
+            cameraFlipBtn.isHidden = isNormalPlaying || (currMediaType == .Camera)
+            subtitleBtn.isHidden = isNormalPlaying
+            soundSettingBtn.isHidden = isNormalPlaying
+            withDrawBtn.isHidden = isNormalPlaying
+            recordBtn.isHidden = isNormalPlaying
         }
     }
 
@@ -236,7 +244,10 @@ public class BFRecordScreenController: BFBaseViewController {
     // 行为记录,方便撤销
     var events = [WithDrawModel]() {
         didSet {
-            withDrawBtn.isEnabled = (events.count != 0)
+            DispatchQueue.main.async {[weak self] in
+                guard let wself = self else { return }
+                wself.withDrawBtn.isEnabled = (wself.events.count != 0)
+            }
         }
     }
 
@@ -1013,12 +1024,6 @@ public class BFRecordScreenController: BFBaseViewController {
                 }
                 // ***********处理冲突的录音部分资源 end
 
-                // 添加撤销记录点
-                var event = WithDrawModel(type: 2, timestamp: model.startCMTime)
-                event.deletedVoices = deletedVoices
-                event.deletedTittles = deletedTitlesTemp
-                wself.events.append(event)
-
                 if wself.currMediaType != .Video {
                     var duration: CMTime = .zero
                     if wself.currMediaType == .Image{
@@ -1316,7 +1321,7 @@ public class BFRecordScreenController: BFBaseViewController {
             let model = itemModels[currItemModelIndex].voiceStickers[isStopAtRecordRange]
             itemModels[currItemModelIndex].voiceStickers.remove(at: isStopAtRecordRange)
             indirectionView?.deleteItem(index: isStopAtRecordRange)
-            var event = WithDrawModel(type: 3, timestamp: currentAssetProgress, deletedVoices: [model])
+            var event = WithDrawModel(type: 3, timestamp: currentAssetProgress, deletedVoices: [model], recordItem: rscurrentManager.recordItem!)
             event.deletedTittles = deleteTitles(voiceModel: model)
             events.append(event)
 
@@ -1378,7 +1383,13 @@ public class BFRecordScreenController: BFBaseViewController {
             BFLog(3, message: "开始录制-开始:currentAssetProgress=\(wself.currentAssetProgress.seconds),cuInde=\(wself.currItemModelIndex),\(model)")
             wself.recorderManager?.startRecord()
             wself.recorderManager?.audioRecorder?.startNeoNui(wself.NeoNuiToken ?? "", appid: wself.NeoNuiAPPID ?? "")
+    
+            // 添加撤销记录点
+            let event = WithDrawModel(type: 2, timestamp: model.startCMTime, recordItem: wself.rscurrentManager.recordItem!)
+            wself.events.append(event)
         }
+
+        
         // 开始时间
         beginOnStartBtn = true
         isRecording = true
@@ -1395,10 +1406,6 @@ public class BFRecordScreenController: BFBaseViewController {
         // 录制中不显示播放按钮
         playBtn.isSelected = true
         playBtn.isHidden = true
-        if currMediaType == .Camera {
-            cameraFlipBtn.isHidden = true
-        }
-        
         
         let cell = collectionView.cellForItem(at: IndexPath(item: currItemModelIndex, section: 0)) as? BFImageCoverViewCell
         if cell?.contentView.viewWithTag(100_100)?.superview == nil {
@@ -1413,8 +1420,6 @@ public class BFRecordScreenController: BFBaseViewController {
         }
         if currMediaType == .Video {
             pause()
-        }else if currMediaType == .Camera {
-            cameraFlipBtn.isHidden = false
         }
         
         beginOnStartBtn = false
@@ -1506,6 +1511,8 @@ public class BFRecordScreenController: BFBaseViewController {
     // 撤销
     @objc func withdrawAction() {
         pause()
+        recoverRecord()
+        return
         if let action = events.last {
             let jumpTime = action.timestamp
             if action.type == 2 {
@@ -1700,7 +1707,6 @@ public class BFRecordScreenController: BFBaseViewController {
             pause()
             searchStopAtRecordRange()
         } else {
-            events.append(WithDrawModel(type: 1, timestamp: currentAssetProgress))
             changeWithDrawBtnLayout(0)
             play()
         }
@@ -1737,7 +1743,7 @@ public class BFRecordScreenController: BFBaseViewController {
                 guard let wself = self else { return }
                 
                 if isStart {
-                    wself.events.append(WithDrawModel(type: 0, timestamp: wself.currentAssetProgress))
+                    wself.events.append(WithDrawModel(type: 0, timestamp: wself.currentAssetProgress, recordItem: wself.rscurrentManager.recordItem!))
                 }
 
                 wself.isDragingProgressSlder = true
@@ -1821,9 +1827,14 @@ public class BFRecordScreenController: BFBaseViewController {
                 BFLog(1, message: "停在了录音区间里 \(isStopAtRecordRange), currTime:\(currentAssetProgress.seconds), 录音范围:\(startTime!.seconds) - \(endTime!.seconds)")
 //            }
             // 摄像和图片都可以走插入录制功能
-            if (currMediaType == .Camera && (endTime! - currentAssetProgress).seconds < 1.5 * 5 / 70.0)
-                || (currMediaType == .Image && ((endTime! - currentAssetProgress).seconds < 1.5 * 2.0 / 70.0)){
+            if (currMediaType == .Camera && (endTime! - currentAssetProgress).seconds < 2 * 5 / 70.0)
+                || (currMediaType == .Image && ((endTime! - currentAssetProgress).seconds < 2 * 2.0 / 70.0))
+                || (currMediaType == .Image && ((endTime! - currentAssetProgress).seconds < 2 * (rscurrentManager.recordItem!.materialDuraion.seconds / Double(rscurrentManager.recordItem!.thumbImgs.count)) / 70.0)){
                 canInsertVideo = true
+                
+                changeProgress(changCMTime: endTime!)
+                progressThumV.progress = endTime!.seconds
+                
                 BFLog(1, message: "可以插入录音")
             }
             updateRecordBtnStatus(true)
@@ -1843,14 +1854,14 @@ public class BFRecordScreenController: BFBaseViewController {
     func updatePlayBtnStatus(){
         switch currMediaType {
         case .Image:
-            playBtn.isSelected = ((rsimanager.recordItem?.voiceStickers.count ?? 0) <= 0)
+            playBtn.isSelected = ((rsimanager.recordItem?.voiceStickers.count ?? -1) <= 0)
             playBtn.isHidden = playBtn.isSelected
             
         case .Video:
             playBtn.isSelected = false
             playBtn.isHidden = false
         case .Camera:
-            playBtn.isSelected = isEndPlay ? true : ((rscmanager.recordItem?.voiceStickers.count ?? 0) <= 0)
+            playBtn.isSelected = isEndPlay ? true : ((rscmanager.recordItem?.voiceStickers.count ?? -1) <= 0)
             playBtn.isHidden = playBtn.isSelected
         }
     }
@@ -1859,11 +1870,11 @@ public class BFRecordScreenController: BFBaseViewController {
         let su = show ?? false
         switch currMediaType {
         case .Image:
-            recordBtn.isHidden = isEndPlay ? false : su
+            recordBtn.isHidden = (isEndPlay || canInsertVideo) ? false : su
         case .Video:
             recordBtn.isHidden = isEndPlay ? true : su
         case .Camera:
-            recordBtn.isHidden = isEndPlay ? false : su
+            recordBtn.isHidden = (isEndPlay || canInsertVideo) ? false : su
         }
         
         deleteRecordBtn.isHidden = isEndPlay ? true : !(recordBtn.isHidden)
@@ -1878,15 +1889,19 @@ public class BFRecordScreenController: BFBaseViewController {
         }
     }
     
-    //
+    // 重新加载数据
     func recoverRecord() {
-        
+        if let action = events.last {
+            // 重置播放器进度,按钮状态,缩略图展示,当前进度
+            rscurrentManager.recordItem = action.recordItem
+            changeProgress(changCMTime: action.timestamp)
+            progressThumV.progress = action.timestamp.seconds
+            searchStopAtRecordRange()
+            resetAllIndirectionView()
+            
+        }
     }
     
-    // 重新加载数据
-    func reloadData(){
-        // 重置播放器进度,按钮状态,缩略图展示,当前进度
-    }
 
     // MARK: - 权限申请
 
@@ -2121,6 +2136,7 @@ public class BFRecordScreenController: BFBaseViewController {
     func play() {
         BFLog(1, message: "开始播放 \(currentAssetProgress.seconds)")
         recorderManager?.voiceModel = nil
+        events.append(WithDrawModel(type: 1, timestamp: currentAssetProgress, recordItem: rscurrentManager.recordItem!))
 
         itemModels[currItemModelIndex].titleStickers.sort { m1, m2 in
             CMTimeCompare(m1.timelineIn, m2.timelineIn) < 0
@@ -2163,8 +2179,7 @@ public class BFRecordScreenController: BFBaseViewController {
         hadPrepareToPlayRecord = false
 
         // 暂停状态
-        playBtn.isSelected = (currMediaType == .Image && rscurrentManager.recordItem?.voiceStickers.count ?? -1 <= 0) || (currMediaType == .Camera && isEndPlay)
-        playBtn.isHidden = playBtn.isSelected
+        updatePlayBtnStatus()
         rscurrentManager.pause()
     }
 

+ 4 - 1
BFRecordScreenKit/Classes/RecordScreen/View/Cell/BFImageCoverViewCell.swift

@@ -55,7 +55,10 @@ open class BFImageCoverViewCell: UICollectionViewCell {
         super.init(frame: frame)
         contentView.addSubview(playView)
         contentView.addSubview(playBtn)
-        contentView.addSubview(playImageView)
+        
+        if(recordItem?.mediaType == .Image){
+            contentView.addSubview(playImageView)
+        }
     }
 
     public required init?(coder _: NSCoder) {

+ 17 - 1
BFRecordScreenKit/Classes/RecordScreen/View/ProgressView/BFCameraProgressView.swift

@@ -146,8 +146,24 @@ class BFCameraProgressView: BFProgressBaseView {
 
             let p = CGPoint(x: progress.seconds * 70 / 5.0, y: 0)
             progressView.contentOffset = p
-            progressView.contentSize = CGSize(width: p.x + cScreenWidth, height: 50)
+//            progressView.contentSize = CGSize(width: p.x + cScreenWidth, height: 50)
+    
+            // 刷新之后的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)")
+
+                }
+            })
+            if let last = recordItem?.videoStickers.last {
+                progressView.contentSize = CGSize(width: last.timelineCMOut.seconds * 70 / 5.0 + cScreenWidth, height: 50)
+            }
+            BFLog(1, message: "insert contentSize: \(progressView.contentSize.width),offset: \(progressView.contentOffset.x)")
         }
+        
     }
     
     func changeSepline(img:UIImage){

+ 2 - 1
BFRecordScreenKit/Classes/RecordScreen/View/ProgressView/BFVideoThumbProgressView.swift

@@ -218,6 +218,7 @@ class BFVideoThumbProgressView: BFProgressBaseView {
         }
     }
 
+    //
     func appendThumb(progress: Double = 0) {
         DispatchQueue.main.async { [weak self] in
             guard let wself = self else { return }
@@ -275,7 +276,7 @@ class BFVideoThumbProgressView: BFProgressBaseView {
 
 extension BFVideoThumbProgressView: UIScrollViewDelegate {
     func scrollViewDidScroll(_ scrollView: UIScrollView) {
-        BFLog(1, message: "scrollViewDidScroll")
+//        BFLog(1, message: "scrollViewDidScroll")
         let totalW = recordItem?.mediaType == .Video ? (scrollView.contentSize.width - width) : (CGFloat(recordItem?.materialDuraion.seconds ?? 0) * thumbImageWidth / 2.0)
         if recordItem?.mediaType == .Video {
             if isDrag {